我试图在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
函数。我试着找到源代码并自己实现这些函数,但我在古代文献中找不到任何记载
1条答案
按热度按时间bzzcjhmw1#
所以不管怎样,这段代码很糟糕,所以不要因为不理解它而感到太糟糕:)
好了,我们这里有一个关于四元数tbh的糟糕用法。代码生成了两个四元数,一个用于绕x轴旋转(我假设),另一个用于绕y轴旋转。
字符串
GLM中的
cross
实际上只是乘法-命名它cross
确实是非常错误的!实际上,所有这些都是将X轴和Y轴旋转组合成一个旋转:型
由于未知的原因,作者决定在这里对结果进行归一化是一个好主意。这里不需要对quat进行归一化,因为根据定义
qr_xaxis
和qr_yaxis
已经被归一化,并且两个单位四元数的quat乘积总是一个单位四元数。最后,通过组合四元数旋转m_ForwardDirection。
型
老实说,我不完全确定这段代码想做什么,但我会说,原作者对四元数工作原理的理解显然 * 不是很好 *。