c++ - 编写 LookAt 函数

标签 c++ math 3d camera

我目前正在尝试使用 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需要的是:

  1. 相机位置 pos

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

  2. 目标位置 target

  3. 查看方向 dir

    可以简单地计算为:

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

    这取决于您的游戏...对于基于地形的游戏,您可以使用 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 布局:

OpenGL matrix layout

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

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

相关文章:

C++ 将大数转换为十六进制

java - Python scipy.optimize.leastsq 到 Java org.apache.commons.math3.fitting.leastsquares

r - R 中 if-else 中的逻辑运算符

javascript - 我不知道 jquery 可能出了什么问题?

javascript - Three.js 跨多个面的渐变

c++ - 使用 Boost.Lockfree 队列比使用互斥锁慢

java - 在 JNA 中定义 HGlobal

c++ - OpenCV 中的 Matlab fft2 函数

python - 如何在 Sage Math 中使用 Scheme 而不是 Python

c++ - gluProject() 的奇怪结果