プログラム解説


では解説しましょう。
まずは、初期化処理から。

【初期化処理1】

setLayout(null);
mCanvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
add(mCanvas);
Dimension d = this.getSize();
mCanvas.setBounds(0,0,d.width,d.height);

リスト内の上記の部分は、Canvas3D クラスのインスタンスを生成し、 アプレット全体に表示させています。
Canvas3D の生成にはグラフィクスのコンフィギュレーションが必要なのですが、 Java3D 付属のサンプルでも SimpleUniverse.getPreferredConfiguration を 使っているので、これで充分でしょう。


【初期化処理2】

mCanvas.stopRenderer();
mCanvas.setDoubleBufferEnable(true);

Canvas3D は自動的にレンダリングする機能があるのですが、使い勝手はもうひとつ。 今回は使いません。その機能をstopRenderer で止めています。
それからダブルバッファを有効にしています。ダブルバッファはDirectX で言う フリッピングの事だと思われます。


【初期化処理3】

mat = new Material();
mat.setAmbientColor(0.5f, 0.5f, 0.5f);
mat.setLightingEnable(true);
Appearance app = new Appearance();
app.setMaterial(mat);
mCanvas.getGraphicsContext3D().setAppearance(app);

Material をひとつ生成して、Appearance に登録。 そのAppearance を、Canvas3D に登録。


【初期化処理4】

mF4 = new SimpleF4();
mF4.setAppearance(app);
Color3f lColor1 = new Color3f(1.0f,1.0f,1.0f);
Vector3f lDir1 = new Vector3f(0.0f, 1.0f, 1.0f);
lit1 = new DirectionalLight(lColor1, lDir1);
mCanvas.getGraphicsContext3D().addLight(lit1);
mCanvas.getGraphicsContext3D().addLight(new AmbientLight(true, new Color3f(0.7f, 0.7f, 0.7f)));

Shape3D クラスを継承した単なる四角ポリゴンの SimpleF4 クラスを生成。
Shape3D にも、先ほどのAppearance を登録。
有向光源(DirectionalLight) を一つ生成・登録
アンビエント光源(AmbientLight) を一つ生成・登録。


【初期化処理5】

Transform3D pers = new Transform3D();
Transform3D lookat = new Transform3D();
mUniv = new SimpleUniverse(mCanvas);
lookat.set(Transform3D.ZERO);
pers.set(Transform3D.ZERO);
lookat.lookAt(new Point3d(0.0,0.0,0.0), new Point3d(0.0,0.0,1.0), new Vector3d(0.0,-1.0,0.0));
pers.perspective(Math.toRadians(90.0), 1.0, 0.01, 100.0);
mCanvas.getView().setWindowEyepointPolicy(View.RELATIVE_TO_COEXISTENCE);
mCanvas.getView().setProjectionPolicy(View.PERSPECTIVE_PROJECTION);
mCanvas.getView().setCompatibilityModeEnable(true);
mCanvas.getView().setVpcToEc(lookat);
mCanvas.setMonoscopicViewPolicy(View.LEFT_EYE_VIEW);
mCanvas.getView().setLeftProjection(pers);
mCanvas.getView().setScreenScalePolicy(View.SCALE_SCREEN_SIZE);

この部分は、3Dグラフィクスを表示する時の視点・・・・。
(つまり、カメラみたいなもの)を生成しています。

始点は原点(0,0,0)にあり、Z軸の値が上昇する方向を向いている。
画面の上方向(撮影者の頭のてっぺん)は、Y軸が減少する方向に向いている。
画角は、X方向に90°
画面の縦横比は 1.0 (縦横が同じ)
HMDは使わない。

とりあえず、こんな設定です。詳しくは SDK 付属ドキュメントをあたって下さい。

CompatibilityModeEnable ってのが厄介でした、これはHMDを使わない設定だと考えて良いでしょう。


【描画処理 関数(render)】

gc = mCanvas.getGraphicsContext3D();
mTrans1.set(Transform3D.ZERO);
mTrans1.setTranslation(new Vector3f(m_fX,-m_fY,m_fZ));
mTrans2.set(Transform3D.ZERO);
mTrans2.rotY(angle);
mTrans1.mul(mTrans2);
gc.clear();
gc.setModelTransform(mTrans1);
gc.draw(mF4);
mCanvas.swap();

上記の処理は、

・Canvas3D の持つ、GraphicsContext3D を取得、
・setTranslation で移動マトリクスを算出、
・rotY で回転マトリクスを算出(Y軸での回転)
・それらを乗算してsetModelTransform で GraphicsContext3D へ登録。

・画面をクリア gc.clear();
・Shape3D オブジェクトを描画
・画面をフリップ

以上です。

次へ