9

したがって、JavaFX でオブジェクトを回転させるためにこれまで使用してきた方法は、3 つのグループにレイヤー化することでした。それぞれに Rotate がアタッチされ、次のように 1 つの軸にロックされています。

    Rotate heading, roll, pitch;
    Group normalrotate, rollrotate, verticalrotate;

    heading.setAxis(new Point3D(0,1,0));
    normalrotate.getTransforms().add(heading);

    roll.setAxis(new Point3D(0,0,1));
    rollrotate.getTransforms().add(roll);

    pitch.setAxis(new Point3D(1,0,0));
    verticalrotate.getTransforms().add(pitch);

オブジェクトを回転させる必要があるたびに setAngle() を実行しました。これは、ピッチも必要であると判断するまで、ヘディングとロールのみで非常にうまく機能しました。現在、OpenGL の多くのチュートリアルでは、これらのタイプの回転には回転行列または四元数が最適であると述べていますが、javadoc にはこれに関する有用なデータがありません。

例: オブジェクトを y 軸で 180 度回転するとどうなりますか (実際には透明な青で何が起こるべきでしたか) ここに画像の説明を入力 何か足りないのですか? すべての助けをいただければ幸いです。

4

2 に答える 2

13

これらすべてのチュートリアルが回転行列を指し示しているのには理由があります。3D では、同時に回転を 1 つずつ実行することはできず、一度に実行する必要があります。JavaFX は 1 つの角度と 1 つの軸のみを使用するため、1 つの角度と 1 つの軸だけで 3 つの軸上の 3 つの回転を変換する方法を提供する必要があります。

少し前に、Leap Motion を使用して手の 3 つの回転 (ピッチ、ヨー、ロール) を取得して 3D モデルを回転させるというブログ記事で、これらの操作の背後にあるすべての数学について説明しました。

基本的に、ピッチ (X 軸周り)、ヨー (Y 軸周り)、ロール (Z 軸周り) の 3 つの回転から、次の行列が得られます。

行列

それらを組み合わせると、1 つのマトリックスができます。

マトリックス

これ以上の説明はありませんが、角度と回転の単位軸成分は次の式から計算できます。

固有値

次のように記述できます。

private void matrixRotateNode(Node n, double alf, double bet, double gam){
    double A11=Math.cos(alf)*Math.cos(gam);
    double A12=Math.cos(bet)*Math.sin(alf)+Math.cos(alf)*Math.sin(bet)*Math.sin(gam);
    double A13=Math.sin(alf)*Math.sin(bet)-Math.cos(alf)*Math.cos(bet)*Math.sin(gam);
    double A21=-Math.cos(gam)*Math.sin(alf);
    double A22=Math.cos(alf)*Math.cos(bet)-Math.sin(alf)*Math.sin(bet)*Math.sin(gam);
    double A23=Math.cos(alf)*Math.sin(bet)+Math.cos(bet)*Math.sin(alf)*Math.sin(gam);
    double A31=Math.sin(gam);
    double A32=-Math.cos(gam)*Math.sin(bet);
    double A33=Math.cos(bet)*Math.cos(gam);

    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);
        n.setRotationAxis(p);
        n.setRotate(Math.toDegrees(d));                    
    }
}

alfロール、ピッチbetgamヨーです。

完全なプロジェクトはここにあります

于 2015-05-10T00:34:07.810 に答える
1

解決策を提供できます。しかし、それは少し文明化されておらず、推奨されない慣行かもしれません。

Node[] my3dModel = get3DModel();//the method creates a mesh (I suppose that you used Interactive mesh, but it's not important here)
Pane paneForMyModel = new Pane();
paneForMyModel.getChildren.addAll(my3dModel);//you add your model to this pane
//and now
paneForMyModel.getTransforms().add(new Rotate(angle, axis));
于 2019-05-29T16:47:48.140 に答える