Java3D アニメーションについて

このQ&Aのポイント
  • Java3DのRotationInterpolatorを使用して、Y軸を中心とした回転を行います。
  • 物体をX軸を中心に20°程回転させ、かつY軸を中心に1回転させることができます。
  • クォータニオンを使用することで、具体的な回転角度の例も示されています。
回答を見る
  • ベストアンサー

Java3D アニメーション

java3DのRotationInterpolatorにおいてはY軸を中心とした回転を行ってくれますよね。「私が行いたいことは、物体をX軸を中心に20°程回転させ、かつY軸を中心に1回転させるというもの」です。 axisOfTransformを使うとアニメーションが始まる前にX軸を中心に20°程回転している(つまりアニメーションが始まる前にX軸が20°程回転した新しい回転軸が作られてしまいますよね。)そうではなく、 「アニメーション開始後、物体がX軸を中心に20°程回転し、Y軸を中心に1回転するというものを作りたいです」 クォータニオンを使用するのが良いのでしょうか。その場合は、本(やさしくわかるJava3Dのp148)のinterpolate(Quat4d q1,Quat4d q2,double alpha)等が使用できそうなのですが、どう使えば良いのでしょうか?q1に10°、q2に360°など具体的な例で教えて下されば幸いです。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

以前の回答で述べたとおり、RotationInterpolatorでX軸について回転することはできます。コンストラクタ引数もしくはメソッドsetTransformAxis()で回転軸を設定できます。 >初期画面から座標軸が傾いた状態になってしまいます ルート - 回転A - 回転B - 物体 というシーングラフと、 ルート - 回転B - 回転A - 物体 というシーングラフでは結果が異なりますが、そういうことでしょうか?変換行列は一般的に交換法則は満たしません。 あと以前の回答で書くのを忘れましたが、今回の問題はクォータニオンを使えば解決するというものではないことを付け加えておきます。

10091014
質問者

お礼

Foxtrot_OWさん、お礼も大変遅くなり失礼いたしました。 メソッドsetTransformAxis()で回転軸は以前から試していましたが、 コンストラクタ引数の設定でRotationInterpolatorでX軸について回転することができることを知って大変勉強になりました。 クォータニオンで解決するものではないと言う点も知り、嬉しく思います。ありがとうございました。

その他の回答 (2)

回答No.2

#1の回答者です。質問の内容を勘違いしていたようで申し訳ありません。 クラスjavax.media.j3d.Alphaのコンストラクタの引数triggerTimeはそのアニメーションが開始するタイミングを指定できるようです。Y軸の回転の開始を、X軸の回転の終了のタイミングに指定すればいいのではないでしょうか。たとえばX軸の回転に2秒かかるとしたら、Y軸の回転を2秒後から開始するようにtriggerTimeに2000を渡します。X軸の回転も2秒後に停止し繰り返さないようloopCountには1を渡します。RotationInterpolatorを二つ重ね合わせるので、Transform3Dも二重になります。自分では確認していませんが、試してみてください。

参考URL:
http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/index.html
10091014
質問者

お礼

Foxtrot_OWさん、ありがとうございます。 RotationInterpolatorはデフォルトで使用するとY軸回転ですね。 ご回答にてRotationInterpolatorを二つ重ね合わせるとありましたが、RotationInterpolatorをX軸回転で用いることは可能でしょうか? 「物体(座標軸)をX軸回転させておいて、Y軸に1回転させる」という方法では、初期画面から座標軸が傾いた状態になってしまいます。 よって、RotationInterpolatorをX軸回転で用いることが可能であれば解決するのですが。

回答No.1

おっしゃるとおり、RotationInterpolatorのコンストラクタの引数axisOfTransformはあくまで回転軸の方向を変換します。ご質問の内容では回転軸はY軸と(たまたま)同じ方向なので、axisOfTransformはデフォルトのままでよろしいかと思います。 >物体をX軸を中心に20°程回転させ、かつY軸を中心に1回転させる ではなく、「X軸について20°程回転させた物体」を、RotationInterpolatorでY軸について1回転させると考えてみたらどうでしょうか。X軸について20°程の回転を設定したTransformGroupにその物体を追加し、そのTransformGroupをRotationInterpolatorのコンストラクタの引数targetに渡してみてください。 なにやら面白そうなものを作ってますね。気になるな……

10091014
質問者

お礼

Foxtrot_OWさん、ありがとうございました。 私が作成しているのは3次元の座標空間を回転させるというものです。 あらかじめ「X軸について20°程回転させて」しまいますと、アニメーションが始まる前で座標軸がその分だけ傾く(20°)ことになってしまいます。 できましたら、アニメーションが始まってからX軸、Z軸について回転させたいのですが・・・

関連するQ&A

  • Java3Dで横置き円筒体の円筒中心軸廻りに回転アニメーションさせたいのですが

    Java3Dで円筒をY軸方向に直立配置した後、Y軸を中心軸としての回転アニメーションをさせるところまでは問題ないのですが、この円筒を90度倒して、すなわち、横置きにして同じ円筒中心軸とする回転アニメーションをするのはどのようにすればよいのでしょうか? X軸方向(axis.rotZ(Math.PI / 2.0 )を使って)、或いはZ軸方向に倒し、RotationInterpolatorを使っても、X軸、或いはZ軸を中心軸とした回転アニメーションにはならず、逆にZ軸、或いはX軸廻りに回転する結果となってしまいます。これは、回転軸に関してはY軸が基本で、円筒を倒すと同時にY軸も円筒と共に90度倒れることによると思われます。 横置き円筒軸廻りの回転アニメーションはどのようにすればできるのでしょうか?

    • ベストアンサー
    • Java
  • 3D回転ツールの3D中心点(Z:)について

    WindowsでFlashCS5を使用しています。 どうぞ、よろしくお願いいたします。 3D回転ツールを使って、 ムービークリップを、 モーショントゥイーンを使い、 Y軸で回転するアニメーションを作りたいです。 モーショントゥイーンを使って、Y軸で回転させる際ですが、 ムービークリップのZ座標と、 3D中心点のZ座標を、異なる値に設定することは、 仕様上、可能でしょうか? ※惑星の周りをまわる衛星のアニメーションを作るようなイメージです。 ※モーショントゥイーンを使わず、  ムービークリップのZ座標と、3D中心点のZ座標が異なる状態で、  ムービークリップをY軸で回転させるだけなら、  出来ることは確認できました。  ですが、これではアニメーションが出来ません。 下記の手順で、モーショントゥイーンを使ったアニメーションを試してみましたが、 上手くいきませんでした。 1.ムービークリップを1つ作成。 2.ステージに配置。 3.ムービークリップを配置したタイムラインを、10フレームまで延ばす。 4.そのタイムラインに、モーショントゥイーンを設定する。 5.「変形」パネルの「3D中心点」の「Z:」に、100を入力する。 6.3D回転ツールで、Y軸で回転させる。 3D回転ツールで、表示された円をドラッグしている間は、 ムービークリップのZ座標と、3D中心点のZ座標が、異なる値に設定された状態で、 回って表示されています。 ※衛星のような軌道です。 しかし、ドラッグを終えると、 ムービークリップのZ座標と、3D中心点のZ座標が、同じ値の場合の結果と なってしまいます。 ※その場で回り続ける惑星のようです。 Q1. これは、モーショントゥイーンでは、3D中心点のZ:に値を設定することが 出来ない、という意味でしょうか? Q2. また、希望するアニメーションを実現する方法は、ありますでしょうか? ※ムービークリップに、衛星のような軌道を進ませるアニメーションです。 ご教示のほど、どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ボタンクリックで設計変更に応じるJava3D物体を作るには?(その2)

    ボタンをクリックすると、予めモニタ上のパラメータ欄に入力した数値(半径・高さ・配置位置-X方向変位など)に応じて、Java3D回転アニメーション(RotationInterpolator)で描いた円錐・直方体・円筒のサイズが変るプログラムを作りたいと取り組んでいます。 Java3D回転behaviorに対する同様の課題(QNo.4206209)では、lailai2580さんに教えていただき解決することができました。 このとき教えていただいたのと同様の方法を採り入れて、トライしてみました。下記URLに示すサイトでトライ1とトライ2をしてみました。 しかし、1物体(トライ2では中央に配置した赤直方体に対しパラメータ欄の第2物体-箱の設計条件を変えて「CHANGE」ボタンをクリックするとサイズが変るようになりましたが、他の2物体(右側の円錐、左側の円筒)を表示させることができません。 サイトのイメージに示す3物体何れに対しても設計条件を変えた後、「CHANGE」ボタンをクリックして、全ての物体に変化が生じ回転アニメーションを表示させるようにしたいのですが、今回は、3物体それぞれの回転数を変えるなどしており、BranchGroup を3つに分けて扱っていることなどがあって、Javaコーディングに疎い私は、ソースコードをどのように改めればよいかわかりません。 私が途中まで作成したソースコード(トライ2)のどの部分をどのように改めればよいか教えていただきたく、よろしくお願いします。 http://www.geocities.jp/java3dtest/QA08/question8.html

    • ベストアンサー
    • Java
  • pv3Dについて教えてください

    【環境】 FlashCS4 pv3D 2.0 アニメーションを作りたいと思い、数日前か勉強し始めました。 今まで全くプログラミングの勉強をしたことがないのと、サイト などに落ちているソースを見てもpv3Dのverが違うのかコンパイル エラーで思うように動いてくれません。 作りたいアニメは、 ・x,y,z軸 ・軸のプラス方向に矢印がついており、更にその先にx,y,zの文字 ・x,y,z軸それぞれプラスの値の適当な位置にy軸方向に長い  直方体を配置 ・直方体の側面にそれぞれ矢印が向いている ・軸、直方体を含め、マウスドラッグでy軸もしくは直方体を  中心に回転 という動きを実現したいのですが。。。 思い描いている動きとしては http://clockmaker.jp/blog/2009/05/papervision3d_tutorial_5/ にあるDemo (step3)が一番近いのですが、どうしても上手く いきません。 ※自分はフレームアクションではなく、asファイルで作成しています。 参考サイトやソースがわかる方いらっしゃいましたらぜひ教えて 下さい。よろしくお願いします。

  • 3次元上にある物体の向きを中心に向かわせたい

    3次元上にある物体の向きを中心に向かわせたい 原点 0,0,0 を中心にした球体面上を回転移動している物体A、 例えば矢印があるとして、これを常に原点の方向を指すためには、 矢印のY軸回転・X軸回転・Z軸回転などをどのように制御すると良いでしょうか。 アングルは正面(Yが垂直 Xが水平 Zは奥行)から見た場合です。 物体Aの座標(x y z)がわかれば、全て導き出せるでしょうか? 2次元ですと、タンジェントの逆関数であるアークタンジェントを使い、 xとy座標がわかれば角度を導き出せるようですが、 3次元の場合もこの組み合わせになるのですか? 座標は原点 0, 0, 0を中心に 上に行くほどYが「減少」 右に行くほどXが「増加」 奥に行くほどZが「増加」 Y減少 ↑ _ Z増加 │/` ├─→ X増加 という形になっています。(前回の質問: http://okwave.jp/qa/q5954803.html から引用) 以上宜しくお願い致します。

  • JavaのJARファイルがうまく作成できません

    Javaプログラムを作成したのですが、Jarファイルがうまく作成できません。 (Javaプログラムの作成経験はありますが、Jarファイル作成は初めてです) どなたか解決方法をご教授下さい。 4つのソースプログラムがあります。 1) D:\Java\x\y\Random\a.java 2) D:\Java\x\y\Random\b.java 3) D:\Java\x\y\Random\c.java 4) D:\Java\x\y\Random\d.java ■1:Windowsのコマンドプロンプトで、 cd D:\Java javac x\y\Random\*.java と入力して、エラーが発生する事なく、コンパイルできました。 (D:\Java\x\y\Randomフォルダに、a.class, b.class, c.class, d.classファイルができました) ■2:次に(Windowsのコマンドプロンプトで) java x.y.Random.myClass と入力して、期待通り動作しました。 上記1)~4)のjavaソースプログラムは次のようにコーディングしています。 1) a.java package x.y.Random; ・・・ class myClass { public static void main(String args[]) { ・・・ } } 2) b.java package x.y.Random; ・・・ 3) c.java package x.y.Random; ・・・ 4) d.java package x.y.Random; ・・・ ここまではうまく行っており、問題ありません。 ■3: 次のコマンドを実行すると、 jar cvf x.y.Random.jar x\y\Random 何もエラーは発生せず、以下のようなメッセージが10行程度表示され、 ・・・を追加中です。(入=xx)(出=yy)(nn%収縮されました) 「x.y.RandomNum.jar」ファイルが作成されましたが、 このjarファイルをダブルクリックすると、以下のダイアログボックスが表示されます。 ・ダイアログボックスのタイトル Java Virtual Machine Launcher ・エラーメッセージ Failed to load Main-Class manifest attribute from D:\Java\x.y.Random.jar 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 回転行列から角度を求める

    3Dのプログラミングを行っていますが、ある物体から得た回転行列から、ラジアンの角度を得たいと思っています。 物体はx軸・y軸・z軸にそれぞれ未知の値で回転させられており、 この物体から得られる回転行列Rは3×3の行列として |r11 r12 r13| |r21 r22 r23| |r31 r32 r33| と与えられています。ここから、x軸・y軸・z軸にそれぞれ何度回転させられているのかを算出するにはどのようにすればいいでしょうか? 参考資料が少ないため、ご教授お願いいたしますm(_ _)m

  • javaもしくはjava3Dをつかって

    最初に断っておきますが,初心者です javaもしくはjava3Dを使って正弦波をX軸Y軸の上を動かしたいのですが,うまくいきません.正弦波を表示させるところまではうまくいくのですが動かそうとするとエラーがでてしまいます.動かすプログラムが間違っているのでしょうか? 自分のやり方は線を描画して再計算して何も実行文のないwhile文で時間を稼いでもう一度描画というふうにしています.BASICではこの方法でやりました. また,表示させた画像をボタンから任意に画素数を代えて画像の2値化などができるプログラムなどは作れるでしょうか?こっちはまったくの手付かずなのですが ... どなたか,アドバイスいただける方いましたらお願いします.

  • openGLの回転の仕組みが分からなくて、困っています

    openGL初心者です。描画関数で以下のような書き方でx軸、y軸、z軸それぞれに角度を与えてオブジェクトを描画しているのですが、意図した角度に回転してくれません。 一応自分の認識では、openGLでは以下のような書き方をすると、まずオブジェクトの描画がされて、次にz軸の回転→y軸の回転→x軸の回転と、処理の順番とは逆に計算が行われると知ったのですが、まずその認識は正しいでしょうか? そこで、実際にx、y、z軸にそれぞれ角度を与えてオブジェクトを回転させてみるのですが、どうも意図した回転にならないのです。 例えばz軸に90度の値を与えて、オブジェクトを横に倒したとします。 まず、その状態でローカル座標系のx軸とy軸がz軸を中心に90度回っていると思っています。 その後、y軸に90度の値を与えても、ローカル座標系のy軸を中心に回らず、まるでワールド座標系のy軸を中心に90度回りまわっているように見えます。また、x軸も同様にワールド座標系のx軸を中心に90度回ります。 そこで、ワールド座標系で回るのかと思い、今度は、ニュートラルの状態から、y軸を90度回します。ローカル座標ではx軸、z軸がy軸を中心に90度回ると思います。次にx軸に対して、角度を与えてやると今度はローカル座標系のx軸を中心にまわるのです。 何故このような回転をするのかイメージできません。。どなたか回答いただけませんでしょうか? それと本当にやりたいことは、オブジェクトがどのような姿勢で回転していても(ローカル座標系がどうであれ)ワールド座標系のx、y、z軸を中心に回転させたいのですが、宜しければその辺も合わせて教えて頂けたら幸いです。 (数学の知識も乏しいので、数式がちゃんとあるのなら、その名前を教えていただければ直幸いです。) 乱文失礼します。 public void display(GLAutoDrawable drawable) { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gluLookAt((double) 0.0f, (double) 0.0f, (double) 5.5f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 1.0f, (double) 0.0f); gl.glEnableClientState(GL.GL_VERTEX_ARRAY); gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glRotatef(AngleX, 1, 0, 0); gl.glRotatef(AngleY, 0, 1, 0); gl.glRotatef(AngleZ, 0, 0, 1); // オブジェクト描画 draw(gl); gl.glDisableClientState(GL.GL_COLOR_ARRAY); gl.glDisableClientState(GL.GL_VERTEX_ARRAY); }

  • Java3Dにおける再描画

    Java3Dで,例えば. (1.0+x,1.0+y,1.0+z)のBOXを,ボタンを押すごとにx,y,zにランダムの数値が入れ形状を変化させるプログラムを作りたいのですが,再描画の方法がわかりません. どなたか教えていただけないでしょうか?

    • ベストアンサー
    • Java