gpt4 book ai didi

game-physics - 正交基四元数

转载 作者:行者123 更新时间:2023-12-04 21:27:04 25 4
gpt4 key购买 nike

我有一个沿速度矢量移动的射弹物体。我需要确保对象始终面向速度矢量的方向。此外,我使用四元数而不是矩阵来表示对象旋转。

我知道第一步是找到一个正交基:

forward = direction of velocity vector
up = vector.new(0, 1, 0)
right = cross(up, forward)
up = cross(forward, right)

我如何将基转换为旋转四元数?

解决方案

请注意,我想感谢 Noel Hughes 提供的答案,但我想用我自己的经历来澄清一下。伪代码如下:
   vec3 vel = direction of velocity vector
vec3 forward = (1, 0, 0) // Depends on direction your model faces. See below.
vec3 axis = cross(forward, vel)
if (axis == 0) then quit // Already facing the right direction!
axis = normalize(axis)
float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
quat result = (0, axis.y * sin(theta/2), axis.z * sin(theta/2), cos(theta/2)

四元数的最后一个元素是标量部分,前三个元素是虚部。此外,上面的伪代码假设您在“模型空间”中的对象指向正 x 轴。就我而言,对象实际上指向正 y 轴,在这种情况下,我进行了以下更改:
   vec3 vel = direction of velocity vector
vec3 forward = (0, 1, 0) // Note that y-component is now 1
vec3 axis = cross(forward, vel)
if (axis == 0) then quit
axis = normalize(axis)
float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
quat result = (axis.x * sin(theta/2), 0, axis.z * sin(theta/2), cos(theta/2)
// Note that SECOND component above is now 0

最佳答案

我假设您不关心弹丸的方向,除了使纵轴与速度矢量对齐,并且纵轴是 (1, 0, 0) 的 x 轴。

你走在正确的轨道上。将速度向量归一化,(vx, vy, vz)/sqrt(vx^2 + vy^2 + vz^2) 与它交叉 x 轴并归一化结果 - (0, yn, zn) - 这是旋转四元数的轴。旋转角度只是 theta = vx/sqrt(vx^2 + vy^2 + vz^2) 的反余弦。结果四元数是

(0, yn, zn)sn(theta/2) cos(theta/2)

如果您有任何问题,请告诉我。

诺埃尔·休斯
nhughes1ster@gmail.com

关于game-physics - 正交基四元数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1620130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com