FPS游戏通用准星修正实现自瞄

FPS游戏内的十字瞄准视角其实就是一个视角摄像机这个应该不难理解吧,如何调整摄像机的视角就要用到一个叫“姿态角(Euler角)”的数据,即: yaw , pitch , roll。这3个值的解释如下:

pitch是围绕X轴旋转,也叫做俯仰角
yaw是围绕Y轴旋转,也叫偏航角
roll是围绕Z轴旋转,也叫翻滚角

用张图来解释比较直观:

FPS游戏通用准星修正实现自瞄_第1张图片

首先我们要先知道自己的Euler角值,然后就要知道目标的坐标,最后通过公式计算出需要修正的Euler角值。

下面直接给出封装好的运算函数:

#define M_PI		3.14159265358979323846
#define M_PI_F		((float)(M_PI))
#define DEF_AIMBOT_FOV	15.0f
#define DEG2RAD(x)  ( (float)(x) * (float)(M_PI_F / 180.f) )
#define RAD2DEG(x)  ( (float)(x) * (float)(180.f / M_PI_F) )


#pragma pack(push)
#pragma pack(1)

typedef struct tag_Rotator{
	float  Pitch;                                                 
	float  Yaw;  
	float  Roll;
}TROTATOR, *PROTATOR;

typedef struct tag_Vector3 {
	float x;
	float y;
	float z;
}TVECTOR3,*PVECTOR3;

#pragma pack(pop)


TROTATOR Vec2Rot(PVECTOR3 vec)
{
	TROTATOR rot;
	rot.Yaw = RAD2DEG(std::atan2f(vec->y, vec->x));
	rot.Pitch = RAD2DEG(std::atan2f(vec->z, std::sqrtf(vec->x * vec->x + vec->y * vec->y)));
	rot.Roll = 0.f;
	return rot;
}

TROTATOR Clamp(TROTATOR r){
	if (r.Yaw > 180.f)
		r.Yaw -= 360.f;
	else if (r.Yaw < -180.f)
		r.Yaw += 360.f;

	if (r.Pitch > 180.f)
		r.Pitch -= 360.f;
	else if (r.Pitch < -180.f)
		r.Pitch += 360.f;

	if (r.Pitch < -89.f)
		r.Pitch = -89.f;
	else if (r.Pitch > 89.f)
		r.Pitch = 89.f;

	r.Roll = 0.f;
	return r;
}

//参数 目标坐标,自己的坐标,自己视角
TROTATOR CalcAimToTarget(PVECTOR3 pTarPos, PVECTOR3 pLocPos, PROTATOR pLocRot){
	TVECTOR3 delta = { 0 };
	delta.x = pTarPos->x - pLocPos->x;
	delta.y = pTarPos->y - pLocPos->y;
	delta.z = pTarPos->z - pLocPos->z;
	TROTATOR ideal = Clamp(Vec2Rot(&delta));
	ideal.Pitch = ideal.Pitch - pLocRot->Pitch;
	ideal.Roll = ideal.Roll - pLocRot->Roll;
	ideal.Yaw = ideal.Yaw - pLocRot->Yaw;
	//计算出目标所需要的视角范围
	FLOAT angFOV = sqrt(angDelta.Pitch * angDelta.Pitch + angDelta.Roll * angDelta.Roll + angDelta.Yaw * angDelta.Yaw);
	//游戏中大部分玩家的FOV都是80~90这个值可用于判断视野范围内
	/*
		if (angFOV < DEF_AIMBOT_FOV){
			OOXX
		}
	*/
	//修正值
	return Clamp(ideal);
}

最后将计算结果加上自己的 Euler角值即可将准星修正到你需要的位置。

PS. 一般套路FPS模型都会有个人物骨骼列表,里面包含了模型所有关键部位的坐标。

你可能感兴趣的:(那些年我们玩过的网游)