FPS游戏通用准星修正实现自瞄_自瞄的瞄准角度是什么-程序员宅基地

技术标签: 那些年我们玩过的网游  

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

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

用张图来解释比较直观:


首先我们要先知道自己的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模型都会有个人物骨骼列表,里面包含了模型所有关键部位的坐标。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yoie01/article/details/79225085

智能推荐

2023腾讯云服务器租用价格表(新版报价)_6元一年的云服务器-程序员宅基地

文章浏览阅读1.2k次。超额部分需要按照每GB流量0.8元支付流量费,需要注意的是仅仅统计公网出方向产生的流量,公网入方向的流量是免费的,一般来讲流量是够用的,大家不用担心。以上是腾讯云百科分享的2023腾讯云服务器新版报价,包括腾讯云服务器活动上轻量应用服务器收费、云服务器CVM报价,以及云服务器CVM实例CPU内存、公网带宽和系统盘官方收费标准。腾讯云服务器分为轻量应用服务器和云服务器CVM,CVM为专业级云服务器,适用于企业级如科学计算、集群应用、高容灾等使用场景;腾讯云服务器CVM标准型s5实例。腾讯云轻量应用服务器。_6元一年的云服务器

Ubuntu-18.04系统安装mongodb并开启身份验证_ubuntu docker 安装mongodb并开启安全认证-程序员宅基地

文章浏览阅读2.1k次。一、MongoDB安装1、导入公钥Ubuntu软件包管理器apt(高级软件包工具)需要软件分销商的GPG密钥来确保软件包的一致性和真实性。 运行此命令将MongoDB密钥导入到您的服务器。sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291..._ubuntu docker 安装mongodb并开启安全认证

SAP PP学习笔记04 - BOM2 -通过Serial来做简单的BOM变式配置,副明细,BOM状态,BOM明细状态,项目种类,递归BOM_根据序列号查bom-程序员宅基地

文章浏览阅读1k次,点赞14次,收藏14次。本章讲通过Serial来做简单的BOM变式配置。还讲了BOM的相关概念:副明细,BOM状态,BOM明细状态,项目种类,递归BOM 等。_根据序列号查bom

ecm工作原理 usb_USB CDC / USBnet (ECM, NCM, ACM) 转载-程序员宅基地

文章浏览阅读1.3k次。USB CDC-ACM(Abstract Control Model), CDC-ECM(Ethernet Networking Control Model), CDC-NCM (Network ControlModel), OBEX(Object Exchange) and WCM-DeviceManagement USB class and function driversCDC-ACM (A..._usb cdc-ecm

C语言复习4_c语言income-程序员宅基地

文章浏览阅读236次。局部变量于全局变量局部变量:被定义在函数的内部,它们的有效使用范围也被局限于所在的函数之内。其最大程度的确保了个函数之间的独立性。除了作用于函数的局部变量外,还有定义于复合语句中的局部变量,其有效使用范围被局限于复合语句中,一般作用于小范围的局部变量。局部变量一般定义 在函数或复合语句的开始处。int main (void){int a =1;//主函数的局部变量{int b=2;//复合语句的局部变量}...}全局变量:定义在函数外而不属于任何函数的变_c语言income

CNN典型模型及pytorch实现 —— GoogleNet_多尺度卷积代码-程序员宅基地

文章浏览阅读1.1k次。14年的冠军 model;GoogleNet(把网络结构增加到了22层)证明了用更多的卷积、更深的层次,可以得到更好的效果;但是纯粹增大网络也有一些缺点:参数太多,容易过拟合; 网络越大,计算的复杂度越大; 网络越深,越容易出现梯度消失或梯度弥散;为了在增加网络深度和宽度的同时减少参数,提出了 Inception;GoogleNet 和 AlexNet 结构的区别在于中间有好..._多尺度卷积代码

随便推点

(解读)什么是渗透测试(Penetration Testing)?-程序员宅基地

文章浏览阅读5.4w次,点赞17次,收藏128次。(解读)什么是渗透测试(Penetration Testing)? 渗透测试(Penetration Testing),也称为Pen Testing,是测试计算机系统、网络或Web应用程序以发现攻击者可能利用的安全漏洞的实践。渗透测试可以通过软件应用自动化或手动执行。无论哪种方式,该过程都包括在测试之前收集关于目标的信息,识别可能的入口点,试图闯入(虚拟的或真实的)并报告结果。 让我们..._penetration test

不懂 Zookeeper?没关系,看这篇就够了-程序员宅基地

文章浏览阅读103次。点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2019 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络..._芋道 zookeepe

Spring基于XML配置AOP_spring aop xml配置-程序员宅基地

文章浏览阅读326次。......在切面内使用来定义切点,然后在通知中使用来指定切点。切点表达式用来匹配切入的目标类和方法。目标类只能是 Spring 容器管理的类,切面只能切入 Bean 中的方法。_spring aop xml配置

【C语言回顾】数组-程序员宅基地

文章浏览阅读1.6k次,点赞32次,收藏34次。各位小伙伴,大家好!话不多说,我们直接进入正题。以下是C语言数组的讲解。以上就是小编对C语言数组的讲解。如果觉得小编讲的还可以,还请一键三连!互三必回!持续更新中~!

tf.data.Dataset函数-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏11次。函数原型tf.data.Dataset( variant_tensor)函数说明通常使用tf.data.Dataset.from_tensor_slices函数来创建一个Dataset对象,Dataset用于表示一个数据集,这个数据集是可以迭代的。from_tensor_slices函数的原型为:from_tensor_slices(tensors, name=None),该函数的作用是将tensor张量在第一个维度上切分并转换成Dataset对象,包含多个元素。还有个类似的函数from_tf.data.dataset

Windows下 VSCode配置cuda编译环境_code runner cuda编程 windows-程序员宅基地

文章浏览阅读1.6w次,点赞16次,收藏51次。Windows系统下,在Visual Studio 里配置CUDA环境网上已经有很多资料了,而在轻量级IDE VScode上编译CUDA的材料不是很多,本篇博文将简要介绍在Windows 系统下配置CUDA环境的方法。一、VScode插件 code-runner法在VScode里安装插件——coder-runner,在settings.json里添加(win10下的)"code-runner.executorMap": { "cu": "cd $dir; nvcc $fileN_code runner cuda编程 windows