com.nttdocomo.ui.util3d
クラス Transform

Object
  拡張com.nttdocomo.ui.util3d.Transform

public class Transform
extends Object

浮動小数による三次元アフィン変換用の行列データを保持する、 変換行列クラスを定義します。 行列の内容は、 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 は常に真です。

導入されたバージョン:
DoJa-4.0 (901i)
関連項目:
数値演算に関する共通の定義

コンストラクタの概要
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
 

コンストラクタの詳細

Transform

public Transform()

変換行列オブジェクトを生成します。

内容は恒等変換の状態、つまり [1 0 0 0][0 1 0 0][0 0 1 0][0 0 0 1] になります。


Transform

public Transform(Transform transform)

任意の変換行列オブジェクトの内容を完全に複製することで、 新規に変換行列オブジェクトを生成します。

パラメータ:
transform - 変換行列オブジェクトを指定します。
例外:
NullPointerException - 引数 transform が null の場合に発生します。
メソッドの詳細

setIdentity

public void setIdentity()

行列の内容を恒等変換の状態、つまり [1 0 0 0][0 1 0 0][0 0 1 0][0 0 0 1] にします。


set

public void set(Transform transform)

任意の変換行列オブジェクトの内容を完全に複製することで、 この変換行列オブジェクトの内容を再設定します。

パラメータ:
transform - 変換行列オブジェクトを指定します。
例外:
NullPointerException - 引数 transform が null の場合に発生します。

set

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個目以降の内容は検査されません。

get

public void get(float[] matrix)

変換行列の内容を、実数の配列に設定させることで取得します。

パラメータ:
matrix - 実数群を設定させたい配列を指定します。 長さが 16 以上なことが必要です。 長さが 17 以上のとき、 17個目以降の要素の内容は変更されません。
例外:
NullPointerException - 引数 matrix が null の場合に発生します。
IllegalArgumentException - 引数 matrix の長さが 16 未満の場合に発生します。

set

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 のいずれかが指定された場合に発生します。

get

public float get(int index)

変換行列の要素を一つ取得します。

パラメータ:
index - 要素の番号を指定します。 0 から 15 の範囲で指定します。
戻り値:
指定された要素の値を返します。
例外:
IllegalArgumentException - 引数 index が 0 未満あるいは 16 以上のとき。

invert

public void invert()

変換行列の逆行列を計算して、結果を格納します。

例外:
ArithmeticException - 逆行列が計算できない場合に発生します。

transpose

public void transpose()

変換行列の転置行列を算出して、結果をこのオブジェクトに設定します。


multiply

public void multiply(Transform transform)

変換行列の乗算を行い、結果をこのオブジェクトに設定します。

具体的には this = this x transform を行います。

引数に this を渡したときにも、正常に演算が行われます。

パラメータ:
transform - 変換行列オブジェクトを指定します。
例外:
NullPointerException - 引数 transform が null の場合に発生します。

scale

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 のいずれかが指定された場合に発生します。

scale

public void scale(Vector3D v)

変換行列の乗算(拡大/縮小)を行い、結果をこのオブジェクトに設定します。

scale(v.getX(), v.getY(), v.getZ()) を呼び出したのと同じ結果になります。

パラメータ:
v - ベクトルオブジェクトを指定します。
例外:
NullPointerException - 引数 v が null の場合に発生します。

rotate

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 幅の値に変換したときに、 この条件を満たす場合にも発生します。

rotate

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 幅の値に変換したときに、 この条件を満たす場合にも発生します。

rotateQuat

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 幅の値に変換したときに、 この条件を満たす場合にも発生します。

rotateQuat

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 幅の値に変換したときに、 この条件を満たす場合にも発生します。

translate

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 のいずれかが指定された場合に発生します。

translate

public void translate(Vector3D v)

変換行列の乗算を行い(平行移動)、 結果をこのオブジェクトに設定します。

translate(v.getX(), v.getY(), v.getZ()) を呼び出したのと同じ結果になります。

パラメータ:
v - ベクトルオブジェクトを指定します。
例外:
NullPointerException - 引数 v が null の場合に発生します。

lookAt

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 幅の値に変換したときに、 この条件を満たす場合にも発生します。

transVector

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ドコモの商標または登録商標です。

その他記載された会社名、製品名などは該当する各社の商標または登録商標です。