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

[Java3Djp:01096] Re: lookAtメソッドについての質問




平鍋@esmです.

On Thu, 25 Nov 1999 11:10:32 +0900,
"nakano" <nakano@xxxxxxxxxx> said:
 > 中野@xxxxxxxxxxです。こんにちは。

 > Transform3Dクラスには、lookAtメソッドがあり、これを使うと視点、注視点、
 > UPベクトルを指定することにより変換行列が作成できます。
 >  ところで、逆に、ある変換行列があった場合に、その行列の情報から
 > 視点、注視点、UPベクトルの情報を生成することは可能なのでしょうか。
 > 任意の変換行列をX,Y,Zまわりの回転行列、平行移動の行列に分解で
 > きれば良いと思うのですが、そのようなことはできるのでしょうか。
 > 何か情報がありましたらよろしくお願い致します。

Trasnform3D に,

  public final double get(Matrix3d m1, Vector3d t1)

というメソッドがあり,これによって

 > 任意の変換行列をX,Y,Zまわりの回転行列、平行移動の行列に分解で
 > きれば良いと思うのですが、そのようなことはできるのでしょうか。

これが可能です.t1 が並行移動,m1 が回転,return がスケール
です.参考のために,私が実装した,lookAt() のコードも付けま
す.これは,正変換ですが,各マトリクス要素と 視点、注視点、
UPベクトルの関係が掴めると思います.

P.S.
今書店に出ているJavaWorldに,「Java3D の幾何と代数」という記
事を書きました.2回完結の予定です.

================8<================8<================8<===============
    /**
     * Helping function that specifies the position and orientation of a view 
     * matrix.
     * @xxxxxxxxxx eye - the location of the eye
     * @xxxxxxxxxx center - a point in the virtual world where the eye is looking
     * @xxxxxxxxxx up - an up vector specifying the frustum's up direction
     *
     **/
    public void lookAt(Point3d eye, Point3d center, Vector3d up) {
        // find orthogonal 3 unit vectors u, v, n
        //
        // n ... center -> eye
        // u ... x+ (right)
        // v ... y+ (up)

        Vector3d n= new Vector3d(eye);  // n = (center-eye)/|n|
        n.sub(center);
        n.normalize();

        Vector3d u = new Vector3d(up);  // u = (u - (u.n)n)/|u|
        Vector3d n_tmp = new Vector3d(n);
        n_tmp.scale(u.dot(n));
        u.sub(n_tmp);
        u.normalize();

        Vector3d v = new Vector3d();    // v = n x u
        v.cross(n, u);

        /*
         *       [  u  ]
         *   R = [  v  ]
         *       [  n  ]
         *
         *   M = [                     ]
         *       [    R      - R center]
         *       [                     ]
         *       [ 0  0  0           1 ]
         */
        matrix.m00 = u.x;
        matrix.m01 = u.y;
        matrix.m02 = u.z;
        matrix.m03 = -(u.x*center.x + u.y*center.y + u.z*center.z);

        matrix.m10 = v.x;
        matrix.m11 = v.y;
        matrix.m12 = v.z;
        matrix.m13 = -(v.x*center.x + v.y*center.y + v.z*center.z);

        matrix.m20 = n.x;
        matrix.m21 = n.y;
        matrix.m22 = n.z;
        matrix.m23 = -(n.x*center.x + n.y*center.y + n.z*center.z);

        matrix.m30 = 0;
        matrix.m31 = 0;
        matrix.m32 = 0;
        matrix.m33 = 1;
        resetType();

        assert((matType & AFFINE) != 0 &&
               (matType & RIGID) != 0 &&
               (matType & CONGRUENT) != 0);
    }

================8<================8<================8<===============
ここまで
---
  Eiwa System Management, Inc.             http://www.esm.co.jp/
  Kenji Hiranabe                           E-Mail: hiranabe@xxxxxxxxxx