2012-01-03 17 views
3

タッチスクリーンを使用してオブジェクトの周りをカメラで回転しようとしています。 Y軸回りの回転がうまくいきます(X軸は無効です)。 X軸周りの回転は本当に奇妙です。オブジェクト(そのロケット)がより高いrocket.position().y++ & scene.camera().position.y++になると、x軸周りの回転が大きくて奇妙になります。ロケットがrocket.position().y = 500; & scene.camera().position.y = 500;で止まったら、x軸を中心に回転できず、代わりにオブジェクトをズームインまたはズームアウトします。両方の軸が地獄のように変わった。タッチを使ってオブジェクトを回転させるAndroid min3D

initScene私はロケットの中心を見るようにカメラを設定しました。

ここに私のコードです:

initScene: 
    scene.camera().position.z = 90; 
    scene.camera().target = raketeOBJ.position(); 

onTouchEvent: 
    public boolean onTouchEvent(MotionEvent me) { 
    if (me.getAction() == MotionEvent.ACTION_DOWN) { 
     xpos = me.getX(); 
     ypos = me.getY(); 
     return true; 
    } 

    if (me.getAction() == MotionEvent.ACTION_UP) { 
     xpos = -1; 
     ypos = -1; 
     touchTurn = 0; 
     touchTurnUp = 0; 
     return true; 
    } 

    if (me.getAction() == MotionEvent.ACTION_MOVE) { 
     float xd = me.getX() - xpos; 
     float yd = me.getY() - ypos; 

     xpos = me.getX(); 
     ypos = me.getY(); 

     touchTurn = xd/-200f; 
     touchTurnUp = yd/-200f; 
     return true; 
    } 

    try { 
     Thread.sleep(15); 
    } catch (Exception e) { 

    } 

    return super.onTouchEvent(me); 
} 

UpdateScene: 

    if (touchTurn != 0) { 
     scene.camera().position.rotateY(touchTurn); 
     touchTurn = 0; 
    } 

    if (touchTurnUp != 0) { 
     scene.camera().position.rotateX(touchTurnUp); 
     touchTurnUp = 0; 
    } 

答えて

0

1つのオプションは、コンテナ自体の代わりに、カメラを回転させることです。 min3dでは、モデルを表示するアクティビティのクラス変数としてObject3dContainerを使用することがよくあります。 MotionEventを取得したら、Object3dContainerクラスのrotation()メソッドを使用して、適切なxまたはyプロパティを設定できます。

0

あなたはwierdと言い続けていますが、それはあなたが見るものを説明していないことを知っています。 Rotateは実際Number3dのメソッドです。 ターゲットについてはわからないので、回転はロケットによるものではなく、中心に沿って行われると思います。

  1. 最も簡単なことは、ロケットを(0,0,0)に設定し、代わりにロケットを動かし、他のものを動かすことです。まあ、ばかげた示唆になるでしょう。忘れてください。
  2. もう一つの解決策は、sin()とcos()を使ってカメラの回転軌跡を計算することです。
  3. 3番目の解決策があるかもしれませんが、それについてはあまり考えていないかもしれません。あなたがしなければならないことは、ターゲットが(0,0,0)であるようにカメラを動かすことです。回転させてからカメラを返します。

は次のようなもののようになります。

Number3d target = scene.camera.target; 
Number3d cp = scene.camera.position.clone(); 
// move position like target is (0,0,0) 
cp.x -= target.x; 
cp.y -= target.y; 
cp.z -= target.z; 

cp.roateX(angle); 

// restore offset 
cp.x += target.x; 
cp.y += target.y; 
cp.z += target.z; 
scene.camera.position.setAllFrom(cp); 

あなたは3を試すことができますが、それは仕事をやる依存していません。

1

私はそれがビューオリエンテーション問題だと思います。基本的なアンドロイドのOpenGLの例 "回転キューブ"を試して、私はそれが同様の動作だと思います。

これを避けるには、表示座標をmin3Dオブジェクトの回転座標に変換する必要があります。

あなたの指の後に3Dオブジェクトが表示されている状態で、ディスプレイ上の1cmのディスプレイを左に動かすことを考えてみましょう。これは、x_display = x_objectを意味します。 オブジェクトを回転させると、ディスプレイとオブジェクトの間に固定接続が残っています。 (x_display = -1cm)は(x_object = -1cm)と等しくなります。
90°& 270°あなたのオブジェクトは180度でxy反転して移動します。オブジェクトはx反転します。

これを克服するためにいくつかのsin/cosを使用します。

編集:also rotationangle(object)= - 回転角(カメラ)

関連する問題