gpt4 book ai didi

c++ - 编写 LookAt 函数

转载 作者:行者123 更新时间:2023-11-28 04:30:11 26 4
gpt4 key购买 nike

我目前正在尝试使用 Source SDK 在 C++ 中编写一个 LookAt 函数。我做了一些研究,发现了很多链接,但其中很多都是关于 Unity 或 Glm 的,并且使用的是四元数和旋转矩阵,但我不需要这些。

所以,这是我的问题:
我在 Portal 2 中。我有一个位置坐标为 x、y、z 的目标,我有我的玩家的位置和他的旋转度数(偏航、俯仰、滚动)。当我使用以目标坐标作为参数的函数时,我希望我的播放器注视目标。
我发现这个:Point look at Point但效果不是很好,最后的角度从来都不是很好。

我认为这是因为在 Portal 2 中,如果我引用 this image :
对于旋转,yaw轴对应游戏中的y坐标,pitch是z轴(从玩家的后到前),roll是x轴。

翻译:
图片的z轴对应游戏中的z轴,y为x轴,x轴为y轴。

我很难根据自己的需要调整在互联网上找到的代码。
你能帮我吗?

提前谢谢你。

我目前的代码是这个:

float xdistance = pos.x - target.x;
float ydistance = pos.y - target.y;
float zdistance = pos.z - target.z;
float xzdistance = sqrtf(xdistance * xdistance + zdistance * zdistance);

//Final angle:
QAngle a = { RAD2DEG((atan2f(ydistance, zdistance))), RAD2DEG(-(atan2f(xdistance, zdistance))), 0 };

最佳答案

我假设你想要的相机是 4x4 homogenous transform matrix

要正确实现 View ,您需要做的是:

  1. 相机位置pos

    因为这是给玩家的,所以你的位置是固定的并且是已知的......

  2. 目标位置target

  3. 查看方向dir

    可以简单地计算为:

     dir = target-pos
    dir /= |dir|
  4. 一些对齐方向(如向上)

    这取决于您的游戏...对于基于地形的游戏,您可以使用 UP vector (如 (0,1,0))或垂直于表面等...对于基于 6 DOF 的游戏apps 你可以使用一些播放器本地 vector ... 注意这个对齐 vector 不能平行于 dir 否则后者的叉积将无法正常工作。在这种情况下,您可以选择不同的对齐 vector ,如 RIGHT、NORT 等。

要构建 3D 变换矩阵,您需要位置 O 和 3 个基 vector (X,Y,Z),它们是单位且彼此垂直。位置是 pos,其中一个基本 vector 是 dir(这取决于您寻找的是哪个轴,例如 OpenGL 通常使用 -Z)。所以你需要的是计算另外两个基 vector 。让我们考虑一下我们将在 -Z 方向上查看:

-Z =  dir
Z = -dir

要获得其他 2 个基 vector ,只需利用叉积 ...

X = cross(UP,Z)
X /= |X|
Y = cross(Z,X)
Y /= |Y|

原点就是相机位置:

O = pos

cross 中操作数的顺序将决定结果的符号,因此如果您反转某个轴,只需交换操作数 ...

现在只需将 O,X,Y,Z 馈入 4x4 矩阵单元即可。如何取决于您的引擎使用的符号。由于相机通常是倒置的(也取决于符号),然后将其倒置并得到结果矩阵。这里的 OpenGL 布局:

OpenGL matrix layout

如果您需要欧拉角,请使用测角法从矩阵中提取它们...

关于c++ - 编写 LookAt 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53143175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com