c++ 计算“注视”旋转矢量

dw1jzc5e  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(130)

我已经有了一些使用glm函数lookat的代码,以便将相机指向目标(这是第三人称追逐相机之类的东西)。
这个很好用,但我需要稍微不同的形式。
glm::lookat函数的问题是,你给它提供一个眼睛位置向量,目标位置向量,然后是“向上”旋转向量,它会吐回一个完整的矩阵。
但是我只需要旋转向量--方向--从摄像机看目标的位置,我需要输出一个vec3旋转向量,而不是一个完整的mat4矩阵。
原因是,如果你想知道的话,我已经有了类--用于场景中的对象--存储位置向量和旋转向量,然后当你需要矩阵时,你可以调用getMatrix()
这只是我的代码工作的一般方式,我想让相机在相同的基础上工作。但我需要一个版本的lookat,只是设置旋转矢量来查看目标(相同的输入-相机位置矢量,目标位置矢量,“向上”矢量-但输出旋转矢量,而不是一个完整的4x 4矩阵)。
从位置和旋转创建矩阵是稍后发生的一个单独的阶段(我没有提到缩放,因为到目前为止,在我的代码中,它基本上总是1.0)。
我想我需要的是lookat的一个版本,它接受相同的输入,但输出是vec3旋转矢量。
只是Angular ,而不是完全组成的4x 4矩阵,所有的东西都在里面(因为试图从这样一个矩阵中提取所有的东西将是一个比直接计算我想要的更困难的问题)。
编辑:为了更精确,我编写了一些代码(例如为了可读性内联,实际上将.h和.cpp分开):

class Entity
{
    protected:
        glm::vec3    position;
        glm::vec3    orientation;
        glm::vec3    scale;

    public:
        Entity(void)
        {
            position = glm::vec3(0.0, 0.0, 0.0);
            orientation = glm::vec3(0.0, 0.0, 0.0);
            scale = glm::vec3(1.0, 1.0, 1.0);
        }

        void setPosition(glm::vec3 nposition)
        {
            position = nposition;
        }

        void setOrientation(glm::vec3 norientation)
        {
            orientation = norientation;
        }

        glm::mat4 getMatrix(void)
        {
            glm::mat4 matrix = glm::mat4(1.0);
            matrix = glm::translate(matrix, position);
            matrix = glm::rotate(matrix, orientation.x, glm::vec3(1.0, 0.0, 0.0));
            matrix = glm::rotate(matrix, orientation.y, glm::vec3(0.0, 1.0, 0.0));
            matrix = glm::rotate(matrix, orientation.z, glm::vec3(0.0, 0.0, 1.0));
            matrix = glm::scale(matrix, scale);

            return matrix;
        }
};

其思想是游戏逻辑设置/操作实体的位置和方向,但是为了渲染,我们调用getMatrix,然后getMatrix提供glm::mat4
目前,相机不是Entity,我只是直接使用glm::lookat来获得渲染矩阵。但是我想将相机作为一个实体包含进来,但是为了使它适合这个方案,我需要将它分解成同样的两个阶段过程。
设置名为orientationglm::vec3来查看目标点(带有一个特定的“up”向量)--相机的位置已经存储在类中--这样,当我稍后调用getMatrix进行渲染时,我会得到与glm::lookat相同的glm::mat4

w3nuxt5m

w3nuxt5m1#

视图矩阵的方向是4x4视图矩阵的左上3x3,这可以通过从glm::ma4构造glm::mat3来获得:

glm::mat4 view = glm::lookAt(eye, target, upVector);
glm::mat3 viewR = glm::mat3(view);

视图矩阵从世界空间转换到视图空间。因此,它是确定相机方向和位置的矩阵的逆矩阵。如果您想要相机方向的3x3矩阵,您需要获得inverse矩阵:

glm::mat3 viewR = glm::mat3(view);
glm::mat3 cameraR = glm::inverse(viewR);

给定相机位置(eye)、相机目标(target)和上向量(upVector),可以在右手系统中计算取向矩阵,其中x轴在左边,y轴是上向量,z轴是视线的相反方向上的点,如下:

glm::vec3 zAxis = glm::normalize(eye - target);
glm::vec3 xAxis = glm::normalize(glm::cross(upVector, zAxis));
glm::vec3 yAxis = glm::cross(zAxis, xAxis);
glm::mat3 cameraR = glm::mat3(xAxis, yAxis, zAxis);

相关问题