挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)不懂社区·好资源不错过·各位资源站大佬欢迎来采集搬运寻找会做《单机》游戏修改器的开发作者长期合作,价格不是问题!联系QQ:1874088565 JD寻实力长期勤快开发,来实力代理,DMA内存,项目讨论群 ██【我要租此广告位】██
查看: 4849|回复: 1
打印 上一主题 下一主题

[辅助源码] 7.FPS游戏自瞄透视之准星算法

[复制链接]

51

积分

15

主题

5

听众
已帮网友解决0 个问题
好评
0
贡献
36
海币
183
交易币
0
跳转到指定楼层
楼主
发表于 2020-6-9 20:38:34 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


7.FPS游戏自瞄透视之准星算法
任鸟飞逆向 任鸟飞逆向
知道了准星的变化规律:
1.准星水平位置摇摆角
正北是π,逆时针逐渐减小,正南是0,继续逆时针减小到正北为-π  π和-π重叠
(正北方向Y轴逐渐增加,正东方向X轴逐渐增加)
2.准星高度位置俯冲角
正上方是0.5π,正下方是-0.5π
我们就要为其写瞄准的算法了。
假设人物的坐标是:人物.fX,人物.fY,人物.fZ   目标的坐标是:怪物X,怪物Y,怪物Z。
首先我们写准星水平位置摇摆角
这个只考虑X,Y的平面即可不存在高度的问题
我们把坐标系分成四个象限来分别计算,
理论上是可以统一计算的,
但是我们为了更多没有数学基础的同学也能看懂,把其分层四种可能计算更容易理解
①如果怪物X > 人物.fX 并且 怪物Y > 人物.fY
那么怪物处在第一象限也就是我们的东北方
图中  角a   根据正切公式  等于     atan2(怪物Y-人物.fY,怪物X-人物.fX)
返回值为-π到π  ,图中第一象限范围内 就是返回值 从 π/2 到 0 ,顺时针减少
而我们朝向在第一象限是 -π 到 -π/2  顺时针增加的
我们要把我们得到的角度换算成他的变化规律 才能正确表示准星位置
所以第一步我们就要对角度取负  让其变化方向一致   都为顺时针增加
- atan2(怪物Y-人物.fY,怪物X-人物.fX) 的变化范围就成了   -π/2 到 0 顺时针增加
但是范围还是有差别
那么第二步,加上偏差的-π/2  使其变化规律相同   - atan2(怪物Y-人物.fY,怪物X-人物.fX) -π/2
这样就可以自动瞄准了。
②如果怪物X < 人物.fX 并且 怪物Y > 人物.fY
那么怪物处在第二象限也就是我们的西北方
角度依然等于 atan2(怪物Y-人物.fY,怪物X-人物.fX)
图中第二象限范围内 返回值 0 到 π/2 ,顺时针增加
第一步,和我们的范围 π/2 到 π 顺时针增加  变化方向一致,不需要取负
第二步,偏差π/2  加上即可
最终  atan2(怪物Y-人物.fY,怪物X-人物.fX)+π/2
③如果怪物X < 人物.fX 并且 怪物Y < 人物.fY
那么怪物处在第三象限也就是我们的西南方
角度依然等于 atan2(怪物Y-人物.fY,怪物X-人物.fX)
图中第三象限范围内 返回值 π/2到0 ,顺时针减少
第一步,和我们的范围 0到 π/2 顺时针增加  变化方向不一致,取负使其一致
-atan2(怪物Y-人物.fY,怪物X-人物.fX)  变成 -π/2 到0 顺时针增加
第二步,偏差π/2  加上即可
最终  -atan2(怪物Y-人物.fY,怪物X-人物.fX)+π/2
④如果怪物X > 人物.fX 并且 怪物Y < 人物.fY
那么怪物处在第四象限也就是我们的东南方
角度依然等于 atan2(怪物Y-人物.fY,怪物X-人物.fX)
图中第四象限范围内 返回值 0 到π/2 ,顺时针增加
第一步,和我们的范围  -π/2都0  顺时针增加  变化方向一致,不用取负
第二步,偏差 -π/2  加上即可
最终  atan2(怪物Y-人物.fY,怪物X-人物.fX)-π/2
然后我们写准星高度位置俯冲角
道理一样的  ,不过是分为抬头还是低头
不过这次 求正切角度的2个边不再是 怪物Y-人物.fY  和  怪物X-人物.fX
而是 怪物Z-人物.fZ 和 水平距离了
水平距离 = sqrt((怪物X-人物.fX)*(怪物X-人物.fX)+(怪物Y-人物.fY)*(怪物Y-人物.fY));
抬头情况下
俯视角 = atan2(怪物Z-人物.fZ,水平距离);
低头情况下
俯视角 =  - atan2(人物.fZ-怪物Z,水平距离);
总结代码如下:
void Call_自动瞄准(FLOAT 怪物X,FLOAT 怪物Y,FLOAT 怪物Z)
{
T人物属性 人物;
人物.初始化();
FLOAT 水平角;
if (怪物X > 人物.fX && 怪物Y > 人物.fY)//第一象限
{
水平角=(FLOAT)(- atan2(怪物Y-人物.fY,怪物X-人物.fX)-3.1415926/2);
}
if (怪物X < 人物.fX && 怪物Y > 人物.fY)//第二象限
{
水平角=(FLOAT)(atan2(怪物Y-人物.fY,人物.fX-怪物X)+3.1415926/2);
}
if (怪物X < 人物.fX && 怪物Y < 人物.fY)//第三象限
{
水平角=(FLOAT)(3.1415926/2-atan2(人物.fY-怪物Y,人物.fX-怪物X));
}
if (怪物X > 人物.fX && 怪物Y < 人物.fY)//第四象限
{
水平角=(FLOAT)(atan2(人物.fY-怪物Y,怪物X-人物.fX)-3.1415926/2);
}
FLOAT 俯视角;
FLOAT 水平距离;
水平距离 = sqrt((怪物X-人物.fX)*(怪物X-人物.fX)+(怪物Y-人物.fY)*(怪物Y-人物.fY));
if (怪物Z > 人物.fZ)
{
俯视角 = atan2(怪物Z-人物.fZ,水平距离);
}
if (怪物Z < 人物.fZ)
{
俯视角 = 0 - atan2(人物.fZ-怪物Z,水平距离);
}
DWORD 模块句柄 = (DWORD)GetModuleHandleA("Crossout.exe");
*(FLOAT*)(模块句柄 + Base_XY朝向基地址) = 水平角;   //计算出来的朝向值 写入内存
*(FLOAT*)(模块句柄 + Base_Z朝向基地址) = 俯视角;    //计算出来的朝向值 写入内存
}



逆向交流qun:453769015

                             



联系我时,请说是在 挂海论坛 上看到的,谢谢!



上一篇:老铁们来谈论一个很重要的问题
下一篇:开源 上市AX-5.0国服变态菜单
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。

93

积分

18

主题

3

听众
已帮网友解决0 个问题
好评
1
贡献
75
海币
132
交易币
0

最佳新人

沙发
发表于 2020-6-10 09:55:57 | 只看该作者
感谢大佬分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2025-5-5 03:55 , Processed in 0.132307 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

快速回复 返回顶部 返回列表