com.nttdocomo.ui.graphics3d
インタフェース Graphics3D


public interface Graphics3D

3Dグラフィックスを提供するインタフェースです。

3Dグラフィックスをサポートする Graphics クラスは、 このインタフェースを実装しなければなりません。

Graphics オブジェクトは、以下の情報を保持します。

Graphics クラスのコピーメソッド Graphics.copy() により複製される情報は、上記のパラメータすべてです。 このパラメータ以外の情報、つまりレンダリング用バッファの内容は コピーされません。

各種パラメータは、初期状態では以下のようになります。
パラメータ初期状態
クリッピング領域 描画領域全体
setClipRectFor3D(0, 0, width, height) が呼ばれた状態
投影方法 平行投影
setParallelView(width, height) が呼ばれた状態
視点座標への変換行列 恒等変換 (画面の中心にモデル座標系の原点が重なります)
光源 設定なし
フォグ 設定なし
※width は描画領域全体の幅、 height は描画領域全体の高さです。

おおまかに説明すると、アプリケーションが3Dの描画に関して行う操作手順は、 以下のようになります。

レンダリング用バッファは、3Dエンジンが内部的に利用するメモリ領域であり、 アプリケーション作成者はその存在や構造を意識する必要はありません。

参考資料として以下に、この Graphics3D オブジェクトを用いている、 3Dコンテンツの実装における典型的な例を示します(抜粋)。

 class someClass {
   Graphics g;
   Graphics3D g3;
   Group obj3d;

   void init() throws IOException {
     // データ読み込み(即、描画可能なデータとする)
     InputStream is = ... ;
     try {
       obj3d = (Group)Object3D.createInstance(is);
     } finally {
       is.close();
     }

     Canvas canvas = ... ;
     // [省略] setCurrent() 等の処理

     g = canvas.getGraphics();
     g3 = (Graphics3D)g;

     // 基本設定
     int width = 100;
     int height = 120;
     g3.setClipRectFor3D(10, 20, width, height); // クリッピング領域の設定
     g3.setPerspectiveView(1, 100, 120); // 透視投影の設定

     // 視野変換を設定
     //   未設定の場合、画面の中心にモデル座標系の原点が重なり、
     //   スケーリングは行われず、Z軸に重なる視線となります。
     Transform tr = new Transform();
     tr.lookAt(new Vector3D(0, 0, 30), // pos
               new Vector3D(0, 0, -30), // look
               new Vector3D(0, 1, 0)); // up
     g3.setTransform(tr); // 設定

     // 光源を設定
     Light t = new Light();
     t.setMode(Light.SPOT); // SPOT光源
     t.setIntensity(0.8f); // 80%
     t.setColor(0x00ff00ff); // 紫色
     t.setPosition(new Vector3D(10, 10, 10));  // 位置設定
     t.setVector(new Vector3D(-1, -1, -1));  // 向き設定
     g3.addLight(t, null); // 設定
   }
  
   void doPaint() {
     if (obj3d==null) {
       return;
     }
     g.lock();
     try {
       // 平行移動 (スクリーン上)
       Transform moveT = new Transform();
       {
         float moveX = ... ;
         float moveY = ... ;
         moveT.set(3, moveX);
         moveT.set(7, moveY);
       }
       // 移動・拡大縮小・回転 (モデル座標)
       Transform transM = new Transform();
       {
         //   行列1を設定 (移動・拡大縮小)
         Transform trans1 = new Transform();
         float dx = ... ; // X移動量
         float dy = ... ; // Y移動量
         float dz = ... ; // Z移動量
         float scale = ... ; // スケール値
         float[] ary = new float[] {
          scale, 0.0f, 0.0f, dx,
          0.0f, scale, 0.0f, dy,
          0.0f, 0.0f, scale, dz,
          0.0f, 0.0f, 0.0f, 1.0f
         };
         trans1.set(ary);

         //   行列2を設定 (回転)
         Transform trans2 = new Transform();
         trans2.rotate(1.0f, 0.0f, 0.0f, 30.0f); // X軸回転
         trans2.rotate(0.0f, 1.0f, 0.0f, 30.0f); // Y軸回転
         // 行列オブジェクトへの設定
         transM.set(trans2);
         transM.multiply(trans1);
       }
       // グループに行列設定
       obj3d.setTransform(transM);
       // 描画
       g3.renderObject3D(obj3d, moveT);
       g3.flushBuffer();
     } finally {
       g.unlock(true);
     }
   }
 
 }
 

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

メソッドの概要
 void addLight(Light light, Transform transform)
           レンダリング時にデフォルトで配置される 光源 を追加します。
 void flushBuffer()
           レンダリングバッファに蓄積された情報を用いて、 レンダリング結果を実描画領域に描画します。
 void renderObject3D(DrawableObject3D obj, Transform transform)
           指定された 描画可能な3Dオブジェクト をレンダリングします。
 void resetLights()
           addLight() メソッドにより追加された 光源 をすべて解除します。
 void setClipRectFor3D(int x, int y, int width, int height)
           キャンバス全体描画領域のうち3D描画のためのクリッピング領域を設定します。
 void setFog(Fog fog)
           デフォルトの フォグ 効果を設定します。
 void setParallelView(int width, int height)
           投影面の幅と高さを指定して平行投影の設定を行います。
 void setPerspectiveView(float zNear, float zFar, float angle)
           視野角を指定して透視投影の設定を行います。
 void setPerspectiveView(float zNear, float zFar, int width, int height)
           ニアクリップ面における投影面の幅および高さを指定して透視投影の設定を行います。
 void setTransform(Transform t)
           視点座標への 変換行列 オブジェクトを設定します。
 

メソッドの詳細

setClipRectFor3D

public void setClipRectFor3D(int x,
                             int y,
                             int width,
                             int height)

キャンバス全体描画領域のうち3D描画のためのクリッピング領域を設定します。

このメソッドによる設定内容は、 flushBuffer() メソッドの呼び出し時にのみ利用されます。 レンダリングに関する情報には、クリッピング領域の設定内容は含まれません。 つまり、クリッピング領域の設定内容は、 renderObject3D(DrawableObject3D, Transform) メソッド での処理内容に、まったく影響を与えません。

パラメータ:
x - クリッピング領域の矩形の左上の X 座標を指定します。
y - クリッピング領域の矩形の左上の Y 座標を指定します。
width - クリッピング領域の矩形の幅を指定します。
height - クリッピング領域の矩形の高さを指定します。
例外:
IllegalArgumentException - 引数 width, height のいずれかが 0 以下の場合に発生します。

setParallelView

public void setParallelView(int width,
                            int height)

投影面の幅と高さを指定して平行投影の設定を行います。

投影面の、視点座標系での幅と高さをセットします。 投影面の幅と高さを大きくすると、レンダリングの対象となる領域が広がるため、 結果として フィギュア オブジェクトが持つモデルデータ、および、 プリミティブ オブジェクトが持つプリミティブ図形データは、 より小さくレンダリングされることになります。

平行投影時には、ニアクリップ面の距離は0に、ファークリップ面の距離は 32767の固定となります。 実行環境によっては、ニア/ファークリップ面の扱い時に、多くの 演算誤差が発生するケースが想定できますので、クリップ面に重なる ポリゴンの描画結果は、環境依存となります。

このメソッドは、透視投影の設定機能である、 setPerspectiveView(float, float, float) メソッドおよび setPerspectiveView(float, float, int, int) メソッドとは排他的な関係です。 このメソッドを呼び出した後は、レンダリングは平行投影で処理されます。

パラメータ:
width - 投影面の幅を指定します。
height - 投影面の高さを指定します。
例外:
IllegalArgumentException - 引数 width, height のいずれかが 0 以下 の場合に発生します。

setPerspectiveView

public void setPerspectiveView(float zNear,
                               float zFar,
                               int width,
                               int height)

ニアクリップ面における投影面の幅および高さを指定して透視投影の設定を行います。

ニアクリップ面からファークリップ面までの図形がレンダリングされます。 パラメータは、視点座標系での距離や幅・高さを指定します。

このメソッドは、平行投影の設定機能である、 setParallelView(int, int) メソッドとは排他的な関係です。 このメソッドを呼び出した後は、レンダリングは全て透視投影で処理されます。

パラメータ:
zNear - カメラからニアクリップ面までの距離を指定します。
zFar - カメラからファークリップ面までの距離を指定します。
width - ニアクリップ面における投影面の幅を指定します。
height - ニアクリップ面における投影面の高さを指定します。
例外:
IllegalArgumentException - 引数 width, height のいずれかが 0 以下の場合に発生します。
IllegalArgumentException - 引数 zNear, zFar が、0 < zNear < zFar < 32768 を満たしていない場合に発生します。

setPerspectiveView

public void setPerspectiveView(float zNear,
                               float zFar,
                               float angle)

視野角を指定して透視投影の設定を行います。

ニアクリップ面からファークリップ面までの図形がレンダリングされます。 パラメータは、視点座標系での距離を指定します。

このメソッドは、平行投影の設定機能である、 setParallelView(int, int) メソッドとは排他的な関係です。 このメソッドを呼び出した後は、レンダリングは全て透視投影で処理されます。

パラメータ:
zNear - カメラからニアクリップ面までの距離を指定します。
zFar - カメラからファークリップ面までの距離を指定します。
angle - 視野角 (degree) を指定します。 有効範囲は 0度 < 視野角 < 180度です。
例外:
IllegalArgumentException - 引数 angle が 0 以下または 180 以上の場合に発生します。
IllegalArgumentException - 引数 zNear, zFar が、0 < zNear < zFar < 32768 を満たしていない場合に発生します。

flushBuffer

public void flushBuffer()

レンダリングバッファに蓄積された情報を用いて、 レンダリング結果を実描画領域に描画します。

このメソッドが終了後、レンダリング用バッファの内容は空になります。

まだレンダリングが行われていないとき、つまり、 レンダリングバッファの内容が空のときは、何もしません。 また、このときには例外は発生しません。

このメソッドの処理に限り、 setClipRectFor3D(int, int, int, int) メソッドによって設定されている クリッピング領域が利用されます。 この3D描画のためのクリッピング領域、および、 Graphics3D オブジェクト (Graphics オブジェクト) に設定されている 2D描画のためのクリッピング領域、この両方の情報を用いて、 レンダリング結果を実描画領域に描画します。 具体的には、両方の領域に属している場所は矩形で表現されますが、 この矩形を実描画領域に対するクリッピング領域とみなして、 描画処理を行います。

例外:
UnsupportedOperationException - 旧3Dグラフィックスの描画機能を利用した後に呼ばれた場合に発生します。
RuntimeException - ネイティブ処理においてメモリ不足やスタック不足、あるいは 各種の値に関するオーバフローによる副作用など、 特別な理由によって描画に失敗した場合に発生します。

setTransform

public void setTransform(Transform t)

視点座標への 変換行列 オブジェクトを設定します。

このメソッドでは、指定された 変換行列 オブジェクトの内容を内部処理により完全に複製します。 そのため、メソッドから戻った後に、 指定された 変換行列 を変更しても設定内容は 変わりません。

初期状態では、恒等変換を意味する行列が設定されています。

パラメータ:
t - 視点座標への 変換行列 オブジェクトを指定します。
例外:
NullPointerException - 引数 t に null が指定された場合に発生します。

addLight

public void addLight(Light light,
                     Transform transform)

レンダリング時にデフォルトで配置される 光源 を追加します。

レンダリング機能である renderObject3D(DrawableObject3D, Transform) 呼び出し時には、 setTransform(Transform) メソッドにより設定されている 変換行列 A に、指定された行列 変換行列 L を乗算した結果 (A x L) を 用いて、 光源 が持つベクトル情報を変換します。 その結果が、レンダリング用バッファに蓄積されます。 なおベクトルを変換する処理には、