A mesh can be created programmatically in jMonkeyEngine.
The cube has 24 vertex points with 8 physical vertex points, each with 3 normals.
// *** 1. Start (24 pts in cube with normal) Vector3f [] vert = new Vector3f[24]; vert[0] = new Vector3f(-1, -1, -1); // -z vert[1] = new Vector3f(1, -1, -1); // -z vert[2] = new Vector3f(1, 1, -1); // -z vert[3] = new Vector3f(-1, 1, -1); // -z vert[4] = new Vector3f(1, -1, -1); // +x vert[5] = new Vector3f(1, -1, 1); // +x vert[6] = new Vector3f(1, 1, 1); // +x vert[7] = new Vector3f(1, 1, -1); // +x vert[8] = new Vector3f(1, -1, 1); // +z vert[9] = new Vector3f(-1, -1, 1); // +z vert[10] = new Vector3f(-1, 1, 1); // +z vert[11] = new Vector3f(1, 1, 1); // +z vert[12] = new Vector3f(-1, -1, 1); // -x vert[13] = new Vector3f(-1, -1, -1); // -x vert[14] = new Vector3f(-1, 1, -1); // -x vert[15] = new Vector3f(-1, 1, 1); // -x vert[16] = new Vector3f(1, 1, -1); // +y vert[17] = new Vector3f(1, 1, 1); // +y vert[18] = new Vector3f(-1, 1, 1); // +y vert[19] = new Vector3f(-1, 1, -1); // +y vert[20] = new Vector3f(-1, -1, -1); // -y vert[21] = new Vector3f(-1, -1, 1); // -y vert[22] = new Vector3f(1, -1, 1); // -y vert[23] = new Vector3f(1, -1, -1); // -y // *** 1. End
For the 24 vertex points, we have to give the normal. With the vertex information and normal information, all the 24 entries are now unique.
// *** 2. Start (Normals for the Verts) Vector3f[] norm = new Vector3f[24]; norm[0] = new Vector3f(0, 0, -1); // -z norm[1] = new Vector3f(0, 0, -1); // -z norm[2] = new Vector3f(0, 0, -1); // -z norm[3] = new Vector3f(0, 0, -1); // -z norm[4] = new Vector3f(1, 0, 0); // +x norm[5] = new Vector3f(1, 0, 0); // +x norm[6] = new Vector3f(1, 0, 0); // +x norm[7] = new Vector3f(1, 0, 0); // +x norm[8] = new Vector3f(0, 0, 1); // +z norm[9] = new Vector3f(0, 0, 1); // +z norm[10] = new Vector3f(0, 0, 1); // +z norm[11] = new Vector3f(0, 0, 1); // +z norm[12] = new Vector3f(-1, 0, 0); // -x norm[13] = new Vector3f(-1, 0, 0); // -x norm[14] = new Vector3f(-1, 0, 0); // -x norm[15] = new Vector3f(-1, 0, 0); // -x norm[16] = new Vector3f(0, 1, 0); // +y norm[17] = new Vector3f(0, 1, 0); // +y norm[18] = new Vector3f(0, 1, 0); // +y norm[19] = new Vector3f(0, 1, 0); // +y norm[20] = new Vector3f(0, -1, 0); // -y norm[21] = new Vector3f(0, -1, 0); // -y norm[22] = new Vector3f(0, -1, 0); // -y norm[23] = new Vector3f(0, -1, 0); // -y // *** 2. End
Inside the program, we can create our UV mapping, based on the image. Here, the image was 3 by 2, and these divisions corresponds to the 6 faces.
// *** 3. Start (Texture coordinates for the Verts) Vector2f [] texCoord = new Vector2f[24]; texCoord[0] = new Vector2f(0,0); texCoord[1] = new Vector2f(THIRD,0); texCoord[2] = new Vector2f(THIRD,0.5f); texCoord[3] = new Vector2f(0,0.5f); texCoord[4] = new Vector2f(THIRD,0); texCoord[5] = new Vector2f(2*THIRD,0); texCoord[6] = new Vector2f(2*THIRD,0.5f); texCoord[7] = new Vector2f(THIRD,0.5f); texCoord[8] = new Vector2f(2*THIRD,0); texCoord[9] = new Vector2f(1,0); texCoord[10] = new Vector2f(1,0.5f); texCoord[11] = new Vector2f(2*THIRD,0.5f); texCoord[12] = new Vector2f(0,0.5f); texCoord[13] = new Vector2f(THIRD,0.5f); texCoord[14] = new Vector2f(THIRD,1); texCoord[15] = new Vector2f(0,1); texCoord[16] = new Vector2f(THIRD,0.5f); texCoord[17] = new Vector2f(2*THIRD,0.5f); texCoord[18] = new Vector2f(2*THIRD,1); texCoord[19] = new Vector2f(THIRD,1); texCoord[20] = new Vector2f(2*THIRD,0.5f); texCoord[21] = new Vector2f(1,0.5f); texCoord[22] = new Vector2f(1,1); texCoord[23] = new Vector2f(2*THIRD,1); // *** 3. End
dice.png texture
For the 6 faces, we have to give the 12 counter clockwise triangles.
// *** 4. Start (// Indexes. 12 CCW Triangles) int [] indexes = { 3,2,1, 1,0,3, // -z 7,6,5, 5,4,7, // +x 11,10,9, 9,8,11, // +z 15,14,13, 13,12,15, // -x 19,18,17, 17,16,19, // +y 23,22,21, 21,20,23 // -y }; // *** 4. End
Now that we have the lists, we can create our mesh.
// *** 5. Start (Setting buffers) m.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(vert)); m.setBuffer(Type.Normal, 3, BufferUtils.createFloatBuffer(norm)); m.setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(texCoord)); m.setBuffer(Type.Index, 1, BufferUtils.createIntBuffer(indexes)); m.updateBound(); // *** 5. End
We have to set the texture from external image file.
// *** 6. Start (Geometry, Material, Texture) Geometry geom = new Geometry("DiceMesh", m); Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); Texture matTex = assetManager.loadTexture( "Textures/dice.png"); mat.setTexture("DiffuseMap", matTex); mat.setColor("Diffuse",ColorRGBA.Red); mat.setColor("Specular",ColorRGBA.White); mat.setFloat("Shininess", 32f); // [0,128] geom.setMaterial(mat); rootNode.attachChild(geom); // *** 6. End
The lights have to illuminate the scene.
// *** 7. Start (Lights, Drag from Palette) /** A white, directional light source */ DirectionalLight sun = new DirectionalLight(); sun.setDirection((new Vector3f(-0.5f, -0.5f, -0.5f)).normalizeLocal()); sun.setColor(ColorRGBA.White); rootNode.addLight(sun); /** A white ambient light source. */ /** A cone-shaped spotlight with location, direction, range */ SpotLight spot = new SpotLight(); spot = new SpotLight(); spot.setSpotRange(100); spot.setSpotOuterAngle(20 * FastMath.DEG_TO_RAD); spot.setSpotInnerAngle(15 * FastMath.DEG_TO_RAD); spot.setDirection(cam.getDirection()); spot.setPosition(cam.getLocation()); rootNode.addLight(spot); AmbientLight ambient = new AmbientLight(); ambient.setColor(ColorRGBA.Red); rootNode.addLight(ambient); // *** 7. End
package mygame; import com.jme3.app.SimpleApplication; import com.jme3.light.AmbientLight; import com.jme3.light.DirectionalLight; import com.jme3.light.SpotLight; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; import com.jme3.math.FastMath; import com.jme3.math.Vector2f; import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; import com.jme3.scene.Mesh; import com.jme3.scene.VertexBuffer.Type; import com.jme3.system.AppSettings; import com.jme3.texture.Texture; import com.jme3.util.BufferUtils; public class JMonkey32 extends SimpleApplication { public static void main(String[] args){ AppSettings cfg = new AppSettings(true); cfg.setFrameRate(60); JMonkey32 app = new JMonkey32(); app.setSettings(cfg); app.setDisplayFps(false); app.setDisplayStatView(false); app.start(); } @Override public void simpleInitApp() { final float THIRD = 1f/3f; Mesh m = new Mesh(); viewPort.setBackgroundColor(ColorRGBA.White); flyCam.setEnabled(false); // *** 1. Start (24 pts in cube with normal) Vector3f [] vert = new Vector3f[24]; vert[0] = new Vector3f(-1, -1, -1); // -z vert[1] = new Vector3f(1, -1, -1); // -z vert[2] = new Vector3f(1, 1, -1); // -z vert[3] = new Vector3f(-1, 1, -1); // -z vert[4] = new Vector3f(1, -1, -1); // +x vert[5] = new Vector3f(1, -1, 1); // +x vert[6] = new Vector3f(1, 1, 1); // +x vert[7] = new Vector3f(1, 1, -1); // +x vert[8] = new Vector3f(1, -1, 1); // +z vert[9] = new Vector3f(-1, -1, 1); // +z vert[10] = new Vector3f(-1, 1, 1); // +z vert[11] = new Vector3f(1, 1, 1); // +z vert[12] = new Vector3f(-1, -1, 1); // -x vert[13] = new Vector3f(-1, -1, -1); // -x vert[14] = new Vector3f(-1, 1, -1); // -x vert[15] = new Vector3f(-1, 1, 1); // -x vert[16] = new Vector3f(1, 1, -1); // +y vert[17] = new Vector3f(1, 1, 1); // +y vert[18] = new Vector3f(-1, 1, 1); // +y vert[19] = new Vector3f(-1, 1, -1); // +y vert[20] = new Vector3f(-1, -1, -1); // -y vert[21] = new Vector3f(-1, -1, 1); // -y vert[22] = new Vector3f(1, -1, 1); // -y vert[23] = new Vector3f(1, -1, -1); // -y // *** 1. End // *** 2. Start (Normals for the Verts) Vector3f[] norm = new Vector3f[24]; norm[0] = new Vector3f(0, 0, -1); // -z norm[1] = new Vector3f(0, 0, -1); // -z norm[2] = new Vector3f(0, 0, -1); // -z norm[3] = new Vector3f(0, 0, -1); // -z norm[4] = new Vector3f(1, 0, 0); // +x norm[5] = new Vector3f(1, 0, 0); // +x norm[6] = new Vector3f(1, 0, 0); // +x norm[7] = new Vector3f(1, 0, 0); // +x norm[8] = new Vector3f(0, 0, 1); // +z norm[9] = new Vector3f(0, 0, 1); // +z norm[10] = new Vector3f(0, 0, 1); // +z norm[11] = new Vector3f(0, 0, 1); // +z norm[12] = new Vector3f(-1, 0, 0); // -x norm[13] = new Vector3f(-1, 0, 0); // -x norm[14] = new Vector3f(-1, 0, 0); // -x norm[15] = new Vector3f(-1, 0, 0); // -x norm[16] = new Vector3f(0, 1, 0); // +y norm[17] = new Vector3f(0, 1, 0); // +y norm[18] = new Vector3f(0, 1, 0); // +y norm[19] = new Vector3f(0, 1, 0); // +y norm[20] = new Vector3f(0, -1, 0); // -y norm[21] = new Vector3f(0, -1, 0); // -y norm[22] = new Vector3f(0, -1, 0); // -y norm[23] = new Vector3f(0, -1, 0); // -y // *** 2. End // *** 3. Start (Texture coordinates for the Verts) Vector2f [] texCoord = new Vector2f[24]; texCoord[0] = new Vector2f(0,0); texCoord[1] = new Vector2f(THIRD,0); texCoord[2] = new Vector2f(THIRD,0.5f); texCoord[3] = new Vector2f(0,0.5f); texCoord[4] = new Vector2f(THIRD,0); texCoord[5] = new Vector2f(2*THIRD,0); texCoord[6] = new Vector2f(2*THIRD,0.5f); texCoord[7] = new Vector2f(THIRD,0.5f); texCoord[8] = new Vector2f(2*THIRD,0); texCoord[9] = new Vector2f(1,0); texCoord[10] = new Vector2f(1,0.5f); texCoord[11] = new Vector2f(2*THIRD,0.5f); texCoord[12] = new Vector2f(0,0.5f); texCoord[13] = new Vector2f(THIRD,0.5f); texCoord[14] = new Vector2f(THIRD,1); texCoord[15] = new Vector2f(0,1); texCoord[16] = new Vector2f(THIRD,0.5f); texCoord[17] = new Vector2f(2*THIRD,0.5f); texCoord[18] = new Vector2f(2*THIRD,1); texCoord[19] = new Vector2f(THIRD,1); texCoord[20] = new Vector2f(2*THIRD,0.5f); texCoord[21] = new Vector2f(1,0.5f); texCoord[22] = new Vector2f(1,1); texCoord[23] = new Vector2f(2*THIRD,1); // *** 3. End // *** 4. Start (// Indexes. 12 CCW Triangles) int [] indexes = { 3,2,1, 1,0,3, // -z 7,6,5, 5,4,7, // +x 11,10,9, 9,8,11, // +z 15,14,13, 13,12,15, // -x 19,18,17, 17,16,19, // +y 23,22,21, 21,20,23 // -y }; // *** 4. End // *** 5. Start (Setting buffers) m.setBuffer(Type.Position, 3, BufferUtils.createFloatBuffer(vert)); m.setBuffer(Type.Normal, 3, BufferUtils.createFloatBuffer(norm)); m.setBuffer(Type.TexCoord, 2, BufferUtils.createFloatBuffer(texCoord)); m.setBuffer(Type.Index, 1, BufferUtils.createIntBuffer(indexes)); m.updateBound(); // *** 5. End // *** 6. Start (Geometry, Material, Texture) Geometry geom = new Geometry("DiceMesh", m); Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); Texture matTex = assetManager.loadTexture( "Textures/dice.png"); mat.setTexture("DiffuseMap", matTex); mat.setColor("Diffuse",ColorRGBA.Red); mat.setColor("Specular",ColorRGBA.White); mat.setFloat("Shininess", 32f); // [0,128] geom.setMaterial(mat); rootNode.attachChild(geom); // *** 6. End // *** 7. Start (Lights, Drag from Palette) /** A white, directional light source */ DirectionalLight sun = new DirectionalLight(); sun.setDirection((new Vector3f(-0.5f, -0.5f, -0.5f)).normalizeLocal()); sun.setColor(ColorRGBA.White); rootNode.addLight(sun); /** A white ambient light source. */ /** A cone-shaped spotlight with location, direction, range */ SpotLight spot = new SpotLight(); spot = new SpotLight(); spot.setSpotRange(100); spot.setSpotOuterAngle(20 * FastMath.DEG_TO_RAD); spot.setSpotInnerAngle(15 * FastMath.DEG_TO_RAD); spot.setDirection(cam.getDirection()); spot.setPosition(cam.getLocation()); rootNode.addLight(spot); AmbientLight ambient = new AmbientLight(); ambient.setColor(ColorRGBA.Red); rootNode.addLight(ambient); // *** 7. End } @Override public void simpleUpdate(float tpf) { // Rotation per frame rootNode.rotate(.005f,.01f,.008f); } }
Output:
No comments:
Post a Comment