JavaFX 8转换为俯仰,偏航和侧倾旋转角度

莫夫·卡拉斯特(Moff Kalast)

该线程实现答案,我有这段代码将deltayaw,deltaroll和deltapitch角度转换为一个角度并围绕该角度旋转一个节点。角度作为参数是角度的瞬时变化,因为给出整个角度将忽略方向的变化。

    public static void matrixRotate(Group n, double deltaroll, double deltapitch, double deltayaw){    
    double A11 = Math.cos(deltaroll)*Math.cos(deltayaw);
    double A12 = Math.cos(deltapitch)*Math.sin(deltaroll)+Math.cos(deltaroll)*Math.sin(deltapitch)*Math.sin(deltayaw);
    double A13 = Math.sin(deltaroll)*Math.sin(deltapitch)-Math.cos(deltaroll)*Math.cos(deltapitch)*Math.sin(deltayaw);
    double A21 =-Math.cos(deltayaw)*Math.sin(deltaroll);
    double A22 = Math.cos(deltaroll)*Math.cos(deltapitch)-Math.sin(deltaroll)*Math.sin(deltapitch)*Math.sin(deltayaw);
    double A23 = Math.cos(deltaroll)*Math.sin(deltapitch)+Math.cos(deltapitch)*Math.sin(deltaroll)*Math.sin(deltayaw);
    double A31 = Math.sin(deltayaw);
    double A32 =-Math.cos(deltayaw)*Math.sin(deltapitch);
    double A33 = Math.cos(deltapitch)*Math.cos(deltayaw);

    double d = Math.acos((A11+A22+A33-1d)/2d);
    if(d!=0d){
        double den=2d*Math.sin(d);
        Point3D p= new Point3D((A32-A23)/den,(A13-A31)/den,(A21-A12)/den);
        Rotate r = new Rotate();
        r.setAxis(p);
        r.setAngle(Math.toDegrees(d));
        n.getTransforms().add(r);
        Transform all = n.getLocalToSceneTransform();
        n.getTransforms().clear();
        n.getTransforms().add(all);               
    }
}

(我正在使用旋转,因为我需要始终围绕原点而不是中心旋转对象)

现在,这将产生一个问题,因为我不再能够获得实际的俯仰角,横滚角和偏航角。

我曾经这样跟踪它们(它没有考虑方向的变化):

roll +=deltaroll;
pitch += deltapitch;
yaw += deltayaw;

之后我提出了这个方法,它的精度更高一些,但是并没有跟踪如果不直接修改角度(插入到主n.getTransforms()。add(all)之后)而发生的变化。片段):

roll+= Math.toDegrees(d)*((A32-A23)/den);
pitch += Math.toDegrees(d)*((A13-A31)/den);
yaw += Math.toDegrees(d)*((A21-A12)/den);  

我一直在寻找解决方案,并找到了这个答案该答案应该可以从最终转换中得出角度,但我无法使其在所有角度都能正常工作。

double xx = n.getLocalToSceneTransform().getMxx();
double xy = n.getLocalToSceneTransform().getMxy();
double roll = Math.atan2(-xy, xx);

再次,我想要获得的是相对于场景的coodrdate系统的全角度(由不同方向的delta角度所构成的变换合成)。我真的很不好,所以所有帮助都会很棒。

何塞·佩雷达(Jose Pereda)

如果要在几次旋转后的任何阶段获取俯仰角,偏航角和侧倾角,可以从3D模型的变换矩阵中获取它们。

如果旋转几下后看一下转换矩阵:

Transform T = model3D.getLocalToSceneTransform();
System.out.println(T);

您会看到以下内容:

Transform [
        0.9034731871219395, -0.4260296991535005, -0.04727468234587054, 1.4044414829046357
        0.3743586809560477, 0.837958815679334, -0.39709016761704913, 0.5234811188037405
        0.2087864414768669, 0.3410626315861443, 0.9165612381019399, -1.1277640590168572
    ]

如果需要角度,则只需要将此矩阵与此答案中的矩阵进行比较

矩阵

如前所述,要获得侧倾角,可以使用T.getMxx()T.getMyx()

double roll = Math.atan2(-T.getMyx(),T.getMxx());

现在,对于音高,您可以以相同的方式使用T.getMzy()T.getMzz()

double pitch = Math.atan2(-T.getMzy(),T.getMzz());

最后,偏航,使用T.getMzx()T.getMzy()以及T.getMzz()

double yaw = Math.atan2(T.getMzx(),Math.sqrt(T.getMzy()*T.getMzy()+T.getMzz()*T.getMzz()));

对于上面的矩阵,这将为您提供所需的角度(以弧度为单位):

roll: -0.39281984604895126
pitch: -0.356235553820928
yaw: 0.21033388848106072

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章