📄 my3dcanvas.java
字号:
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.m3g.*;
import javax.microedition.midlet.*;
public class My3DCanvas extends Canvas implements Runnable {
private Camera camera;
private World world;
private Mesh mesh;
private Mesh mesh2;
private Light light;
private Command command_exit;
private First3DMIDlet midlet;
private Graphics3D g3d;
private Background background;
private Image2D image2d;
private Transform transForm;
private int angle;
private VertexArray vertArray=null;
private VertexArray normArray=null;
private VertexArray texArray=null;
private VertexBuffer vb= new VertexBuffer();
private TriangleStripArray tsa=null;
private Material material=null;
private Appearance appearnce;
private float fi=30;
private Transform transform_camera=new Transform();
/**
*
*/
public My3DCanvas(First3DMIDlet midlet_3d){
setCommandListener(new CommandListener(){
public void commandAction(Command c, Displayable arg1) {
if(c==command_exit){
try{
midlet.destroyApp(false);
midlet.notifyDestroyed();
}catch(MIDletStateChangeException me){
me.printStackTrace();
}
}
}
});
init(midlet_3d);
}
public void init(First3DMIDlet midlet_3d){
this.midlet=midlet_3d;
command_exit=new Command("Exit",Command.EXIT,1);
this.addCommand(command_exit);
g3d=Graphics3D.getInstance();
transForm=new Transform();
angle=1;
//设置摄像机
camera=new Camera();
camera.setPerspective(fi,
(float)getWidth()/(float)getHeight(),
1.0f,
1000.0f);
//camera.setTranslation(0,0,0);
//设置光线
light=new Light();
light.setColor(0xffffff);
light.setIntensity(1.25f);
light.setTranslation(0,30,70);
//装载所用的2d图片
try{
image2d=new Image2D(Image2D.RGB,Image.createImage("/img/test.png"));
}catch(IOException ioe){ioe.printStackTrace();System.out.println("/img/test.png");}
//设置背景
background=new Background();
background.setColor(0x000000);
try{
creatMesh();
}catch(Exception e){e.printStackTrace();System.out.println("creatMesh");}
//mesh2=new Mesh(vb,tsa,appearnce);
//mesh2.setAppearance(0,appearnce);
//mesh2.setTranslation(0,0,-60);
world=new World();
//world.addChild(camera);
world.addChild(mesh);
//world.addChild(mesh2);
//world.setActiveCamera(camera);
//world.addChild(light);
transform_camera.postTranslate(0,0,90);
}
protected void paint(Graphics g) {
Transform transform_light=new Transform();
transform_light.postTranslate(0,30,70);
//mesh.setTransform(transForm);
//camera.setTransform(transform_camera);
//fi=fi+0.1f;
//camera.setParallel(fi,
// (float)getWidth()/(float)getHeight(),
// 1.0f,
// 1000.0f);
g.setClip(0,0,getWidth(),getHeight());
g.drawString("3D demo",2,100,Graphics.LEFT|Graphics.TOP);
g3d.bindTarget(g,true,Graphics3D.DITHER|Graphics3D.TRUE_COLOR);
g3d.setViewport(0,0,getWidth(),getHeight());
g3d.resetLights();
g3d.clear(background);
g3d.addLight(light,transform_light);
transForm.postRotate(angle,1,1,1);
//transForm.postTranslate(0,0,0);
transform_camera.postTranslate(0,0,0.02f);
g3d.setCamera(camera,transform_camera);
g3d.render(world,transForm);
//g3d.render(vb,tsa,appearnce,transForm);
g3d.releaseTarget();
}
public void run(){
while(true){
repaint();
}
}
private void creatMesh()throws Exception{
short x = 20;
short y = 20;
short z = 20;
short fx = (short) -x;
short fy = (short) -y;
short fz = (short) -z;
//定点坐标
short[] vert = {x,y,z, fx,y,z, x,fy,z, fx,fy,z, //D
fx,y,fz, x,y,fz, fx,fy,fz, x,fy,fz, //C
fx,y,z, fx,y,fz, fx,fy,z, fx,fy,fz, //B
x,y,fz, x,y,z, x,fy,fz, x,fy,z, //F
x,y,fz, fx,y,fz, x,y,z, fx,y,z, //A
x,fy,z, fx,fy,z, x,fy,fz, fx,fy,fz}; //E
try{vertArray=new VertexArray(vert.length/3,3,2);
vertArray.set(0,vert.length/3,vert);
}catch(Exception e){System.out.println("vert");}
//发线
byte[] norm = { 0,0,127, 0,0,127, 0,0,127, 0,0,127,
0,0,-127, 0,0,-127, 0,0,-127, 0,0,-127,
-127,0,0, -127,0,0, -127,0,0, -127,0,0,
127,0,0, 127,0,0, 127,0,0, 127,0,0,
0,127,0, 0,127,0, 0,127,0, 0,127,0,
0,-127,0, 0,-127,0, 0,-127,0, 0,-127,0};
try{normArray=new VertexArray(norm.length/3,3,1);
normArray.set(0,norm.length/3,norm);
}catch(Exception e){System.out.println("norm");e.printStackTrace();}
//给出顶点们对应图片上的点(vert和tex数组是一一对应的)
short[] tex = { 1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1,
1, 0, 0, 0, 1, 1, 0, 1 };
try{
texArray=new VertexArray(tex.length/2,2,2);
texArray.set(0,tex.length/2,tex);
}catch(Exception e){System.out.println("tex");}
//建立正方体
vb=new VertexBuffer();
vb.setPositions(vertArray,1.0f,null);
vb.setNormals(normArray);
vb.setTexCoords(0,texArray,1.0f,null);
//建立实例华的方法
int[] spLength={4,4,4,4,4,4};
tsa=new TriangleStripArray(0,spLength);
//设置poly模式设置
PolygonMode polygonMode=new PolygonMode();
polygonMode.setShading(PolygonMode.SHADE_SMOOTH);
polygonMode.setCulling(PolygonMode.CULL_NONE);
//生成外貌
appearnce=new Appearance();
appearnce.setPolygonMode(polygonMode);
//创建帖图
Texture2D texture=new Texture2D(image2d);
texture.setBlendColor(Texture2D.FUNC_DECAL);
texture.setWrapping(Texture2D.WRAP_REPEAT,Texture2D.WRAP_REPEAT);
texture.setFiltering(Texture2D.FILTER_NEAREST,Texture2D.FILTER_NEAREST);
material=new Material();
material.setColor(Material.DIFFUSE, 0xFFFFFFFF);
material.setColor(Material.SPECULAR, 0xFFFFFFFF);
material.setShininess(100.0f);
appearnce.setTexture(0,texture);
appearnce.setMaterial(material);
mesh=new Mesh(vb,tsa,appearnce);
mesh.setAppearance(0,appearnce);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -