首页 > 解决方案 > 编写 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 };

标签: c++math3dcamera

解决方案


我假设你想要的相机是一个4x4 同质变换矩阵

正确实施查看所需的内容是:

  1. 相机位置pos

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

  2. 目标位置target

  3. 查看方向dir

    可以简单地计算为:

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

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

OpenGL矩阵布局

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


推荐阅读