[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Java3Djp:01578] Re: Re: Re: 2 つの Transforam3D の距離をリアルタイムで表示するには?





お世話になっております。

> どうしてこういう仕様なのかは不明です。

はまったいきさつはこうです。

Java3DのAPI(java3d-1_2-doc.zip)にcom.sun.j3d.utils.behaviors.picking
とcom.sun.j3d.utils.picking.behaviorsのそれぞれのPickingCallbackインター
フェイスの仕様が載っていますが、Method Detail が「両方とも」
transformChanged
public void transformChanged(int type,
                             TransformGroup tg)
という記述になっています。(この間違いが全ての始まり)
ここで気がつけば良かったのですが、私の頭の中で「定義が同じ」ということ
だけが強調されていて、えんどうさんの例題の記述をそのまま使うという風に
思い込んでしまったためです。使用を見た時点で例題のTransform3Dと仕様
のTransformGroupの違いに気づくべきでした。
逆コンパイラでそれぞれのPickingCallbackの中身を見ると確かに定義が違い
ますね。

単なる馬鹿ですね...(^^;



>> 私はRotate,Translate,Zoomで物体をマニピュレートすると、そのtransの「座
>> 標系自体が動く」と思っていたのです。
>> 教えていただいた方法で色々データのと表示物体の動きを観察していると、座
>> 標系は固定で表示物体のみが動いているのですね。
>
> え、本当ですか。
>
>> ですから、私の質問自体が間違っていました。
>> 正しくは、Transform3D:Aの原点(もしくは任意の点)から、Transform3D:Bに表
>> 示されているある平面(最初はX-Y平面に表示されていて、マウス操作
>> でRotate,Translate,Zoomする)に引いた垂線の距離をリアルタイムで算出す
>> る最適な方法はどうすればよいのでしょうか?
>> ということでした。
>
> Bのすぐ上位にあるTransformGroupから
> getTransform()で取り出したTransform3Dには
> 本当に回転が加わっていないのでしょうか?


記述はこうです。
    public PickingCallback pickingCallback = new PickingCallback() {
      public void transformChanged(int flag, TransformGroup
transPick) {
        if (CT_DATA_DISP == true) {
          //ここに表示ルーチンを記述
          if (transPick != null) {
            Transform3D disp_t3d0 = new Transform3D();
            Transform3D disp_t3d1 = new Transform3D();
            Vector3d ctVec3d = new Vector3d();//板の座標ベクタ
            Vector3d dataVec3d = new Vector3d();//データの座標ベクタ
            Vector3d tranVec3d = new Vector3d();//座標変換された後の
ベクタ。
            ct_trans.getTransform(disp_t3d0);
            trans.getTransform(disp_t3d1);
            disp_t3d0.get(ctVec3d);
            disp_t3d1.get(dataVec3d);
            disp_t3d0.transform(dataVec3d, tranVec3d);
            int distance =(int)((ctVec3d.z-tranVec3d.z)*MAG);
            System.out.println(distance);
            //System.out.println(ctVec3d);
            //System.out.println(dataVec3d);
            //System.out.println(tranVec3d);
          }
        }
      }
    };


transが(A)で、ct_transが平面のあるほう(B)にあたります。rootにぶら下がっ
ています。それぞれ初期姿勢はZ軸の正方向が正面になっています。この状態
でZ軸方向(前後方向)にZoomで振ると、まさにに思ったとおりに値が変わる
(当然X-Y方向にTranslateで移動やAの回転では値は変わらない)のですが、
例えばBを90度回転させて平面を横からみた形にして、平面を左右方向(つま
り姿勢変更した後のZ軸方向)にTranslateで振ってみても、出力される数値が
変わりません。なので、2つの座標系の位置関係は固定されていて回転によっ
て変わらないのでは?(Z方向に動かしているつもりが、実はX-Y方向?)と思っ
た次第です。



---
はま
E-Mail Address:h-hama@xxxxxxxxxxxxxxx