INDEX
[Java]Java 3D API 学習中
1  NI-Lab.  2004/07/01(Thu) 22:35
[Java]Java 3D API 学習中
2  NI-Lab.  2004/07/01(Thu) 22:36
http://java.sun.com/products/java-media/3D/
Java 3D API

http://www.javaopen.org/j3dbook/
Java 3Dプログラミング・バイブル 書籍サポートページ

http://nikkeibp.jp/wcs/leaf/CID/onair/biztech/comp/316359
米Sun、「Project Looking Glass」「Java 3D」などをオープンソース化 - nikkeibp.jp - IT

3  NI-Lab.  2004/07/05(Mon) 22:58
参考書。けっこう丁寧に書かれているから、ありがたい。

http://www.amazon.co.jp/exec/obidos/ASIN/4816334300/nilab-22/
Java3Dプログラミング・バイブル
えんどう やすゆき (著), 平鍋 健児 (著), 安藤 幸央
単行本: 343 p ; サイズ(cm): 24
出版社: ナツメ社 ; ISBN: 4816334300 ; (2003/04)
4  NI-Lab.  2004/07/05(Mon) 22:58
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.mouse.*;

/**
* 回る回る色立方体。
*/
public class RotatableCube extends Applet {

public static void main(String[] args) {
RotatableCube applet = new RotatableCube();
MainFrame frame = new MainFrame(applet, 500, 500);
}

public RotatableCube() {

Canvas3D canvas = createCanvas3D();
BranchGroup scene = createSceneGraph();
SimpleUniverse universe = createSimpleUniverse(canvas);
universe.addBranchGraph(scene);

this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);
}

private Canvas3D createCanvas3D() {
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
return canvas;
}

private SimpleUniverse createSimpleUniverse(Canvas3D canvas) {
SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();
return universe;
}

private TransformGroup createTransformGroup() {

// 初回表示時の回転分
Transform3D t3d = new Transform3D();
t3d.rotX(Math.PI / 4.0);

//TransformGroup trans = new TransformGroup();
TransformGroup trans = new TransformGroup(t3d);

return trans;
}

private BranchGroup createSceneGraph() {

BranchGroup root = new BranchGroup();

TransformGroup trans = createTransformGroup();

// 実行中に Transform3D を変更できるようにする
// イベントによる変更が起きるために必要
trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
root.addChild(trans);

// イベント処理のときに、動作が有効になる領域
// 原点を中心とした半径100メートルの球
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);

// マウスによる回転
// 左ボタンを押しながら、マウスを動かす
MouseRotate mouseRotate = new MouseRotate(trans);
mouseRotate.setSchedulingBounds(bounds);
root.addChild(mouseRotate);

// マウスによる移動(x軸, y軸方向)
// 右ボタンを押しながら、マウスを動かす
MouseTranslate mouseTranslate = new MouseTranslate(trans);
mouseTranslate.setSchedulingBounds(bounds);
root.addChild(mouseTranslate);

// マウスによるズーム(z軸方向への移動)
// [Alt]+左ボタン(Unix系では中ボタン?)を押しながら、マウスを動かす
MouseZoom mouseZoom = new MouseZoom(trans);
mouseZoom.setSchedulingBounds(bounds);
root.addChild(mouseZoom);

// 立方体を追加
trans.addChild(new ColorCube(0.4));

return root;
}

}

5  NI-Lab.  2004/07/05(Mon) 23:00
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.mouse.*;

/**
* 複数の色立方体。ひとつは固定。
*/
public class MultipleCube extends Applet {

public static void main(String[] args) {
MultipleCube applet = new MultipleCube();
MainFrame frame = new MainFrame(applet, 500, 500);
}

public MultipleCube() {

Canvas3D canvas = createCanvas3D();
BranchGroup scene = createSceneGraph();
SimpleUniverse universe = createSimpleUniverse(canvas);
universe.addBranchGraph(scene);

this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);
}

private Canvas3D createCanvas3D() {
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
return canvas;
}

private SimpleUniverse createSimpleUniverse(Canvas3D canvas) {
SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();
return universe;
}

private TransformGroup createTransformGroup() {

// 初回表示時の回転分
Transform3D t3d = new Transform3D();
t3d.rotX(Math.PI / 4.0);
Transform3D rotateY = new Transform3D();
rotateY.rotY(Math.PI / 5.0);
t3d.mul(rotateY);
Transform3D rotateZ = new Transform3D();
rotateZ.rotZ(Math.PI / 6.0);
t3d.mul(rotateZ);

//TransformGroup trans = new TransformGroup();
TransformGroup trans = new TransformGroup(t3d);

return trans;
}


6  NI-Lab.  2004/07/05(Mon) 23:00
>>5 の続き。

private TransformGroup createTransformGroup2() {

// 初回表示時の回転分
Transform3D t3d = new Transform3D();
t3d.setTranslation(new Vector3d(0.0, 0.2, 0.0));
t3d.setScale(new Vector3d(0.2, 0.4, 0.6));
t3d.rotX(Math.PI / 4.0);
Transform3D rotateY = new Transform3D();
rotateY.rotY(Math.PI / 4.0);
t3d.mul(rotateY);

TransformGroup trans = new TransformGroup(t3d);

return trans;
}

private BranchGroup createSceneGraph() {

BranchGroup root = new BranchGroup();

TransformGroup trans = createTransformGroup();

// 実行中に Transform3D を変更できるようにする
// イベントによる変更が起きるために必要
trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
root.addChild(trans);

// イベント処理のときに、動作が有効になる領域
// 原点を中心とした半径100メートルの球
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);

// マウスによる回転
MouseRotate mouseRotate = new MouseRotate(trans);
mouseRotate.setSchedulingBounds(bounds);
root.addChild(mouseRotate);

// マウスによる移動(x軸, y軸方向)
MouseTranslate mouseTranslate = new MouseTranslate(trans);
mouseTranslate.setSchedulingBounds(bounds);
root.addChild(mouseTranslate);

// マウスによるズーム(z軸方向への移動)
MouseZoom mouseZoom = new MouseZoom(trans);
mouseZoom.setSchedulingBounds(bounds);
root.addChild(mouseZoom);

// 立方体を追加
trans.addChild(new ColorCube(0.4));

// もうひとつ立方体を追加
TransformGroup trans2 = createTransformGroup2();
trans2.addChild(new ColorCube(0.4));
root.addChild(trans2);

return root;
}

}

7  NI-Lab.  2004/07/07(Wed) 21:26
http://www.objectclub.jp/download/vecmath1
ObjectClub - vecmath package(日)

>unficial Java3 vecmath package

>Java(TM) 3D API 1.2 で仕様が公開されている,javax.vecmath パッケージの,非公式な実装(java ソースコード)です.
>このパッケージには,3次元の点,ベクトル,4次元のベクトル,4x4, 3x3 行列,Quaternion, 回転軸と角度の組合せなどなど,コンピュータグラフィックスでよく使われるクラスを含んでいます.ほとんどのクラスは,単精度と倍精度のバージョンがあります.一般の行列の LU 分解や SVD も実装されています.

すばらしい!

>See vecmath を理解するための数学(PDF)

というドキュメントもある。

>C++ port
>javax.vecmath を C++ に移植することにしました.vecmath の仕様がユニークであるため,高速な平行 C++ バージョンが作成できる,と考えたからです.

参考になるリンクも多い。
8  NI-Lab.  2004/07/07(Wed) 22:57
// 地球の画像(じゃなくてもいいけど) resource/earth.jpg を適当に用意して、

import java.applet.*;
import java.awt.*;
import java.net.*;
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.image.*;

/**
* 地球儀。
*/
public class Globe extends Applet {

public static void main(String[] args) {
Globe applet = new Globe();
MainFrame frame = new MainFrame(applet, 500, 500);
}

public Globe() {

Canvas3D canvas = createCanvas3D();
BranchGroup scene = createSceneGraph();
SimpleUniverse universe = createSimpleUniverse(canvas);
universe.addBranchGraph(scene);

this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);
}

private Canvas3D createCanvas3D() {
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
return canvas;
}

private SimpleUniverse createSimpleUniverse(Canvas3D canvas) {
SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();
return universe;
}

private TransformGroup createTransformGroup() {

// 初回表示時の回転分
Transform3D t3d = new Transform3D();
t3d.rotX(Math.PI / 4.0);

//TransformGroup trans = new TransformGroup();
TransformGroup trans = new TransformGroup(t3d);

return trans;
}

9  NI-Lab.  2004/07/07(Wed) 22:57
>>8 の続き

private BranchGroup createSceneGraph() {

BranchGroup root = new BranchGroup();

TransformGroup trans = createTransformGroup();

// 実行中に Transform3D を変更できるようにする
// イベントによる変更が起きるために必要
trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
root.addChild(trans);

// イベント処理のときに、動作が有効になる領域
// 原点を中心とした半径100メートルの球
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);

// マウスによる回転
MouseRotate mouseRotate = new MouseRotate(trans);
mouseRotate.setSchedulingBounds(bounds);
root.addChild(mouseRotate);

// マウスによる移動(x軸, y軸方向)
MouseTranslate mouseTranslate = new MouseTranslate(trans);
mouseTranslate.setSchedulingBounds(bounds);
root.addChild(mouseTranslate);

// マウスによるズーム(z軸方向への移動)
MouseZoom mouseZoom = new MouseZoom(trans);
mouseZoom.setSchedulingBounds(bounds);
root.addChild(mouseZoom);

// 球体を追加
Sphere globe = createGlobe();
trans.addChild(globe);

return root;
}

private Image getImage(String filename) {

Image image;

URL codeBase;
try {
codeBase = getCodeBase();
} catch (NullPointerException e) {
e.printStackTrace();
codeBase = null;
}

if (codeBase == null) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
image = toolkit.getImage(filename);
} else {
image = getImage(getCodeBase(), filename);
}
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
mt.checkAll(true);
try {
mt.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
return image;
}

private Sphere createGlobe() {

Image image = getImage("resource/earth.jpg");

Appearance app = new Appearance();
Texture texture = new TextureLoader(image, this).getTexture();
app.setTexture(texture);

Sphere globe = new Sphere(0.4f, Sphere.GENERATE_TEXTURE_COORDS, app);
return globe;
}

}

10  NI-Lab.  2004/07/07(Wed) 22:58
8〜9と同じく、地球の画像を用意してから実行。
ぐるぐる回るよ地球儀。

import java.applet.*;
import java.awt.*;
import java.net.*;
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.image.*;

/**
* 自転する地球儀。
*/

public class DailyRoundingGlobe extends Applet {

public static void main(String[] args) {
DailyRoundingGlobe applet = new DailyRoundingGlobe();
MainFrame frame = new MainFrame(applet, 500, 500);
}

public DailyRoundingGlobe() {

Canvas3D canvas = createCanvas3D();
BranchGroup scene = createSceneGraph();
SimpleUniverse universe = createSimpleUniverse(canvas);
universe.addBranchGraph(scene);

this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);
}

private Canvas3D createCanvas3D() {
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
return canvas;
}

private SimpleUniverse createSimpleUniverse(Canvas3D canvas) {
SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();
return universe;
}


11  NI-Lab.  2004/07/07(Wed) 22:59
>>10 の続き。

private BranchGroup createSceneGraph() {

BranchGroup root = new BranchGroup();

// イベント処理のときに、動作が有効になる領域
// 原点を中心とした半径100メートルの球
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);

// マウス操作用 TransformGroup
TransformGroup mouseTrans = new TransformGroup();
mouseTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
mouseTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
root.addChild(mouseTrans);

// マウスによる回転
MouseRotate mouseRotate = new MouseRotate(mouseTrans);
mouseRotate.setSchedulingBounds(bounds);
root.addChild(mouseRotate);

// マウスによる移動(x軸, y軸方向)
MouseTranslate mouseTranslate = new MouseTranslate(mouseTrans);
mouseTranslate.setSchedulingBounds(bounds);
root.addChild(mouseTranslate);

// マウスによるズーム(z軸方向への移動)
MouseZoom mouseZoom = new MouseZoom(mouseTrans);
mouseZoom.setSchedulingBounds(bounds);
root.addChild(mouseZoom);

// 自転用TransformGroup
TransformGroup rotationTrans = new TransformGroup();
rotationTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
rotationTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
mouseTrans.addChild(rotationTrans);

// 自転用Interpolator
Alpha alpha = new Alpha(-1, 10000); // 繰り返し回数無制限, 10000ミリ秒で1回
RotationInterpolator rotationInterpolator =
new RotationInterpolator(alpha, rotationTrans);
rotationInterpolator.setSchedulingBounds(bounds);
root.addChild(rotationInterpolator);

// 自転する球体を追加
Sphere globe = createGlobe();
rotationTrans.addChild(globe); // 自転用 TransformGroup に追加

return root;
}

private Image getImage(String filename) {

Image image;

URL codeBase;
try {
codeBase = getCodeBase();
} catch (NullPointerException e) {
e.printStackTrace();
codeBase = null;
}

if (codeBase == null) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
image = toolkit.getImage(filename);
} else {
image = getImage(getCodeBase(), filename);
}
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
mt.checkAll(true);
try {
mt.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
return image;
}

private Sphere createGlobe() {

Image image = getImage("resource/earth.jpg");

Appearance app = new Appearance();
Texture texture = new TextureLoader(image, this).getTexture();
app.setTexture(texture);

Sphere globe = new Sphere(0.4f, Sphere.GENERATE_TEXTURE_COORDS, app);
return globe;
}

}

12  NI-Lab.  2004/07/07(Wed) 23:01
こんな感じでサンプルを追加していく予定。

サンプルは、↓この書籍を参考にしている。

http://www.amazon.co.jp/exec/obidos/ASIN/4816334300/nilab-22/
Java3Dプログラミング・バイブル

13  NI-Lab.  2004/07/07(Wed) 23:03
http://www.amazon.co.jp/exec/obidos/ASIN/4798007072/nilab-22/
Java 3Dグラフィック完全解説
安井 健治郎 (著)
単行本: 357 p ; サイズ(cm): 24
出版社: 秀和システム ; ISBN: 4798007072 ; (2004/03)
14  NI-Lab.  2004/07/07(Wed) 23:04
http://www.amazon.co.jp/exec/obidos/ASIN/4756130178/nilab-22/
The Java 3D API仕様 JAVAシリーズ
Henry Sowizral (著), Kevin Rushforth (著), Michael Deering (著), 竹内 里佳, 安藤 幸央
単行本(ソフトカバー): 495 p ; サイズ(cm): 24
出版社: アスキー ; ISBN: 4756130178 ; (1999/01)
15  NI-Lab.  2004/07/07(Wed) 23:05
これは Java 3D API 関連じゃないのかな?

http://www.amazon.co.jp/exec/obidos/ASIN/4894712318/nilab-22/
AVA+VRML―JavaとVRML2.0で作るインタラクティブ3Dワールド Internet books
ロジャー・リー (著), 松田 晃一, 宮下 健
単行本: 354 p ; サイズ(cm):
出版社: ピアソン・エデュケーション ; ISBN: 4894712318 ; (2000/05)

16  NI-Lab.  2004/07/10(Sat) 08:30
import java.applet.*;
import java.awt.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;

/**
* 平面図形。
*/
public class FlatFigure extends Applet {

public static void main(String[] args) {
FlatFigure applet = new FlatFigure();
MainFrame frame = new MainFrame(applet, 500, 500);
}

public FlatFigure() {

GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();

Canvas3D canvas = new Canvas3D(config);

this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);

SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();

BranchGroup scene = new BranchGroup();
TransformGroup mouseTrans = setMouseBehaviors(scene);
mouseTrans.addChild(createShape3D());

universe.addBranchGraph(scene);
}

private Shape3D createShape3D() {

Point3d[] vertices = new Point3d[10];

vertices[0] = new Point3d(0.0, 1.0, 0.0);
vertices[1] = new Point3d(-1.2, 0.5, 0.0);

vertices[2] = new Point3d(-1.2, 0.5, 0.0);
vertices[3] = new Point3d(-0.5, -0.8, 0.0);

vertices[4] = new Point3d(-0.5, -0.8, 0.0);
vertices[5] = new Point3d(0.5, -0.8, 0.0);

vertices[6] = new Point3d(0.5, -0.8, 0.0);
vertices[7] = new Point3d(1.2, 0.5, 0.0);

vertices[8] = new Point3d(1.2, 0.5, 0.0);
vertices[9] = new Point3d(0.0, 1.0, 0.0);

LineArray geometry =
new LineArray(vertices.length, LineArray.COORDINATES);
geometry.setCoordinates(0, vertices);

Shape3D shape = new Shape3D(geometry);

return shape;
}

private TransformGroup setMouseBehaviors(BranchGroup root) {

// イベント処理のときに、動作が有効になる領域
// 原点を中心とした半径100メートルの球
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);

// マウス操作用 TransformGroup
TransformGroup mouseTrans = new TransformGroup();
mouseTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
mouseTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
root.addChild(mouseTrans);

// マウスによる回転
MouseRotate mouseRotate = new MouseRotate(mouseTrans);
mouseRotate.setSchedulingBounds(bounds);
root.addChild(mouseRotate);

// マウスによる移動(x軸, y軸方向)
MouseTranslate mouseTranslate = new MouseTranslate(mouseTrans);
mouseTranslate.setSchedulingBounds(bounds);
root.addChild(mouseTranslate);

// マウスによるズーム(z軸方向への移動)
MouseZoom mouseZoom = new MouseZoom(mouseTrans);
mouseZoom.setSchedulingBounds(bounds);
root.addChild(mouseZoom);

return mouseTrans;
}

}

17  NI-Lab.  2004/07/10(Sat) 08:34
setMouseBehaviors メソッドは >>16 と同じ。

import java.applet.*;
import java.awt.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;

/**
* カラフルなピラミッド。
*/
public class TriangularPyramid extends Applet {

public static void main(String[] args) {
TriangularPyramid applet = new TriangularPyramid();
MainFrame frame = new MainFrame(applet, 500, 500);
}

// point
private static final Point3d[] PYRAMID_POINT = {
new Point3d(0.0, 0.865, -0.29),
new Point3d(-0.5, 0.0, 0.0),
new Point3d(0.0, 0.0, -0.865),
new Point3d(0.5, 0.0, 0.0),
};

// point index
private static final int A = 0;
private static final int B = 1;
private static final int C = 2;
private static final int D = 3;

// color
private static final Color3f RED = new Color3f(1.0f, 0.0f, 0.0f);
private static final Color3f GREEN = new Color3f(0.0f, 1.0f, 0.0f);
private static final Color3f BLUE = new Color3f(0.0f, 0.0f, 1.0f);
private static final Color3f YELLOW = new Color3f(1.0f, 1.0f, 0.0f);

// point - color
private static final Color3f[] colors = new Color3f[4];
{
colors[A] = RED;
colors[B] = GREEN;
colors[C] = BLUE;
colors[D] = YELLOW;
}

public TriangularPyramid() {

GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();

Canvas3D canvas = new Canvas3D(config);

this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);

SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();

BranchGroup scene = new BranchGroup();
TransformGroup mouseTrans = setMouseBehaviors(scene);
mouseTrans.addChild(createShape3D());

universe.addBranchGraph(scene);
}

private Shape3D createShape3D() {

int[] indices = {
A, B, D, // a side
A, C, B, // a side
A, D, C, // a side
B, C, D, // a side
};

IndexedTriangleArray geometry =
new IndexedTriangleArray(
PYRAMID_POINT.length,
IndexedQuadArray.COORDINATES | IndexedQuadArray.COLOR_3,
indices.length);

geometry.setCoordinates(0, PYRAMID_POINT);
geometry.setCoordinateIndices(0, indices);
geometry.setColors(0, colors);
geometry.setColorIndices(0, indices);

Shape3D shape = new Shape3D(geometry);

return shape;
}


18  NI-Lab.  2004/07/10(Sat) 08:44
http://java.sun.com/developer/onlineTraining/java3d/
Java 3D API Tutorial

http://www.excite.co.jp/world/english/web/body?wb_url=http://java.sun.com%2Fdeveloper%2FonlineTraining%2Fjava3d%2F&wb_lp=ENJA&wb_dis=3
Java 3D API Tutorial[Java 3D APIチュートリアル ]

19  NI-Lab.  2004/07/10(Sat) 08:45
http://www.gimlay.org/~andoh/java/3d/j3faq.html
Java3D FAQ
Japanese Frequently Asked Questions about Java3D
20  NI-Lab.  2004/07/10(Sat) 08:45
http://www.antun.net/tips/java3d/ml/index.html
Atsushi's Homepage 〜 Java3Djpメーリングリスト
21  NI-Lab.  2004/07/10(Sat) 08:47
http://www.asahi-net.or.jp/~cs8k-cyu/java3d/index.html
ABA Games - Java 3D

http://www.asahi-net.or.jp/~cs8k-cyu/java3d/java3d_faq.html
Java 3D 自分FAQ

22  NI-Lab.  2004/07/13(Tue) 21:17
http://www.amazon.co.jp/exec/obidos/ASIN/4797820551/nilab-22/
広内 哲夫 著 / Java3Dグラフィックス―Web上で動く3DCG 基礎から立体アニメーションまで

23  NI-Lab.  2004/07/16(Fri) 22:32
Java3D & Blender

http://www.blender3d.com/
blender3d.org

http://blend2java.sourceforge.net/
blend2java

>This is the amazing Python script for exporting blender models to XML that can be loaded by the standard java.beans.XMLDecoder class (since 1.4) and cast to the standard Java3D Shape3D object. All clear now?
>
>This allows you to take your amazing Blender models, and bring them across into your Java3D game / app / whatever.
>
>You'll need:
> Blender 2.25 or newer (could work with older ones, never used to) from www.blender.org
> Java from java.sun.com (1.4 is when the java.beans.XMLDecoder arrived)
> Java3D from java.sun.com/products/java-media/3D/
> A reasonable understanding of Blender and Java3d

24  NI-Lab.  2004/07/16(Fri) 22:32
http://www.amazon.co.jp/exec/obidos/ASIN/4274064670/nilab-22/
Blender Advanced Guide
田崎 進一 (著), 斉藤 寛 (著), 中村 達也
価格: ¥3,990 (税込)
単行本: 376 p ; サイズ(cm): 23.524 x 18.3
出版社: オーム社 ; ISBN: 4274064670 ; (2003/11)

25  NI-Lab.  2004/07/16(Fri) 22:34
なんだかサンプル(実験)コードとはいえ、
同じようなコードが重複しているので、
とりあえず、サンプル用ユーティリティクラスにまとめてみた。

import java.applet.*;
import java.awt.*;
import java.net.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.universe.*;

public final class Utils {

public static Canvas3D createCanvas3D() {
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
return canvas;
}

public static SimpleUniverse createSimpleUniverse(Canvas3D canvas) {
SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();
return universe;
}

public static Image getImage(Applet applet, String filename) {

Image image;

URL codeBase;
try {
codeBase = applet.getCodeBase();
} catch (NullPointerException e) {
e.printStackTrace();
codeBase = null;
}

if (codeBase == null) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
image = toolkit.getImage(filename);
} else {
image = applet.getImage(applet.getCodeBase(), filename);
}
MediaTracker mt = new MediaTracker(applet);
mt.addImage(image, 0);
mt.checkAll(true);
try {
mt.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
return image;
}

public static TransformGroup setMouseBehaviors(BranchGroup root) {

// イベント処理のときに、動作が有効になる領域
// 原点を中心とした半径100メートルの球
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);

// マウス操作用 TransformGroup
TransformGroup mouseTrans = new TransformGroup();
mouseTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
mouseTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
root.addChild(mouseTrans);

// マウスによる回転
MouseRotate mouseRotate = new MouseRotate(mouseTrans);
mouseRotate.setSchedulingBounds(bounds);
root.addChild(mouseRotate);

// マウスによる移動(x軸, y軸方向)
MouseTranslate mouseTranslate = new MouseTranslate(mouseTrans);
mouseTranslate.setSchedulingBounds(bounds);
root.addChild(mouseTranslate);

// マウスによるズーム(z軸方向への移動)
MouseZoom mouseZoom = new MouseZoom(mouseTrans);
mouseZoom.setSchedulingBounds(bounds);
root.addChild(mouseZoom);

return mouseTrans;
}

}


26  NI-Lab.  2004/07/16(Fri) 22:36
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.universe.*;

/**
* 平面テクスチャ画像。
*/
public class SquareTexture extends Applet {

public static void main(String[] args) {
SquareTexture applet = new SquareTexture();
MainFrame frame = new MainFrame(applet, 500, 500);
}

public SquareTexture() {

GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();

Canvas3D canvas = new Canvas3D(config);

this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);

SimpleUniverse universe = new SimpleUniverse(canvas);
universe.getViewingPlatform().setNominalViewingTransform();

BranchGroup scene = new BranchGroup();
TransformGroup mouseTrans = Utils.setMouseBehaviors(scene);
mouseTrans.addChild(createShape3D());

universe.addBranchGraph(scene);
}

private Appearance createTexturedAppearance(){

Image image = Utils.getImage(this, "resource/test.png");

BufferedImage bimage =
new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
int[] imagefield =
((DataBufferInt) bimage.getRaster().getDataBuffer()).getData();
PixelGrabber pg =
new PixelGrabber(image, 0, 0, 256, 256, imagefield, 0, 256);
try {
pg.grabPixels();
} catch (InterruptedException e) {
e.printStackTrace();
}

ImageComponent2D icompo2d =
new ImageComponent2D(ImageComponent2D.FORMAT_RGBA, bimage);

int imageWidth = 256;
int imageHeight = 256;
Texture2D texture2d =
new Texture2D(Texture2D.BASE_LEVEL, Texture2D.RGBA, imageWidth, imageHeight);
texture2d.setImage(0, icompo2d);

Appearance app = new Appearance();
app.setTexture(texture2d);

TransparencyAttributes tattr =
new TransparencyAttributes(TransparencyAttributes.BLENDED, 1.0f);
app.setTransparencyAttributes(tattr);

return app;
}


27  NI-Lab.  2004/07/16(Fri) 22:36
>>26 のつづき。

private Shape3D createShape3D() {

// 3+-----+2
// | |
// | |
// 0+-----+1

// 頂点配列
Point3d[] vertices = new Point3d[4];
vertices[0] = new Point3d(-0.8, -0.8, 0.0); // 左下
vertices[1] = new Point3d(0.8, -0.8, 0.0); // 右下
vertices[2] = new Point3d(0.8, 0.8, 0.0); // 右上
vertices[3] = new Point3d(-0.8, 0.8, 0.0); // 左上

// テクスチャ座標
TexCoord2f[] txcoords = new TexCoord2f[4];
txcoords[0] = new TexCoord2f(0.0f, 0.0f); // 左下
txcoords[1] = new TexCoord2f(1.0f, 0.0f); // 右下
txcoords[2] = new TexCoord2f(1.0f, 1.0f); // 右上
txcoords[3] = new TexCoord2f(0.0f, 1.0f); // 左上

QuadArray geom =
new QuadArray(
vertices.length,
QuadArray.COORDINATES | QuadArray.TEXTURE_COORDINATE_2);
geom.setCoordinates(0, vertices);
geom.setTextureCoordinates(0, 0, txcoords);

Appearance app = createTexturedAppearance();
Shape3D grid = new Shape3D(geom, app);
grid.setCapability(Shape3D.ALLOW_GEOMETRY_READ);

return grid;
}

}

28  NI-Lab.  2004/07/16(Fri) 22:37
import java.applet.*;
import java.awt.*;
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.*;

/**
* 地球儀と赤球。
*/
public class LightingGlobe extends Applet {

public static void main(String[] args) {
LightingGlobe applet = new LightingGlobe();
MainFrame frame = new MainFrame(applet, 500, 500);
}

public LightingGlobe() {

Canvas3D canvas = Utils.createCanvas3D();
SimpleUniverse universe = Utils.createSimpleUniverse(canvas);

BranchGroup scene = createSceneGraph();
universe.addBranchGraph(scene);

this.setLayout(new BorderLayout());
this.add(canvas, BorderLayout.CENTER);
}

private static Light createLight() {

DirectionalLight light = new DirectionalLight();

// 光源の色
//Color3f color = new Color3f(1.0f, 0.0f, 0.0f); // red
Color3f color = new Color3f(1.0f, 1.0f, 1.0f);
light.setColor(color);

// 光源の方向
Vector3f vector = new Vector3f(-1.0f, -1.0f, -1.0f);
light.setDirection(vector);

// 照明が有効になる領域(作用領域)
BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
light.setInfluencingBounds(bounds);

return light;
}


29  NI-Lab.  2004/07/16(Fri) 22:37
>>28 のつづき。

private BranchGroup createSceneGraph() {

// * structure *
//
// root - light
// - mouseTrans - globe
// - redBallTrans - redBall
//

BranchGroup root = new BranchGroup();

Light light = createLight();
root.addChild(light);

Sphere globe = createGlobe();
Sphere redBall = createRedBall();

Transform3D t3d = new Transform3D();
t3d.setTranslation(new Vector3d(-1.0, 0.0, 0.0));
TransformGroup redBallTrans = new TransformGroup(t3d);
redBallTrans.addChild(redBall);

TransformGroup mouseTrans = Utils.setMouseBehaviors(root);
mouseTrans.addChild(globe);
mouseTrans.addChild(redBallTrans);

return root;
}

private Sphere createRedBall() {
Material m = new Material();
m.setDiffuseColor(new Color3f(0.8f, 0.0f, 0.0f)); // 拡散反射による色
Appearance app = new Appearance();
app.setMaterial(m);
Sphere globe = new Sphere(0.4f, app);
return globe;
}

private Sphere createGlobe() {

Image image = Utils.getImage(this, "resource/earth.jpg");

Appearance app = new Appearance();
Texture texture = new TextureLoader(image, this).getTexture();
app.setTexture(texture);

Material m = new Material();
app.setMaterial(m);

Sphere globe =
new Sphere(
0.2f,
Sphere.GENERATE_TEXTURE_COORDS | Sphere.GENERATE_NORMALS,
app);
return globe;
}

}

30  NI-Lab.  2004/08/11(Wed) 21:18
http://www.asahi-net.or.jp/~cs8k-cyu/java3d/java3d_faq.html
Java3D FAQ

http://cgi14.plala.or.jp/antun/java3d/index.shtml
Java3D Tips

http://www.gihyo.co.jp/javapress/java1/java3d.html
JavaPressのJava3D記事のソースコード

http://javadrive.tripod.co.jp/java3d/
Java3Dの使い方

http://www.people.or.jp/~npaka/java3d/java3d.html
Java3D 工房

http://www.geocities.co.jp/SilkRoad/5552/Java3DMain.html
Java3Dなページ