我目前正在尝试使用 Source SDK 用 C++ 编写 LookAt 函数。 我做了一些研究,发现了很多链接,但其中很多都是关于 Unity 或 Glm 的,并且使用了四元数和旋转矩阵,但我不需要这个。
所以,这是我的问题:
我在 Portal 2 中。我有一个位置坐标为 x、y、z 的目标,并且我有我的玩家的位置和他的旋转角度(偏航、俯仰、滚动)。当我使用以目标坐标作为参数的函数时,我希望我的玩家能够查看目标。
我发现了这个:Point look at Point但效果不太好,最终的角度从来都不好。
我认为这是因为在 Portal 2 中,如果我引用 this image :
对于旋转,偏航轴对应于游戏中的 y 坐标,俯仰轴对应于 z 轴(从玩家的后到前),滚动轴对应于 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
正确实现look at需要的是:
相机位置
pos
因为这是针对玩家的,所以你的位置是固定且已知的......
目标位置
target
查看方向
dir
可以简单地计算为:
dir = target-pos dir /= |dir|
某些对齐方向(如向上)
这取决于您的游戏...对于基于地形的游戏,您可以使用 UP vector (如
(0,1,0)
)或垂直于表面等...对于基于 6 DOF 的应用程序,您可以使用一些玩家本地 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 布局:
如果您需要欧拉角,请使用测角法从矩阵中提取它们......
关于c++ - 编写 LookAt 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53143175/