/* Добавим нужные импорты. */ import javax.microedition.lcdui.*; import javax.microedition.m3g.*; /* Автор: Writer */ /* Наш 3D мир. */ public class M3D extends Canvas {//1 /* Создаём всё что нам надо. */ // Ос X, Y и Z. float x, y, z; // 3D график. Graphics3D graphics3D; // Мир. World world; // Свет. Light light; // Камера. Camera camera; // Трансформация. Transform transform; //Координаты вершин куба(x, y, z). byte[] VERTEX_POSITIONS= {//2 -1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, // front 1, -1, -1, -1, -1, -1, 1, 1, -1, -1, 1, -1, // back 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, // right -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, 1, // left -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, // top -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, -1, 1 // bottom };//1 //Индексы соединияющие вершины, чтобы строить треугольники. private static int[] TRIANGLE_INDICES = {//2 0,1,2,3,//front 4,5,6,7,//back 8,9,10,11,//right 12,13,14,15,// left 16,17,18,19,// top 20,21,22,23,//bottom };//1 // Данные вершин куба. VertexBuffer vertexBuffer; // Треугольники куба, определенные как полосы из треугольников. TriangleStripArray triangleStripArray; /* Вот и создали всё что нам понадобится в нашем 3D мири. */ public M3D() {//2 init(); }//1 /* Инициализация. */ public void init() {//2 setFullScreenMode(true); /* Инициализируем созданные нами данные. */ // График. graphics3D = Graphics3D.getInstance(); // Создание данных вершин. vertexBuffer = new VertexBuffer(); VertexArray vertexPositions = new VertexArray(VERTEX_POSITIONS.length/3,3,1); vertexPositions.set(0,VERTEX_POSITIONS.length/3,VERTEX_POSITIONS); vertexBuffer.setPositions(vertexPositions,1.0f,null); // Создание треугольников определяющих куб, индексы указывают на вершины в VERTEX_POSITIONS. triangleStripArray = new TriangleStripArray(TRIANGLE_INDICES, new int[] { TRIANGLE_INDICES.length}); // Камера. camera = new Camera(); float aspect =(float)getWidth()/(float)getHeight(); // Перспект. позиция. camera.setPerspective(30.0f,aspect,1.0f,1000.0f); // Свет. light = new Light(); // Цвет света. light.setColor(0xff0000); //Интенсивность. light.setIntensity(300.0f); //Материал. Material material = new Material(); material.setVertexColorTrackingEnable(true); Appearance appearance = new Appearance(); appearance.setMaterial(material); // Трансформация. transform = new Transform(); transform.postTranslate(0.0f+x, 0.0f+y, 0.0f+z); graphics3D.setCamera(camera, transform); /* Вот и инициализировали всё что создали в наш 3D мир. */ }//1 /* Здесь мы выводим на дисплей телефона наш 3D мир. */ public void paint(Graphics g) {//2 // 3D график. graphics3D.bindTarget(g, true, Graphics3D.DITHER | Graphics3D.TRUE_COLOR); graphics3D.clear(null); graphics3D.render(vertexBuffer, triangleStripArray, new Appearance(), null); graphics3D.releaseTarget(); // Установка камеры. Transform transform = new Transform(); transform.postTranslate(0.0f+x, 0.0f+y, 30.0f+z); graphics3D.setCamera(camera, transform); // Установка света. graphics3D.resetLights(); graphics3D.addLight(light, transform); /* Для вывода текстовых данных. */ Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALIC, Font.SIZE_SMALL); g.setFont(font); g.setColor(200, 255, 0); g.drawString("FPS:"+Fps.fps()+" [X:"+x+"|Y:"+y+"|Z:"+z+"]",0,0,20); /* Вывели все данные и перересуем экран. */ repaint(); }//1 /* Создадим код двигающий объекты по дисплею. */ public void keyPressed(int key) {//2 if(key == KEY_NUM2||key == -1) {//3 z++; transform.postTranslate(0.0f+x, 0.0f+y, 30.0f+z); }//2 if(key == KEY_NUM4||key == -3) {//3 x++; transform.postTranslate(0.0f+x, 0.0f+y, 30.0f+z); }//2 if(key == KEY_NUM6||key == -4) {//3 x--; transform.postTranslate(0.0f+x, 0.0f+y, 30.0f+z); }//2 if(key == KEY_NUM8||key == -2){//3 z--; transform.postTranslate(0.0f+x, 0.0f+y, 30.0f+z); }//2 if(key == KEY_NUM1) {//3 y++; transform.postTranslate(0.0f+x, 0.0f+y, 30.0f+z); }//2 if(key == KEY_NUM7) {//3 y--; transform.postTranslate(0.0f+x, 0.0f+y, 30.0f+z); }//2 }//1 public void keyRepeated(int key) {//2 keyPressed(key); }//1 public void keyReleased(int key) {//2 }//1 /* На этом все. */ }//0