c++ - 编写 LookAt 函数
问题描述
我目前正在尝试使用 Source SDK 在 C++ 中编写 LookAt 函数。我做了一些研究,发现了很多链接,但其中很多是关于 Unity 或 Glm 的,并且使用四元数和旋转矩阵,但我不需要这个。
所以,这是我的问题:
我在 Portal 2 中。我有一个位置坐标为 x、y、z 的目标,并且我有我的玩家的位置和他的旋转度数(偏航、俯仰、滚动)。当我使用目标坐标作为参数的函数时,我希望我的玩家看到目标。
我发现了这个:点看点,但效果不太好,最后的角度从来都不是很好。
我想是因为在 Portal 2 中,如果我参考这张图:
对于旋转,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 同质变换矩阵
正确实施查看所需的内容是:
相机位置
pos
因为这是给玩家的,所以你的位置是固定的并且是已知的......
目标位置
target
查看方向
dir
可以简单地计算为:
dir = target-pos dir /= |dir|
一些对齐方向(如向上)
这取决于您的游戏...对于基于地形的游戏,您可以使用向上矢量(如
(0,1,0)
)或法线到表面等...对于 6 个基于自由度的应用程序,您可以使用一些玩家本地矢量...小心这个对齐矢量必须不平行,dir
否则叉积后者将无法正常工作。在这种情况下,您可以选择不同的对齐向量,如 RIGHT、NORT 等。
要构造 3D 变换矩阵,您需要位置O
和 3 个基向量 ( X,Y,Z
),它们是单位且彼此垂直。位置是pos
,其中一个基向量是dir
(这取决于您正在寻找的轴,例如OpenGL通常使用的透视图-Z
)。所以你需要计算另外两个基向量。让我们考虑一下我们将在-Z
方向上查看:
-Z = dir
Z = -dir
要获得其他 2 个基向量,只需利用叉积 ...
X = cross(UP,Z)
X /= |X|
Y = cross(Z,X)
Y /= |Y|
原点只是相机位置:
O = pos
内部操作数的顺序cross
将决定结果的符号,所以如果你颠倒了某个轴,只需交换操作数......
现在只需简单地O,X,Y,Z
输入单位 4x4 矩阵。如何取决于您的引擎使用的符号。由于相机通常是倒置的(也取决于符号),然后将其倒置并得到结果矩阵。这里的OpenGL布局:
如果您需要欧拉角,请使用测角法从矩阵中提取它们......
推荐阅读
- c++ - 根据所吃食物的数量和食物类型消耗的卡路里
- r - 如何根据另一列中的相应值将值添加到新列中?
- python - 创建具有步长值的(X,Y)递增元组列表的最快方法?
- mysql - 使用 SQL 打印带订单的前 5 名 team_leaders
- python - Python Json 在带有名称的 jsonfile 中创建一个列表
- solidity - Remix Debugger 我需要重新编译吗?
- c# - 可搜索的动态组合框 WPF
- c++ - 以 union 作为方法参数
- next.js - 如何播放具有多种分辨率的 HLS 视频(m3u8 播放列表)?
- qt - 如何从 .prl 文件中构建 qt .lib 文件