方向向量到欧拉/否则

时间:2015-12-20 02:07:56

标签: math vector lwjgl quaternions euler-angles

我知道这个问题已被提出很多问题,但我没有看到满足我需求的任何答案。

我的问题在于我已经习惯于在env中进行开发,其中将矢量转换为euler角度集是简单的Vec.ToAngle,现在我需要复制它。

我目前正在使用Quaternions编写相机。 我试图将相机转到某一点,但我的结果是......很奇怪。

我通过

获取方向向量
dir = viewPos-camPos;
dir.normalize();

我通过this

将其转换为euler
float angle_H = (float)Math.atan2(dir.y,dir.x);
float angle_P = (float)Math.asin(dir.z);

Vector3f W0 = new Vector3f(-dir.y,dir.x,0);
Vector3f U0 = mul(W0,dir);

float angle_B = (float)Math.atan2(Vector3f.dot(W0,UP),Vector3f.dot(U0,UP));

然后我通过this

转换为四元数
double c1 = Math.cos(angle_H/2);
double c2 = Math.cos(angle_P/2);
double c3 = Math.cos(angle_B/2);
double s1 = Math.sin(angle_H/2);
double s2 = Math.sin(angle_P/2);
double s3 = Math.sin(angle_B/2);

viewQuat.w = (float)(c1*c2*c3 - s1*s2*s3);
viewQuat.x = (float)(s1*s2*c3 + c1*c2*s3);
viewQuat.y = (float)(s1*c2*c3 + c1*s2*s3);
viewQuat.z = (float)(c1*s2*c3 - s1*c2*s3);

最后通过this

访问AxisAngle
float w = viewQuat.w;
float w2 = (float)Math.sqrt(1-w*w);

float angle = (float)(2f*Math.acos(w));
float x = viewQuat.x/w2;
float y = viewQuat.y/w2;
float z = viewQuat.z/w2;

我在角度格式之间翻转的原因主要是因为: 我不想在后台使用四元数 欧拉是一种物理上有形的角度格式 lwjgl(OpenGL for java)

需要Axis-Angle

想法?

修改 的 事实证明我的数学是正确的,但角度确实需要调整。 Pitch,Yaw和Roll混合在一起,我认为是Pitch是Roll,而Roll是Yaw,除了Pitch = -Pitch + 90;和Roll = -Roll-90;

编辑2 我发现了更多的abit,结果我认为是Pitch and Roll更像是......在那个轴上投球。 我的“Pitch”控制Y-Z轴上的旋转,而我的“Roll”控制X-Z轴。 因此,如果我看起来正确+ Y俯仰和滚动工作很好,如果我向右看+ X滚动开关线性切换到接近+ X;

0 个答案:

没有答案