package framework.test;
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.Clip;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Texture;
import javax.media.j3d.Texture2D;
import javax.media.j3d.Transform3D;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.image.TextureLoader;
import framework.RWT.RWTFrame3D;
import framework.RWT.RWTCanvas3D;
import framework.animation.Animation3D;
import framework.animation.AnimationFactory;
import framework.animation.PartAnimation;
import framework.animation.Pose3D;
import framework.model3D.Model3D;
import framework.model3D.ModelFactory;
import framework.model3D.Object3D;
import framework.model3D.Position3D;
import framework.model3D.Universe;
import framework.view3D.Camera3D;
public class TestAnimation {
/**
* @param args
*/
public TestAnimation() {
// TODO Auto-generated method stub
RWTFrame3D frame = new RWTFrame3D();
RWTCanvas3D canvas = new RWTCanvas3D();
frame.add(canvas);
// Model3D model = ModelFactory.loadModel("data\\Head4.wrl");
Model3D model = ModelFactory.loadModel("data\\pocha\\pocha.wrl");
Object3D obj = model.createObject();
Transform3D s = new Transform3D();
((Object3D)obj.children[0]).scale.setTransform(s);
// --- ここから、テクスチャ張り替えのテスト用コード
// BufferedImage image1 = null, image2 = null, image3 = null;
// try {
// image1 = ImageIO.read(new File("data\\black.jpg"));
// image2 = ImageIO.read(new File("data\\gray.jpg"));
// image3 = ImageIO.read(new File("data\\white.jpg"));
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// Object3D body = obj.getPart("Body");
// Shape3D shape = body.children[0].getShape3D();
// shape.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
// shape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
// if (true) {
// // Appearance以下、全部設定
// Appearance ap = new Appearance();
// Texture texture;
// // テクスチャローダを使用 → うまくいった
// TextureLoader loader = new TextureLoader("data\\gray.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null);
// texture = loader.getTexture();
// texture.setCapability(Texture.ALLOW_IMAGE_READ);
// texture.setCapability(Texture.ALLOW_IMAGE_WRITE);
// ap.setTexture(texture);
// shape.setAppearance(ap);
// } else if (true) {
// // Appearanceは再利用、Texture以下、全部設定
// Texture texture;
// if (false) {
// // テクスチャローダを使用 → うまくいった
// TextureLoader loader = new TextureLoader("data\\gray.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, frame.getComponent(0));
// texture = loader.getTexture();
// texture.setCapability(Texture.ALLOW_IMAGE_READ);
// texture.setCapability(Texture.ALLOW_IMAGE_WRITE);
// } else if (true) {
// // テクスチャローダのイメージのみ使用、テクスチャは作成 → イメージサイズの問題でうまくいかないようだ(イメージを256x128にする?)
// TextureLoader loader = new TextureLoader("data\\gray.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, frame.getComponent(0));
// ImageComponent2D ic = loader.getImage();
// ic.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);
// ic.setCapability(ImageComponent2D.ALLOW_FORMAT_READ);
// ic.setCapability(ImageComponent2D.ALLOW_IMAGE_WRITE);
// texture = new Texture2D(Texture.BASE_LEVEL,
// Texture.RGB,
// image2.getWidth(),
// image2.getHeight());
// texture.setCapability(Texture.ALLOW_IMAGE_READ);
// texture.setCapability(Texture.ALLOW_IMAGE_WRITE);
// texture.setImage(0, ic);
// } else {
// texture = new Texture2D(Texture.BASE_LEVEL,
// Texture.RGB,
// image2.getWidth(),
// image2.getHeight());
// texture.setCapability(Texture.ALLOW_IMAGE_READ);
// texture.setCapability(Texture.ALLOW_IMAGE_WRITE);
// ImageComponent2D ic = new ImageComponent2D(ImageComponent2D.FORMAT_RGB,
// image2,
// true,
// true);
// ic.setCapability(ImageComponent2D.ALLOW_IMAGE_READ);
// ic.setCapability(ImageComponent2D.ALLOW_FORMAT_READ);
// ic.setCapability(ImageComponent2D.ALLOW_IMAGE_WRITE);
// // Mipmapレベルは0のみ
// texture.setImage(0, ic);
// }
// shape.getAppearance().setTexture(texture);
// } else {
// shape.getAppearance().setCapability(Appearance.ALLOW_TEXTURE_READ);
// shape.getAppearance().setCapability(Appearance.ALLOW_TEXTURE_WRITE);
// shape.getAppearance().getTexture().setCapability(Texture.ALLOW_IMAGE_READ);
// shape.getAppearance().getTexture().setCapability(Texture.ALLOW_IMAGE_WRITE);
// shape.getAppearance().getTexture().getImage(0).setCapability(ImageComponent2D.ALLOW_FORMAT_READ);
// shape.getAppearance().getTexture().getImage(0).setCapability(ImageComponent2D.ALLOW_IMAGE_READ);
// shape.getAppearance().getTexture().getImage(0).setCapability(ImageComponent2D.ALLOW_IMAGE_WRITE);
// ((ImageComponent2D)shape.getAppearance().getTexture().getImage(0)).set(image1);
// }
// --- ここまで、テクスチャ張り替えのテスト用コード
Universe universe = new Universe();
Camera3D camera = new Camera3D(universe);
camera.setViewPoint(new Position3D(0.0, 0.0, 10.0));
camera.adjust(0L);
canvas.attachCamera(camera);
DirectionalLight light = new DirectionalLight(true, new Color3f(1.0f,
1.0f, 1.0f), new Vector3f(0.0f, 0.0f, -1.0f));
light.setInfluencingBounds(new BoundingSphere(new Point3d(), 500.0));
universe.placeLight(light);
universe.place(obj);
universe.compile();
frame.setSize(720, 480);
frame.setVisible(true);
// //Pose3Dのテスト
// Pose3D pose = new Pose3D();
// Position3D pos = new Position3D(0.0, 1.0, 0.0);
// Quaternion3D quat = new Quaternion3D(0.0, 0.0, 1.0, Math.PI / 4.0);
// pose.addPose("ArmL", pos, quat);
//
// Position3D pos1 = new Position3D(1.0, 0.0, 0.0);
// Quaternion3D quat1 = new Quaternion3D(0.0, 0.0, 1.0, Math.PI / 2.0);
// pose.addPose("ArmR", pos1, quat1);
//
// Position3D pos2 = new Position3D(0.0, 1.0, 0.0);
// Quaternion3D quat2 = new Quaternion3D(0.0, 0.0, 1.0, Math.PI / 4.0);
// pose.addPose("obj1", pos2, quat2);
//
// Position3D pos3 = new Position3D(0.0, 1.0, 0.0);
// Quaternion3D quat3 = new Quaternion3D(0.0, 1.0, 1.0, Math.PI / 3.0);
// pose.addPose("obj2", pos3, quat3);
//
// Position3D pos4 = new Position3D(0.0, 0.0, 1.0);
// Quaternion3D quat4 = new Quaternion3D(0.0, 0.0, 1.0, Math.PI / 4.0);
// pose.addPose("obj3", pos4, quat4);
//
// Position3D pos5 = new Position3D(0.0, 1.0, 1.0);
// Quaternion3D quat5 = new Quaternion3D(0.0, 0.0, 1.0, Math.PI / 4.0);
// pose.addPose("obj4", pos5, quat5);
//
// Position3D pos6 = new Position3D(1.0, 1.0, 0.0);
// Quaternion3D quat6 = new Quaternion3D(0.0, 0.0, 1.0, Math.PI / 4.0);
// pose.addPose("obj5", pos6, quat6);
// // obj.apply(pose);
//
// //Animation3Dのテスト
// Animation3D animation = new Animation3D();
//
// PartAnimation pa1 = new PartAnimation("ArmL");
// pa1.add(0, new Position3D(0.0, 0.0, 0.0), new Quaternion3D());
// pa1.add(10000, pos, quat);
// animation.addPartAnimation(pa1);
//
// PartAnimation pa2 = new PartAnimation("ArmR");
// pa2.add(0, new Position3D(0.0, 0.0, 0.0), new Quaternion3D());
// pa2.add(10000, pos, quat);
// animation.addPartAnimation(pa2);
//
// PartAnimation pa3 = new PartAnimation("obj1");
// pa3.add(0, new Position3D(0.0, 0.0, 0.0), new Quaternion3D());
// pa3.add(10000, pos, quat);
// animation.addPartAnimation(pa3);
//
// PartAnimation pa4 = new PartAnimation("obj2");
// pa4.add(0, new Position3D(0.0, 0.0, 0.0), new Quaternion3D());
// pa4.add(10000, pos, quat);
// animation.addPartAnimation(pa4);
//
// PartAnimation pa5 = new PartAnimation("obj3");
// pa5.add(0, new Position3D(0.0, 0.0, 0.0), new Quaternion3D());
// pa5.add(10000, pos, quat);
// animation.addPartAnimation(pa5);
//
// PartAnimation pa6 = new PartAnimation("obj4");
// pa6.add(0, new Position3D(0.0, 0.0, 0.0), new Quaternion3D());
// pa6.add(10000, pos, quat);
// animation.addPartAnimation(pa6);
//
// PartAnimation pa7 = new PartAnimation("obj5");
// pa7.add(0, new Position3D(0.0, 0.0, 0.0), new Quaternion3D());
// pa7.add(10000, pos, quat);
// animation.addPartAnimation(pa7);
// // テクスチャアニメーションのテスト
// Animation3D animation = new Animation3D();
// PartAnimation pa = new PartAnimation("Body");
// TextureLoader loader1 = new TextureLoader("data\\white.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null);
// Texture texture1 = loader1.getTexture();
// TextureLoader loader2 = new TextureLoader("data\\gray.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null);
// Texture texture2 = loader2.getTexture();
// TextureLoader loader3 = new TextureLoader("data\\black.jpg", TextureLoader.BY_REFERENCE | TextureLoader.Y_UP, null);
// Texture texture3 = loader3.getTexture();
// pa.addTexture(0, texture1, new Position3D());
// pa.addTexture(100, texture2, new Position3D(0.4, 0.0, 0.0));
// pa.addTexture(200, texture3, new Position3D(0.8, 0.0, 0.0));
// pa.addTexture(300, texture2, new Position3D(0.4, 0.0, 0.0));
// pa.addTexture(400, texture1, new Position3D());
// animation.addPartAnimation(pa);
// アニメーションファイル読み込みのテスト
// Animation3D animation = AnimationFactory
// .loadAnimation("data\\character\\walk.wrl");
Animation3D animation = AnimationFactory.loadAnimation("data\\pocha\\jump.wrl");
for (;;) {
try {
Thread.sleep(1);
boolean b = animation.progress(1);
System.out.println(animation.time);
// if (b == false) break;
Pose3D pose2 = animation.getPose();
obj.apply(pose2, false);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new TestAnimation();
}
}