import javax.microedition.lcdui.*; import javax.microedition.m3g.*; public class Canvas3D extends Canvas { /////////////////////////////////////////////////////////////////////////////// private static final byte[] VERTEX_POSITIONS = { // Координати вершин (byte) -1, (byte) -1, (byte) 1, // 0 (byte) 1, (byte) -1, (byte) 1, // 1 (byte) -1, (byte) 1, (byte) 1, // 2 (byte) 1, (byte) 1, (byte) 1, // 3 (byte) -1, (byte) -1, (byte) -1, // 4 (byte) 1, (byte) -1, (byte) -1, // 5 (byte) -1, (byte) 1, (byte) -1, // 6 (byte) 1, (byte) 1, (byte) -1, // 7 }; /////////////////////////////////////////////////////////////////////////////// private static final byte[] VERTEX_COLORS_1 = { // Кольори вершин (byte) 0, (byte) 0, (byte) 0, // 0 (byte) 0, (byte) 255, (byte) 0, // 1 (byte) 0, (byte) 0, (byte) 0, // 2 (byte) 0, (byte) 255, (byte) 0, // 3 (byte) 0, (byte) 255, (byte) 0, // 4 (byte) 0, (byte) 0, (byte) 255, // 5 (byte) 0, (byte) 255, (byte) 0, // 6 (byte) 0, (byte) 0, (byte) 255, // 7 }; private static final byte[] VERTEX_COLORS_2 = { // Кольори вершин (byte) 255, (byte) 0, (byte) 0, // 0 (byte) 0, (byte) 0, (byte) 0, // 1 (byte) 0, (byte) 0, (byte) 255, // 2 (byte) 255, (byte) 0, (byte) 0, // 3 (byte) 255, (byte) 0, (byte) 0, // 4 (byte) 0, (byte) 0, (byte) 0, // 5 (byte) 0, (byte) 0, (byte) 255, // 6 (byte) 255, (byte) 0, (byte) 0, // 7 }; /////////////////////////////////////////////////////////////////////////////// private static int[] TRIANGLE_INDIXES_1 = { 0, 2, 1, 3, 5, 7, 4, 6 }; // З'єднання трикутників private static int[] TRIANGLE_INDIXES_2 = { 1, 5, 0, 4, 2, 6, 3, 7 }; // З'єднання трикутників /////////////////////////////////////////////////////////////////////////////// private VertexBuffer cubeVertexData_1, cubeVertexData_2; // Дані вершин private TriangleStripArray cubeTriangles_1, cubeTriangles_2; // Трикутники куба private Graphics3D graphics3d; // Graphics 3D private PolygonMode polygonMode; // Відповідає за вигляд фігури private Appearance cubeAppearance; // Колір і тип заливки фігури private Transform cubeTransform; //Трансформація фігури private boolean z; // Допоміжна перемінна private float Z = 0.0f; // Допоміжна перемінна private Transform cameraTransform; private Camera camera; private boolean X1, X2, Y1, Y2, Z1, Z2; private int x1, x2, y1, y2, z1, z2; private int MAX = 90; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// public Canvas3D() { // Конструктор класу Canvas3D setFullScreenMode(true); graphics3d = Graphics3D.getInstance(); // Graphics 3D cubeVertexData_1 = new VertexBuffer(); // Дані вершин cubeVertexData_2 = new VertexBuffer(); // Дані вершин /////////////////////////////////////////////////////////////////////////////// VertexArray vertexPositions = new VertexArray(VERTEX_POSITIONS.length/3, 3, 1); // 1 - Вершини (У кубі їх 8, тобто масив вершин треба поділити на 3, бо X, Y, Z) // 2 - Число координат у вершині // 3 - Розмір кожної вершини (1 байт) vertexPositions.set(0, VERTEX_POSITIONS.length/3, VERTEX_POSITIONS); cubeVertexData_1.setPositions(vertexPositions, 1.0f, null); cubeVertexData_2.setPositions(vertexPositions, 1.0f, null); /////////////////////////////////////////////////////////////////////////////// VertexArray vertexColors_1 = new VertexArray(VERTEX_COLORS_1.length/3, 3, 1); vertexColors_1.set(0, VERTEX_COLORS_1.length / 3, VERTEX_COLORS_1); cubeVertexData_1.setColors(vertexColors_1); VertexArray vertexColors_2 = new VertexArray(VERTEX_COLORS_2.length/3, 3, 1); vertexColors_2.set(0, VERTEX_COLORS_2.length / 3, VERTEX_COLORS_2); cubeVertexData_2.setColors(vertexColors_2); /////////////////////////////////////////////////////////////////////////////// cubeTriangles_1 = new TriangleStripArray(TRIANGLE_INDIXES_1, new int[] {TRIANGLE_INDIXES_1.length}); cubeTriangles_2 = new TriangleStripArray(TRIANGLE_INDIXES_2, new int[] {TRIANGLE_INDIXES_2.length}); /////////////////////////////////////////////////////////////////////////////// cubeAppearance = new Appearance(); cubeTransform = new Transform(); polygonMode = new PolygonMode(); polygonMode.setShading(PolygonMode.SHADE_FLAT); polygonMode.setCulling(PolygonMode.CULL_FRONT); cubeAppearance.setPolygonMode(polygonMode); camera = new Camera(); // Камера float aspect = (float) getWidth() / (float) getHeight(); camera.setPerspective(30.0f, aspect, 0.1f, 300.0f); // 1 - Кут обзору // 2 - Коефіцієнт стиснення (Відношення getWidth до getHeight) // 3 - обрізуючий план (мінімальна відстань при якій видно об'єкт) // 4 - обрізуючий план (максимальна відстань при якій видно об'єкт) cameraTransform = new Transform(); cameraTransform.postTranslate(0.0f, 0.0f, 10.0f); // Встановлення камери по осі X, Y та Z graphics3d.setCamera(camera, cameraTransform); } /////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// protected void paint(Graphics g) { if(z) { cubeTransform.postRotate(1.0f, 1.0f, 1.0f, 1.0f); } cubeTransform.postRotate((float) x1/30, 1.0f, 0.0f, 0.0f); cubeTransform.postRotate((float) -x2/30, 1.0f, 0.0f, 0.0f); cubeTransform.postRotate((float) y1/30, 0.0f, 1.0f, 0.0f); cubeTransform.postRotate((float) -y2/30, 0.0f, 1.0f, 0.0f); cubeTransform.postRotate((float) z1/30, 0.0f, 0.0f, 1.0f); cubeTransform.postRotate((float) -z2/30, 0.0f, 0.0f, 1.0f); if(X1) { x1++; } if(X2) { x2++; } if(Y1) { y1++; } if(Y2) { y2++; } if(Z1) { z1++; } if(Z2) { z2++; } if(!X1) { x1--; } if(!X2) { x2--; } if(!Y1) { y1--; } if(!Y2) { y2--; } if(!Z1) { z1--; } if(!Z2) { z2--; } if(x1<0) { x1 = 0; } if(x1>MAX) { x1 = MAX; } if(x2<0) { x2 = 0; } if(x2>MAX) { x2 = MAX; } if(y1<0) { y1 = 0; } if(y1>MAX) { y1 = MAX; } if(y2<0) { y2 = 0; } if(y2>MAX) { y2 = MAX; } if(z1<0) { z1 = 0; } if(z1>MAX) { z1 = MAX; } if(z2<0) { z2 = 0; } if(z2>MAX) { z2 = MAX; } cameraTransform.postTranslate(0.0f, 0.0f, (float) Z); graphics3d.setCamera(camera, cameraTransform); graphics3d.bindTarget(g); // Початок рендінгу graphics3d.clear(null); // Очищення екрану graphics3d.render(cubeVertexData_1, cubeTriangles_1, cubeAppearance, cubeTransform); graphics3d.render(cubeVertexData_2, cubeTriangles_2, cubeAppearance, cubeTransform); graphics3d.releaseTarget(); // Кінень рендингу this.repaint(); } /////////////////////////////////////////////////////////////////////////////// protected void keyPressed(int key) { if(key==-7) { polygonMode.setCulling(PolygonMode.CULL_BACK); } // Бачимо внутрішні сторони if(key==-6) { polygonMode.setCulling(PolygonMode.CULL_FRONT); } // Бачимо зовнішні сторони if(key==49) { Z = (float) -0.1; } if(key==51) { Z = (float) 0.1; } if(key==35) { z=!z; } if(key==52 && z==false) { cubeTransform.postRotate(1.0f, 0.0f, 1.0f, 0.0f); } if(key==54 && z==false) { cubeTransform.postRotate(1.0f, 0.0f, -1.0f, 0.0f); } if(key==50 && z==false) { cubeTransform.postRotate(1.0f, 1.0f, 0.0f, 0.0f); } if(key==56 && z==false) { cubeTransform.postRotate(1.0f, -1.0f, 0.0f, 0.0f); } if(key==55 && z==false) { cubeTransform.postRotate(1.0f, 0.0f, 0.0f, 1.0f); } if(key==57 && z==false) { cubeTransform.postRotate(1.0f, 0.0f, 0.0f, -1.0f); } this.repaint(); } /////////////////////////////////////////////////////////////////////////////// protected void keyRepeated(int key) { if(key==52 && z==false) { Y1 = true; } if(key==54 && z==false) { Y2 = true; } if(key==50 && z==false) { X1 = true; } if(key==56 && z==false) { X2 = true; } if(key==55 && z==false) { Z1 = true; } if(key==57 && z==false) { Z2 = true; } } /////////////////////////////////////////////////////////////////////////////// protected void keyReleased(int key) { if(key==52) { Y1 = false; } if(key==54) { Y2 = false; } if(key==50) { X1 = false; } if(key==56) { X2 = false; } if(key==55) { Z1 = false; } if(key==57) { Z2 = false; } Z=0; } /////////////////////////////////////////////////////////////////////////////// }