rust GLM如何实现四元数交叉和归一化?

7fhtutme  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(112)

我试图在Rust中遵循TheCherno的光线跟踪系列(目前在Episode 6上),但我遇到了一个数学障碍。我不确定该如何处理这段代码:

if (delta.x != 0.0f || delta.y != 0.0f)
    {
        float pitchDelta = delta.y * GetRotationSpeed();
        float yawDelta = delta.x * GetRotationSpeed();

        glm::quat q = glm::normalize(glm::cross(glm::angleAxis(-pitchDelta, rightDirection),
            glm::angleAxis(-yawDelta, glm::vec3(0.f, 1.0f, 0.0f))));
        m_ForwardDirection = glm::rotate(q, m_ForwardDirection);

        moved = true;
    }

字符串
GLM如何允许四元数的交叉和归一化?我对这个概念很陌生,但它在数学上似乎并不合理。我试图用Rust重写这段代码,使用cgmath crate,但没有对应的GLM函数。我试着找到源代码并自己实现这些函数,但我在古代文献中找不到任何记载

bzzcjhmw

bzzcjhmw1#

所以不管怎样,这段代码很糟糕,所以不要因为不理解它而感到太糟糕:)
好了,我们这里有一个关于四元数tbh的糟糕用法。代码生成了两个四元数,一个用于绕x轴旋转(我假设),另一个用于绕y轴旋转。

auto qr_xaxis = glm::angleAxis(-pitchDelta, rightDirection);
auto qr_yaxis = glm::angleAxis(-yawDelta, glm::vec3(0.f, 1.0f, 0.0f);

字符串
GLM中的cross实际上只是乘法-命名它cross确实是非常错误的!实际上,所有这些都是将X轴和Y轴旋转组合成一个旋转:

glm::quat q = qr_xaxis * qr_yaxis;


由于未知的原因,作者决定在这里对结果进行归一化是一个好主意。这里不需要对quat进行归一化,因为根据定义qr_xaxisqr_yaxis已经被归一化,并且两个单位四元数的quat乘积总是一个单位四元数。
最后,通过组合四元数旋转m_ForwardDirection。

m_ForwardDirection = glm::rotate(q, m_ForwardDirection);


老实说,我不完全确定这段代码想做什么,但我会说,原作者对四元数工作原理的理解显然 * 不是很好 *。

相关问题