gpt4 book ai didi

java - 使用四元数旋转模型

转载 作者:行者123 更新时间:2023-12-01 17:18:10 27 4
gpt4 key购买 nike

我已经找到了很多解决此问题的解决方案,但似乎都不起作用。

我正在使用 JBullet 库并检索对象方向,它以四元数形式给出。我如何从这个四元数中检索欧拉值,以便我可以调用..?

glRotate(rotationX, 1, 0, 0);
glRotate(rotationY, 0, 1, 0);
glRotate(rotationZ, 0, 0, 1);

或者也许有更有效的方法?

编辑:

我尝试过quat -> vec

public static Vector3f quatToVec(Quat4f q) {
float x = q.x;
float y = q.y;
float z = q.z;
float w = q.w;
float roll = (float) (Math.atan2(2*y*w - 2*x*z, 1 - 2*y*y - 2*z*z) / Math.PI * 360);
float pitch = (float) (Math.atan2(2*x*w - 2*y*z, 1 - 2*x*x - 2*z*z) / Math.PI * 360);
float yaw = (float) (Math.asin(2*x*y + 2*z*w) / Math.PI * 720);
return new Vector3f(yaw, pitch, roll);
}

我尝试过quat -> 旋转矩阵

public static FloatBuffer quatToMatrix(Quat4f q) {
float qx = q.x;
float qy = q.y;
float qz = q.z;
float qw = q.w;
FloatBuffer fb = BufferUtils.createFloatBuffer(16);
fb.put(new float[]{1.0f - 2.0f*qy*qy - 2.0f*qz*qz, 2.0f*qx*qy - 2.0f*qz*qw, 2.0f*qx*qz + 2.0f*qy*qw, 0.0f,
2.0f*qx*qy + 2.0f*qz*qw, 1.0f - 2.0f*qx*qx - 2.0f*qz*qz, 2.0f*qy*qz - 2.0f*qx*qw, 0.0f,
2.0f*qx*qz - 2.0f*qy*qw, 2.0f*qy*qz + 2.0f*qx*qw, 1.0f - 2.0f*qx*qx - 2.0f*qy*qy, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f});
fb.flip();
return fb;
}

但似乎都不起作用

最佳答案

您发布的第二个解决方案更可取,因为欧拉角在 +/- 90 度俯仰角处存在奇点(在其他领域称为万向节锁)。

你现在最大的障碍是你的矩阵出于某种原因是行优先的。由于这是通用的 FloatBuffer而不是实际的矩阵类,当您执行 fb.put (...) 时,您可能必须自己转置矩阵.

这应该可以解决问题:

fb.put(new float[] {1.0f - 2.0f*qy*qy - 2.0f*qz*qz, 2.0f*qx*qy + 2.0f*qz*qw,        2.0f*qx*qz - 2.0f*qy*qw,        0.0f,
2.0f*qx*qy - 2.0f*qz*qw, 1.0f - 2.0f*qx*qx - 2.0f*qz*qz, 2.0f*qy*qz + 2.0f*qx*qw, 0.0f,
2.0f*qx*qz + 2.0f*qy*qw, 2.0f*qy*qz - 2.0f*qx*qw, 1.0f - 2.0f*qx*qx - 2.0f*qy*qy, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f});

关于java - 使用四元数旋转模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20599180/

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