[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