2016-10-29 9 views
1

私はすべてのシーンオブジェクトが.objファイル(それらはBlenderからエクスポートされる)からロードされるアプリケーションを持っています。そして、私はこのオブジェクトの1つを特定のポイントの周りに回転させる必要があります。私は回転する必要があること、Java3Dの特定の点を中心に回転

public void rotateTo() { 
    // translate to origin, rotate, translate back 

    Vector3f origin = new Vector3f(); 
    Vector3f pivot = new Vector3f(.0f, .5f, .0f); 

    this.getTransform(this.transform); 
    this.transform.get(origin); 

    double angle = -Math.PI/2; 
    double newX = origin.getX() + Math.cos(angle) * (pivot.getX() - origin.getX()) - Math.sin(angle) * (pivot.getY() - origin.getY()); 
    double newY = origin.getY() + Math.sin(angle) * (pivot.getX() - origin.getX()) + Math.cos(angle) * (pivot.getY() - origin.getY()); 

    this.transform.set(new Vector3f((float)newX, (float)newY, .0f), 0.15f); 
    this.setTransform(this.transform); 

    this.transform.set(origin, 0.15f); 
    this.setTransform(this.transform); 

} 

thisTransformGroupオブジェクトを指し、this.transformTransform3Dオブジェクトを参照:現在、私は次のコードを持っています。

しかし、この方法は期待通りに機能しません。私もthisthisのソリューションを試しましたが、私のためにも機能しませんでした。

おそらく、GeometryArrayの助けを借りてこの操作を実行しようとしていますが、これを行う方法を理解できません。また、原点を変えてオブジェクトをエクスポートしようとすることもできますが、それはクリーンな解決策ではないと思います。コードで正しい位置に移動する必要があるからです。ここで

は私のオブジェクトです:

object

私は緑の点の周りに回転させるようにしようとしているが、すべてのケースでは、赤い点を中心に回転し、または全く回転しない、または一部に変換します回転なしの点。

P.S. Java3Dは古いライブラリであり、より強力なツールを使用することができますが、私の大学教授の要件であり、使用を拒否することはできません。

答えて

1

変換の構成は、行列乗算を使用して行うことができます。下の例は、X軸の周りを180度回転させ、ピボットを頂面の中心に持つ例です。

質問に記載されている3つのステップがあります。ピボットが原点にあり、回転し、元に戻すように翻訳する。どのようなことが起こっているかを見るためのステップをコメントアウトしてください。

  • すべての手順をコメントアウトして、赤い面を前方に向けてボックスが中央に表示されます。

  • 最初のステップのコメントを外します。ボックスが下に移動し、その上端が画面の中央に表示されます。

  • 第2ステップのコメントを外します。ボックスはX軸(ボックスの上部を通る左右の軸)を中心に回転します。緑色の面が前方を向くようになり、ボックスの下端が画面の中央に表示されます。

  • 第3ステップのコメントを外します。ボックスが上に移動し、全体的な効果は、それがその上面を介して左右軸の周りを回転することである。

Vは、Java 3DでのT *のVとして定義されるベクトルに変換Tのアプリケーションなので、2つの変換の組成TUT最初に行われ、Uが実行されます。U * Tです。順序が逆になっていることに注意してください。一般に、変換T1T2の組成物は、...、TnのT1が最初に行われ、Tnのが最後に行われる場合テネシー* ... * T2 * T1

これは、次のパターンを使用してJava 3Dで表現することができる。このようTransform3D.set(Vector3d,double)TransformGroup.setTransform()など

Transform3D t1 = ..., t2 = ..., t3 = ...; 
// first do t1, then t2, then t3 
Transform3D all = new Transform3D(); // all = identity 
all.mul(t1, all); // all = t1 * all 
all.mul(t2, all); // all = t2 * all 
all.mul(t3, all); // all = t3 * all 
// now all == t3 * t2 * t1 

方法は、既存の変換を上書きするのではなく、あなたのコードが動作しない理由の一つである、それを構成します。

私は記事http://www.developer.com/java/other/article.php/3717101/Understanding-Transforms-in-Java-3D.htmが役に立ちました。

// based on http://www.java3d.org/starting.html 
import com.sun.j3d.utils.geometry.ColorCube; 
import com.sun.j3d.utils.universe.SimpleUniverse; 
import javax.media.j3d.*; 
import javax.vecmath.*; 

public class Demo 
{ 
    public Demo() { 
    SimpleUniverse universe = new SimpleUniverse(); 
    BranchGroup group = new BranchGroup(); 
    group.addChild(createModel()); 
    universe.getViewingPlatform().setNominalViewingTransform(); 
    universe.addBranchGraph(group); 
    } 

    Node createModel() { 
    double radius = 0.3; 
    ColorCube cube = new ColorCube(radius); 
    // rotation of cube about the center of the top face 
    // i.e. the point (x=0, y=radius, z=0) 
    Transform3D transform = new Transform3D(); 
    // step 1: translate cube down so that (0, radius, 0) is at the origin 
    Transform3D translate1 = new Transform3D(); 
    translate1.setTranslation(new Vector3d(0.0, -radius, 0.0)); 
    transform.mul(translate1, transform); 
    // step 2: rotate cube about X axis by 180 degrees 
    Transform3D rotate = new Transform3D(); 
    rotate.rotX(Math.PI); 
    transform.mul(rotate, transform); 
    // step 3: translate cube back up 
    Transform3D translate2 = new Transform3D(); 
    translate2.setTranslation(new Vector3d(0.0, +radius, 0.0)); 
    transform.mul(translate2, transform); 
    // create a TransformGroup 
    TransformGroup tg = new TransformGroup(); 
    tg.setTransform(transform); 
    tg.addChild(cube); 
    return tg; 
    } 

    public static void main(String[] args) { 
    new Demo(); 
    } 
} 
+0

大変ありがとうございます。私は逃してしまった、 'set ...'メソッドは既存の変換を上書きする。 – vanelizarov

関連する問題