關於3D環境的建立和渲染代碼

圖片


圖片

 

MyActor類

環境攝像機和模型

import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Camera;

public class MyActor{
 private Camera m_Camera;
 private float m_fRot;
 private float m_fX;
 private float m_fY;
 private float m_fZ;
 public MyActor(Camera c,int scrWidth,int scrHeight){
  float aspect=(float)scrWidth/(float)scrHeight;
  m_Camera=c;
  m_Camera.setPerspective(30.0f, aspect, 1.0f, 1000.0f);
  m_fRot=0.f;
  m_Camera.setOrientation(m_fRot, 0.f, 1.f, 0.f);
  m_fX=0.f;
  m_fY=1.5f;
  m_fZ=0.f;
  m_Camera.setTranslation(m_fX, m_fX, m_fZ);
 }
 public void Input(int keyStates)
 {
  //如果按下了方向鍵的左鍵,則攝影機沿Y軸逆時針旋轉
  if((keyStates&GameCanvas.LEFT_PRESSED)!=0)
   m_fRot+=2.f;
  //如果按下了方向鍵的右鍵,則攝影機沿Y軸的順時針旋轉
  if((keyStates&GameCanvas.RIGHT_PRESSED)!=0)
   m_fRot-=2.f;
  m_Camera.setOrientation(m_fRot, 0.f, 1.f, 0.f);
  double rads=Math.toRadians(m_fRot);
  double Sin=Math.sin(rads);
  double Cos=Math.cos(rads);
  //如果按下了方向鍵的上鍵,則攝影機沿當前方向前進
  if((keyStates&GameCanvas.UP_PRESSED)!=0)
  {
   m_fX-=3.0f*(float)Sin;
   m_fZ-=0.0f*(float)Cos;
  }
  if((keyStates&GameCanvas.DOWN_PRESSED)!=0)
  {
   m_fX+=0.8f*(float)Sin;
   m_fZ+=0.8f*(float)Cos;
  }
  m_Camera.setTranslation(m_fX, m_fY, m_fZ);
 }
}

 

GameCanvas類:

環境渲染和實現

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.m3g.Background;
import javax.microedition.m3g.Camera;
import javax.microedition.m3g.Graphics3D;
import javax.microedition.m3g.Image2D;
import javax.microedition.m3g.Light;
import javax.microedition.m3g.Loader;
import javax.microedition.m3g.Object3D;
import javax.microedition.m3g.Transform;
import javax.microedition.m3g.World;

public class MainCanvas_bk extends GameCanvas implements Runnable{
 private boolean m_bRunning;
 private Graphics3D m_G3D;
 private World m_World;
 private MyActor m_Actor;
 public MainCanvas_bk(){
  super(true);
  try{
   m_G3D=Graphics3D.getInstance();
   Object3D[] roots=Loader.load("/scene.m3g");
   m_World=(World)roots[0];
   
   //在構造方法中,創建角色實例
   //創建角色控制實例
   m_Actor=new MyActor(m_World.getActiveCamera(),getWidth(),getHeight());
   //在構造方法中,設置場景的背景,並向場景添加光源
   //創建背景
   Background back=new Background();
   Image m=Image.createImage("/gmbk.png");
   Image2D m2d=new Image2D(Image2D.RGB,m);
   back.setImage(m2d);
   m_World.setBackground(back);
   Light light=new Light();
   light.setMode(Light.OMNI);
   m_World.addChild(light);
  }catch(Exception e){
   e.printStackTrace();
  }
  Start();
 }
 private void Start() {
  // TODO Auto-generated method stub
  m_bRunning=true;
  Thread thread=new Thread(this);
  thread.start();
 }
 public void run() {
  // TODO Auto-generated method stub
  long T1=System.currentTimeMillis();
  long T2=T1;
  while(m_bRunning)
  {
   T2=System.currentTimeMillis();
   if(T2-T1>50){
    T1=T2;
    Input();
    Logic();
    Paint();
   }
  }
 }
 private void Paint() {
  // TODO Auto-generated method stub
  Graphics g=getGraphics();
  try{
   m_G3D.bindTarget(g);
   m_G3D.render(m_World);
  }catch(Exception e){
   e.printStackTrace();
  }
  finally{
   m_G3D.releaseTarget();
  }
  flushGraphics();
 }
 private void Logic() {
  // TODO Auto-generated method stub
  
 }
 private void Input() {
  // TODO Auto-generated method stub
  int keyStates=getKeyStates();
  if(keyStates!=0)
  {
   m_Actor.Input(keyStates);
  }
 }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章