簡単なプログラム


先ほどのアプレットは、二つのクラスから成っています。
それぞれ、

という名前です。
SimpleF4 クラスは、Java3D API に含まれる Shape3D を拡張したクラスで、
Geometry として、一つの TriangleArray ジオメトリを保持します。

j3d01 クラスがアプレットの本体です。
これには、Java3D API が提供する Canvas3D をセットアップして、
3D グラフィクスを表示する環境を用意し、そこに、SimpleF4 オブジェクトを
表示させる機能を持たせてあります。

なお、ソースファイルのファイル名は、j3d01.java である必要があります。

以下にソースプログラムを掲載します。

解説は、次ページ
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

class SimpleF4 extends Shape3D{
private static final Point3f[] mVertices ={
new Point3f(-1.0f,-1.0f, 0.0f),
new Point3f( 1.0f, 1.0f, 0.0f),
new Point3f( 1.0f,-1.0f, 0.0f),
new Point3f(-1.0f,-1.0f, 0.0f),
new Point3f(-1.0f, 1.0f, 0.0f),
new Point3f( 1.0f, 1.0f, 0.0f)
};
private TriangleArray mGeometry;

public SimpleF4(){
int i;
mGeometry = new TriangleArray(6,TriangleArray.COORDINATES |
TriangleArray.NORMALS | TriangleArray.COLOR_3);
mGeometry.setCoordinates(0,mVertices);
for(i = 0; i < 3; ++i){
mGeometry.setColor(i,new Color3b((byte)255,(byte)192,(byte)128));
}
for(i = 3; i < 6; ++i){
mGeometry.setColor(i,new Color3b((byte)128,(byte)192,(byte)255));
}
Vector3f normal = new Vector3f(0.0f,0.0f, -1.0f);
for (i = 0; i < 6; ++i){
mGeometry.setNormal(i,normal);
}
this.setGeometry(mGeometry);
}
}

public class j3d01 extends java.applet.Applet implements Runnable{
boolean mInited = false;
Color mBgColor = new Color(36,120,120);
Canvas3D mCanvas = null;
Thread mThread = null;
boolean mLoop=false;
long mCycle = 6000;
long mTick = 0;
long mTimeOld;
float mFInterval = 1.0f / 2000.0f;
float m_fX=0.0f, m_fY=0.0f, m_fZ=1.5f;
SimpleUniverse mUniv;
Transform3D mTrans1 = new Transform3D();
Transform3D mTrans2 = new Transform3D();
SimpleF4 mF4 = null;

public void init() {
setLayout(null);
mCanvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
add(mCanvas);
Dimension d = this.getSize();
mCanvas.setBounds(0,0,d.width,d.height);
mCanvas.stopRenderer();
mCanvas.setDoubleBufferEnable(true);
createSceneGraph();
setupView();
mTimeOld = System.currentTimeMillis();
mInited = true;
}
public void destroy(){
mLoop = false;
mUniv.removeAllLocales();
}
private void setupView(){
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);
}
public void createSceneGraph() {
Material mat;
Light lit1;

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);

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)));
}
public void render(){
GraphicsContext3D gc;
double angle;
angle = (float)mTick * mFInterval;
angle *= Math.PI * 2.0;
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();
}

public void start() {
mLoop = true;
if(mThread == null) {
mThread = new Thread(this);
mThread.start();
}else{
if (!mThread.isAlive()){
mThread = new Thread(this);
mThread.start();
}
}
}
public void stop() {
mLoop = false;
}
public void run(){
long current,elapsed;
while(mLoop){
current = System.currentTimeMillis();
elapsed = current - mTimeOld;
if ( elapsed > 15){
mTimeOld = current;
mTick += elapsed;
mTick %= mCycle;
if (mInited){
render();
}
}
mThread.yield();
}
}
}