⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 micro3dcanvas.java

📁 旋转的飞机
💻 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 + -