gpt4 book ai didi

java 3D 四元数旋转

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:10 24 4
gpt4 key购买 nike

我有这种使用四元数在 3D 中旋转点的方法,但它似乎无法正常工作:

    public static ArrayList<Float> rotation3D(ArrayList<Float> points, double angle, int xi, int yi, int zi)
{
ArrayList<Float> newPoints = new ArrayList<>();

for (int i=0;i<points.size();i+=3)
{
float x_old = points.get(i);
float y_old = points.get(i+1);
float z_old = points.get(i+2);

double w = Math.cos(angle/2.0);
double x = xi*Math.sin(angle/2.0);
double y = yi*Math.sin(angle/2.0);
double z = zi*Math.sin(angle/2.0);

float x_new = (float) ((1 - 2*y*y -2*z*z)*x_old + (2*x*y + 2*w*z)*y_old + (2*x*z-2*w*y)*z_old);
float y_new = (float) ((2*x*y - 2*w*z)*x_old + (1 - 2*x*x - 2*z*z)*y_old + (2*y*z + 2*w*x)*z_old);
float z_new = (float) ((2*x*z + 2*w*y)*x_old + (2*y*z - 2*w*x)*y_old + (1 - 2*x*x - 2*y*y)*z_old);

newPoints.add(x_new);
newPoints.add(y_new);
newPoints.add(z_new);
}

return newPoints;
}

如果我进行此调用 rotation3D(list, Math.toRadians(90), 0, 1, 0);,其中 points(0,0,10),则输出为 (-10.0, 0.0, 2.220446E-15),但它应该是 (-10,0,0),对吗?有人可以看一下我的代码并告诉我是否有问题吗?

这里有 4 个屏幕,代表我的对象的初始位置,以及 3 个 -90 度的旋转(该对象没有正确绘制,这是一个 GL 问题,我稍后会处理):

initial position first rotation second rotation third rotation

最佳答案

我没有研究过代码,但你从中得到的结果是正确的:假设是左手坐标系,当你将点 (0,0,10) 绕 y 轴(即 (0,1,0))旋转 90 度时,你最终会得到 (-10,0,0)。

如果你的坐标系是右手坐标系,我认为你必须反转角度的符号。

关于java 3D 四元数旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9892400/

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