📄 micro3dcanvas.java
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import com.mascotcapsule.micro3d.v3.*;
public class Micro3DCanvas extends GameCanvas implements Runnable {
private Figure figure; //model
private Texture texture; //texture
private AffineTrans vtrans = new AffineTrans(); // 视点变换队列
private AffineTrans trans = new AffineTrans(); // 视点变换队列
private AffineTrans xtrans = new AffineTrans(); // 视点变换队列
private AffineTrans ytrans = new AffineTrans(); // 视点变换队列
private FigureLayout layout = new FigureLayout(); // FigureLayout 对象
private Effect3D effect = new Effect3D(); // Effect3D 对象
private boolean running; // 根据thread显示有无loop处理的flag
private int cx = getWidth() / 2; // display的中心x坐标
private int cy = getHeight() / 2; // display的中心y坐标
private int x_angle = 0; // x 轴周围的转角
private int y_angle = 0; // y 轴周围的转角
private int angle_delta = 4096 / 36; // 转动单位
private Graphics3D g3d = new Graphics3D();
private boolean usePerspective = true; // 显示执行透视投影的flag
public Micro3DCanvas(){
super(true);
try {
figure = new Figure( "/A6M3_128_01.MBAC" );
texture = new Texture( "/A6M3_128_01.BMP", true );
} catch( Exception e ) {
e.printStackTrace();
}
figure.setTexture( texture );
vtrans.lookAt(new Vector3D(0, 0, 4096 * 2 / 3),
new Vector3D(0, 0, -1),
new Vector3D(0, 1, 0));
// thread的开始
running = true;
Thread t = new Thread(this);
t.start();
}
/**
* 由thread执行的方法
*/
public void run() {
Graphics g = getGraphics();
while(running) {
tick();
keyEvent(getKeyStates());
draw(g);
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
stop();
}
}
}
/**
* 每经过一定时间的处理
*/
private void tick() {
x_angle += angle_delta*2;
y_angle += angle_delta;
xtrans.setRotationX( x_angle );
ytrans.setRotationY( y_angle );
trans.mul( xtrans, ytrans );
trans.mul( vtrans, trans );
layout.setCenter( cx, cy );
if(usePerspective) {
// 执行透视投影
layout.setPerspective( 1, 4096 * 2, 4096 / 6 );
} else {
// 执行平行投影
layout.setScale(300, 300);
}
layout.setAffineTrans( trans );
}
/**
* 根据按钮状态切换处理
*/
private void keyEvent(int keyStates) {
if((FIRE_PRESSED & keyStates) != 0 ) {
usePerspective = !usePerspective;
}
}
/**
* 描绘处理
*/
protected void draw( Graphics g ) {
g.setColor( 255, 255, 255 );
g.fillRect( 0, 0, getWidth(), getHeight() );
try{
g3d.bind(g);
g3d.renderFigure(figure, 0, 0, layout, effect);
// g3d.renderFigure(d2_figure,0,0,d2_layout,effect);
g3d.flush();
g3d.release( g );
}catch(Throwable h){
h.printStackTrace();
}
// ((Graphics3D)g).drawFigure( figure, 0, 0, layout, effect );
g.setColor( 0, 0, 0 );
if(usePerspective) {
g.drawString("Perspective", cx, getHeight(), Graphics.BOTTOM | Graphics.HCENTER );
} else {
g.drawString("Orthogonal", cx, getHeight(), Graphics.BOTTOM | Graphics.HCENTER );
}
flushGraphics();
}
/**
* thread的停止
*/
public void stop() {
running = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -