< Color Cube >
!! 이 Canvas3D.java는 Test.java(MIDlet를 상속받은 클래스)에서,
객체생성 후 setCurrentCard(..)의 인자로 넣어야 함.
1. Canvas3D.java import java.io.*; import javax.microedition.lcdui.*; import com.mascotcapsule.micro3d.v3.*; public class Canvas3D extends Canvas implements Runnable, Const{ public Canvas3D(){ effect= new Effect3D(); trans= new AffineTrans(); rotateX=new AffineTrans(); rotateY=new AffineTrans(); objPos= new Vector3D(0, 0, 0); look= new Vector3D(0, 0, -300000); up= new Vector3D(0, 4096, 0); trans.setViewTrans(objPos, look, up); layout= new FigureLayout( trans, 1024, 1024, CENTERX, CENTERY ); Thread thread= new Thread(this); //스레드 인스턴스 생성. thread.start(); //스레드 시작. } //########################################################################################## //# Runnable 인터페이스 구현 //# 응용프로그램의 메인 루프 //########################################################################################## public void run(){ while(true){ repaint(); try{ //Thread.sleep(1); //초당 10프레임 (예상치) }catch(Exception e){ System.out.println("쓰레드 슬립 에러"); } } } //########################################################################################## //# Canvas 클래스의 paint(...)추상 메소드 구현 //# 화면에 무언가를 그린다.(Canvas 인스턴스가 생성 되거나 repaint() 메소드 호출시 실행된다) //########################################################################################## public void paint(Graphics g){ g.setColor(0x333333); g.fillRect(0, 0, WIDTH, HEIGHT); rotateX.setIdentity(); rotateX.setRotationX(rotX); rotateY.setIdentity(); rotateY.setRotationY(rotY); rotateX.mul(rotateY); trans.mul(rotateX); //layout.setAffineTrans(trans); ((Graphics3D)g).renderPrimitives(sphTex, 0, 0, layout, effect, Graphics3D.PRIMITVE_QUADS | Graphics3D.PDATA_COLOR_PER_FACE| Graphics3D.PDATA_NORMAL_NONE | Graphics3D.PDATA_TEXURE_COORD_NONE, 6, vtxCoord, norCoord, texCoord, colCoord); ((Graphics3D)g).flush(); } public void keyPressed(int keyCode){ switch(keyCode){ case KEY_NUM1: rotX++; break; case KEY_NUM2: rotY++; break; case KEY_NUM4: rotX--; break; case KEY_NUM5: rotY--; break; } } private final int WIDTH= this.getWidth(); //화면의 넓이(사용가능한) private final int HEIGHT= this.getHeight(); //화면의 높이(사용가능한) private final int CENTERX= WIDTH >> 1; //화면의 X축 중심 private final int CENTERY= HEIGHT >> 1; //화면의 Y축 중심 private int rotX; private int rotY; private Vector3D objPos; private Vector3D look; private Vector3D up; private AffineTrans trans; private AffineTrans rotateX; private AffineTrans rotateY; private FigureLayout layout; private Texture sphTex; private Effect3D effect; private int vtxCoord[]= { -300, -300, 300, -300, 300, 300, 300, 300, 300, 300, -300, 300, -300, -300, -300, -300, 300, -300, 300, 300, -300, 300, -300, -300, -300, -300, 300, -300, -300, -300, -300, 300, -300, -300, 300, 300, 300, -300, 300, 300, -300, -300, 300, 300, -300, 300, 300, 300, -300, 300, 300, 300, 300, 300, 300, 300, -300, -300, 300, -300, -300, -300, 300, 300, -300, 300, 300, -300, -300, -300, -300, -300, }; private int norCoord[]= {}; private int texCoord[]= {}; private int colCoord[]= {0X000000, 0XFF0000, 0X00FF00, 0X0000FF, 0X0FF00FF, 0XFFFFFF}; } 현재 API에서는 flat shading 만 되는 것 같음.(확실하지 않음 ㅡㅡ;;)
vtxCoord[] 배열로 구성하는 오브젝트의 면 갯수와, colCoord[] 배열로 구성하는 면의 색상 갯수가
일치, 혹은, colCoord[]배열의 색상 갯수가 더 많아야 한다. 그렇지 않으면 런타임 에러 발생.
'Computer > Mobile3D' 카테고리의 다른 글
5. 3D Draw (0) | 2007.07.30 |
---|---|
4. Thread 를 이용한 화면 갱신 (1) | 2007.07.30 |
3. Hello MIDlet (0) | 2007.07.30 |
2. MIDlet 생명 주기 (0) | 2007.07.30 |
1. Mobile3D (0) | 2007.07.30 |