1

私は一晩中検索していましたが、探している情報が見つからないか、たとえそれが可能であったとしても、非常に悲惨です;)

Java3D を使用していますが、ワールド空間でカメラを回転させる方法がわかりません。

私の左/右、および上/下の回転は両方ともローカル空間で発生します。つまり、左右に動かせばすべてがうまく見えるということです。しかし、90 度下を見て、次に 90 度右を見ると、すべてが横向きに見えます。

現在、私は次のことを行っています。これにより、上記の効果が得られます。

TransformGroup cam = universe.getViewingPlatform().getViewPlatformTransform();
Transform3D trfcam = new Transform3D();
cam.getTransform(trfcam);

trfcam.mul(Camera.GetT3D()); //Gets a Transform3D containing how far to rotate left/right and how far to move left/right/forward/back

trfcam.mul(Camera.GetRot()); //Gets a t3d containing how far to rotate up/down

cam.setTransform(trfcam);

別の方法として、ルートを回転させることも試しましたが、これは 0 を中心に回転するため、カメラを 0 から遠ざけるとうまくいきません。この種のことを達成する方法を教えてくれるウェブ上で利用可能なものはありますか? 私はさまざまなことを試しましたが、まったく頭に入っていないようです。私は Ogre3D でそれを達成したので、概念には精通していますが、J3D の土地の法則には慣れていません。

返信ありがとうございます:)

4

1 に答える 1

1

各軸(xとy)を中心に回転したアマウンドを保存します。たとえば、x軸を中心に回転しようとする場合は、yを中心に回転を逆にし、xを中心に回転してから、yを中心に回転をやり直します。

2番目の質問を正しく理解できているかわかりません。ビューアとモデルの変換は二重であるため、世界自体を変換することでカメラの動きをシミュレートできます。回転しているx軸とy軸を移動したくない場合は、使用しているメインのTransformGroupに別のTransformGroupを追加し、新しいTransformGroupで変換を実行します。

編集:最初の解決策は非常に遅いので、あなたがしなければならない3つの変換からTransform3Dを作ることができます:

x軸(Translate3D xrot)を中心に回転し、yを中心に回転する必要があるとします。

Translate3D yrot = new Translate3D();  
yrot.rotY(angle); 

Translate3D temp = xot; 
xrot.mul(yrot);  // Dont forget the reverse order. xrot is the previous translate 
xrot.mul(yrot);  // xrot = xrot * yrot * xrot^-1
temp.transpose();  // Get the reverse transform of the old transform
xrot.mul(temp);

yrot = xrot;  // Store it for future rotation around x axis
cam.setTransform(yrot); 

これは、行う多くの変換で同様に機能します。前に行った変換を元に戻し、変換を実行し、古い変換をやり直します。お役に立てば幸いです。

于 2011-04-14T11:16:15.967 に答える