|
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Objectcom.nttdocomo.ui.util3d.Transform
浮動小数による三次元アフィン変換用の行列データを保持する、
変換行列クラスを定義します。
行列の内容は、 4x4 の 16 個の float 型の値です。
メソッド
set(float[])
set(int, float)
get(int)
get(float[])
を利用時に考慮する必要がある、要素のインデックス番号と、
実際の行列の要素との関係は、以下のようになります。
第 1 2 3 4 列
-----------------------
第 1 行 [ 0 1 2 3]
第 2 行 [ 4 5 6 7]
第 3 行 [ 8 9 10 11]
第 4 行 [12 13 14 15]
-----------------------
以下のメソッドによって
設定された float 値は、なんらかの演算が行われるまでの間、 その内容はまったく変わらずに保持されます。 具体的には、例えばset(0, x)
メソッドによって値 x を設定した直後に、
get(0)
メソッドによって取得した値 a を比較するとします。
このとき、 x==a は常に真です。
コンストラクタの概要 | |
Transform()
変換行列オブジェクトを生成します。 |
|
Transform(Transform transform)
任意の変換行列オブジェクトの内容を完全に複製することで、 新規に変換行列オブジェクトを生成します。 |
メソッドの概要 | |
void |
get(float[] matrix)
変換行列の内容を、実数の配列に設定させることで取得します。 |
float |
get(int index)
変換行列の要素を一つ取得します。 |
void |
invert()
変換行列の逆行列を計算して、結果を格納します。 |
void |
lookAt(Vector3D position,
Vector3D look,
Vector3D up)
視点座標への変換となるように行列の要素を設定します。 |
void |
multiply(Transform transform)
変換行列の乗算を行い、結果をこのオブジェクトに設定します。 |
void |
rotate(float x,
float y,
float z,
float angle)
変換行列の乗算(任意の方向ベクトルに対する回転)を行い、 結果をこのオブジェクトに設定します。 |
void |
rotate(Vector3D v,
float angle)
変換行列の乗算(任意の方向ベクトルに対する回転)を行い、 結果をこのオブジェクトに設定します。 |
void |
rotateQuat(float x,
float y,
float z,
float w)
変換行列の乗算を行い(四元数による回転)、 結果をこのオブジェクトに設定します。 |
void |
rotateQuat(Vector3D v,
float w)
変換行列の乗算を行い(四元数による回転)、 結果をこのオブジェクトに設定します。 |
void |
scale(float x,
float y,
float z)
変換行列の乗算(拡大/縮小)を行い、結果をこのオブジェクトに設定します。 |
void |
scale(Vector3D v)
変換行列の乗算(拡大/縮小)を行い、結果をこのオブジェクトに設定します。 |
void |
set(float[] matrix)
実数の配列の内容を用いて、変換行列を再設定します。 |
void |
set(int index,
float value)
変換行列の要素を一つ設定します。 |
void |
set(Transform transform)
任意の変換行列オブジェクトの内容を完全に複製することで、 この変換行列オブジェクトの内容を再設定します。 |
void |
setIdentity()
行列の内容を恒等変換の状態、つまり [1 0 0 0][0 1 0 0][0 0 1 0][0 0 0 1]
にします。
|
void |
translate(float x,
float y,
float z)
変換行列の乗算を行い(平行移動)、 結果をこのオブジェクトに設定します。 |
void |
translate(Vector3D v)
変換行列の乗算を行い(平行移動)、 結果をこのオブジェクトに設定します。 |
void |
transpose()
変換行列の転置行列を算出して、結果をこのオブジェクトに設定します。 |
void |
transVector(Vector3D v,
Vector3D result)
点の座標を表すベクトルを、この変換行列で変換して、 結果を別のベクトルに格納します。 |
クラス Object から継承したメソッド |
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
コンストラクタの詳細 |
public Transform()
変換行列オブジェクトを生成します。
内容は恒等変換の状態、つまり
[1 0 0 0][0 1 0 0][0 0 1 0][0 0 0 1]
になります。
public Transform(Transform transform)
任意の変換行列オブジェクトの内容を完全に複製することで、 新規に変換行列オブジェクトを生成します。
transform
- 変換行列オブジェクトを指定します。
NullPointerException
- 引数 transform が null の場合に発生します。
メソッドの詳細 |
public void setIdentity()
行列の内容を恒等変換の状態、つまり
[1 0 0 0][0 1 0 0][0 0 1 0][0 0 0 1]
にします。
public void set(Transform transform)
任意の変換行列オブジェクトの内容を完全に複製することで、 この変換行列オブジェクトの内容を再設定します。
transform
- 変換行列オブジェクトを指定します。
NullPointerException
- 引数 transform が null の場合に発生します。
public void set(float[] matrix)
実数の配列の内容を用いて、変換行列を再設定します。
matrix
- 実数の配列を指定します。長さが 16 以上なことが必要です。
長さが 17 以上のとき、 17個目以降の要素の内容は無視されます。
NullPointerException
- 引数 matrix
が null の場合に発生します。
IllegalArgumentException
- 引数 matrix の長さが 16 未満の場合に発生します。
IllegalArgumentException
- 引数 matrix の
16個の
要素のいずれかに、
Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
のいずれかが指定された場合に発生します。
17個目以降の内容は検査されません。
public void get(float[] matrix)
変換行列の内容を、実数の配列に設定させることで取得します。
matrix
- 実数群を設定させたい配列を指定します。
長さが 16 以上なことが必要です。
長さが 17 以上のとき、 17個目以降の要素の内容は変更されません。
NullPointerException
- 引数 matrix
が null の場合に発生します。
IllegalArgumentException
- 引数 matrix の長さが 16 未満の場合に発生します。
public void set(int index, float value)
変換行列の要素を一つ設定します。
index
- 要素の番号を指定します。 0 から 15 の範囲で指定します。value
-
要素の値を指定します。
IllegalArgumentException
- 引数 index が 0 未満あるいは 16 以上のとき。
IllegalArgumentException
- 引数 value に、
Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
のいずれかが指定された場合に発生します。
public float get(int index)
変換行列の要素を一つ取得します。
index
- 要素の番号を指定します。 0 から 15 の範囲で指定します。
IllegalArgumentException
- 引数 index が 0 未満あるいは 16 以上のとき。
public void invert()
変換行列の逆行列を計算して、結果を格納します。
ArithmeticException
- 逆行列が計算できない場合に発生します。
public void transpose()
変換行列の転置行列を算出して、結果をこのオブジェクトに設定します。
public void multiply(Transform transform)
変換行列の乗算を行い、結果をこのオブジェクトに設定します。
具体的には
this = this x transform
を行います。
引数に this を渡したときにも、正常に演算が行われます。
transform
- 変換行列オブジェクトを指定します。
NullPointerException
- 引数 transform が null の場合に発生します。
public void scale(float x, float y, float z)
変換行列の乗算(拡大/縮小)を行い、結果をこのオブジェクトに設定します。
具体的には
this = this x S
を行います。Sの内容は
x 0 0 0 0 y 0 0 0 0 z 0 0 0 0 1です。
x
- 値 x を指定します。y
- 値 y を指定します。z
- 値 z を指定します。
IllegalArgumentException
- 引数 x,y,z のいずれかに、
Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
のいずれかが指定された場合に発生します。
public void scale(Vector3D v)
変換行列の乗算(拡大/縮小)を行い、結果をこのオブジェクトに設定します。
scale(v.getX(), v.getY(), v.getZ())
を呼び出したのと同じ結果になります。
v
- ベクトルオブジェクトを指定します。
NullPointerException
- 引数 v が null の場合に発生します。
public void rotate(float x, float y, float z, float angle)
変換行列の乗算(任意の方向ベクトルに対する回転)を行い、 結果をこのオブジェクトに設定します。
具体的には
this = this x R
を行います。Rの内容は
xx(1-c)+c xy(1-c)-zs xz(1-c)+ys 0 yx(1-c)+zs yy(1-c)+c yz(1-c)-xs 0 xz(1-c)-ys yz(1-c)+xs zz(1-c)+c 0 0 0 0 1です。ただし
c = cos(angle), s = sin(angle)
です。
ベクトルの長さが 1 になるように 値 x, y, z は正規化された
のちに、上記の行列が生成されて演算が行われます。
x
- 値 x を指定します。y
- 値 y を指定します。z
- 値 z を指定します。angle
- 回転角度 (degree) を指定します。
IllegalArgumentException
- 引数 x,y,z,angle のいずれかに、
Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
のいずれかが指定された場合に発生します。
IllegalArgumentException
- 引数 angle が 0 ではなく、かつ、
引数 x,y,z がすべて 0 の場合に発生します。
また、これらの引数を int 幅の値に変換したときに、
この条件を満たす場合にも発生します。
public void rotate(Vector3D v, float angle)
変換行列の乗算(任意の方向ベクトルに対する回転)を行い、 結果をこのオブジェクトに設定します。
rotate(v.getX(), v.getY(), v.getZ(), angle)
を呼び出したのと同じ結果になります。
v
- ベクトルオブジェクトを指定します。angle
- 回転角度 (degree) を指定します。
NullPointerException
- 引数 v が null の場合に発生します。
IllegalArgumentException
- 引数 angle に、
Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
のいずれかが指定された場合に発生します。
IllegalArgumentException
- 引数 angle が 0 ではなく、かつ、引数 v が零ベクトルの場合に発生します。
また、これらの引数が示す値を int 幅の値に変換したときに、
この条件を満たす場合にも発生します。
public void rotateQuat(float x, float y, float z, float w)
変換行列の乗算を行い(四元数による回転)、 結果をこのオブジェクトに設定します。
具体的には
this = this x R
を行います。Rの内容は
1-(2yy+2zz) 2xy-2zw 2xz+2yw 0 2xy+2zw 1-(2xx+2zz) 2yz-2xw 0 2xz-2yw 2yz+2xw 1-(2xx+2yy) 0 0 0 0 1です。 四次元ベクトルの長さが 1 になるように 値 x, y, z, w は正規化された のちに、上記の行列が生成されて演算が行われます。
x
- 値 x を指定します。y
- 値 y を指定します。z
- 値 z を指定します。w
- 値 w を指定します。
IllegalArgumentException
- 引数 x,y,z,w のいずれかに、
Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
のいずれかが指定された場合に発生します。
IllegalArgumentException
- 引数 x,y,z,w がすべて 0 の場合に発生します。
また、これらの引数を int 幅の値に変換したときに、
この条件を満たす場合にも発生します。
public void rotateQuat(Vector3D v, float w)
変換行列の乗算を行い(四元数による回転)、 結果をこのオブジェクトに設定します。
rotateQuat(v.getX(), v.getY(), v.getZ(), w)
を呼び出したのと同じ結果になります。
v
- ベクトルオブジェクトを指定します。w
- 値 w を指定します。
NullPointerException
- 引数 v が null の場合に発生します。
IllegalArgumentException
- 引数 w に、
Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
のいずれかが指定された場合に発生します。
IllegalArgumentException
- 引数 w が 0 であり、引数 v が零ベクトルの場合に発生します。
また、これらの引数が示す値を int 幅の値に変換したときに、
この条件を満たす場合にも発生します。
public void translate(float x, float y, float z)
変換行列の乗算を行い(平行移動)、 結果をこのオブジェクトに設定します。
具体的には
this = this x T
を行います。Tの内容は
1 0 0 x 0 1 0 y 0 0 1 z 0 0 0 1です。
x
- 値 x を指定します。y
- 値 y を指定します。z
- 値 z を指定します。
IllegalArgumentException
- 引数 x,y,z のいずれかに、
Float.NaN, Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY
のいずれかが指定された場合に発生します。
public void translate(Vector3D v)
変換行列の乗算を行い(平行移動)、 結果をこのオブジェクトに設定します。
translate(v.getX(), v.getY(), v.getZ())
を呼び出したのと同じ結果になります。
v
- ベクトルオブジェクトを指定します。
NullPointerException
- 引数 v が null の場合に発生します。
public void lookAt(Vector3D position, Vector3D look, Vector3D up)
視点座標への変換となるように行列の要素を設定します。
視点位置、 参照点位置、 Up ベクトルを指定することで、 視点座標への変換を表す変換行列を設定します。 ただし、行列の第四行は設定されません。
視線方向と Up ベクトルが垂直でないときは、 視線方向と垂直になるように Up ベクトルの内容を補正した値を用いて 変換行列が設定されます。
視点座標系は、視点位置を原点とし、 視線方向を +z 方向とする右手系になります。
※補足説明
この処理は、乗算・外積などの演算をすることで実装されています。
このそれぞれの演算を高速化するために、ベクトルが持つ float 値は
内部では固定小数の int 値に変換されて整数演算が行われています。
そのため結果として、
引数 position および look が保持している
float 値が [-32767,32767] の範囲外のときには、
特にオーバフローが起こりやすくなっています。
なお Up ベクトルは方向ベクトルですので、通常は
正規化されたベクトルを用いてください。
position
- 視点への位置ベクトルを指定します。look
- 参照点への位置ベクトルを指定します。up
- Up ベクトルを指定します。
NullPointerException
- 引数 positon, look, up のいずれかが null の場合に発生します。
IllegalArgumentException
- 引数 up
が零ベクトルの場合に発生します。
また、この引数が示す値を int 幅の値に変換したときに、
この条件を満たす場合にも発生します。
IllegalArgumentException
- 引数 look と position のベクトルが等価な場合に発生します。
また、これらの引数が示す値を int 幅の値に変換したときに、
この条件を満たす場合にも発生します。
IllegalArgumentException
- 引数
(look - position) のベクトル演算の結果と、引数 up のベクトルが
平行
な場合に発生します。
また、これらの引数が示す値を int 幅の値に変換したときに、
この条件を満たす場合にも発生します。
public void transVector(Vector3D v, Vector3D result)
点の座標を表すベクトルを、この変換行列で変換して、 結果を別のベクトルに格納します。
第 4 行の内容は無視されて、 4x3の行列とみなした演算が行われます。
なお、 引数 v と result が同一オブジェクトを参照している 場合でも、正しく計算が行われます。
v
- 点の座標を表すベクトルを指定します。result
- 変換結果を格納するベクトルを指定します。
NullPointerException
- 引数 v または result が null の場合に発生します。
|
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
NTT DOCOMO,INC.
本製品または文書は著作権法により保護されており、その使用、複製、再頒布および逆コンパイルを制限するライセンスのもとにおいて頒布されます。NTTドコモ(その他に許諾者がある場合は当該許諾者も含めて)の書面による事前の許可なく、本製品および関連する文書のいかなる部分も、いかなる方法によっても複製することが禁じられます。フォントを含む第三者のソフトウェアは、著作権法により保護されており、その提供者からライセンスを受けているものです。
Sun、Sun Microsystems、Java、J2MEおよびJ2SEは、米国およびその他の国における米国 Sun Microsystems,Inc.の商標または登録商標です。サンのロゴマークは、米国 Sun Microsystems, Inc.の登録商標です。
FeliCaは、ソニー株式会社が開発した非接触ICカードの技術方式です。FeliCaは、ソニー株式会社の登録商標です。
「iモード」、「iアプリ/アイアプリ」、「i-αppli」ロゴ、「DoJa」はNTTドコモの商標または登録商標です。
その他記載された会社名、製品名などは該当する各社の商標または登録商標です。