We will use the icosphere mesh created in Blender.

First we have to copy the file to the Models folder of our project.

We will set a background color of yellow.

// *** 1. Start (Set background color as yellow)
viewPort.setBackgroundColor(ColorRGBA.Yellow);
// *** 1. End
We show the 3 axes. Note, they are at a fixed place in 3D space, and we will not move them. However, they will rotate along the icosphere since they are all attached to rootNode.

// *** 2. Start (Show coordinates, red x, green y, blue z)
attachCoordinateAxes(new Vector3f(0,1,0));
// *** 2. End
We then load the icosphere mesh to a Spatial object.

// *** 3. Start (Load Icoshpere --> ico)
Spatial ico = assetManager.loadModel("Models/Icosphere.mesh.xml");
// *** 3. End
The material, applied to the Spatial object, is an unshaded Pink.

// *** 4. Start (Set ico to pink color)
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Pink);
ico.setMaterial(mat);
// *** 4. End
We attach it to rootNode.

// *** 5. Start (Show it)
rootNode.attachChild(ico);
// *** 5. End
In the update, we rotate the icosphere in all 3 directions. Since the icosphere is almost spherical, we only note slight changes in the sphere. However, we can easily see the changes in the arrows.

// *** 6. Start (Rotate at different rates in x,y,z)
rootNode.rotate(100*FastMath.DEG_TO_RAD*tpf,
200*FastMath.DEG_TO_RAD*tpf,
300*FastMath.DEG_TO_RAD*tpf);
// *** 6. End
// JMonkey3.java
package mygame;
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.Spatial;
import com.jme3.scene.debug.Arrow;
public class JMonkey3 extends SimpleApplication {
float rot = 0f;
public static void main(String[] args) {
JMonkey3 app = new JMonkey3();
app.start();
}
private Geometry putShape(Mesh shape, ColorRGBA color) {
Geometry g = new Geometry("coordinate axis", shape);
Material mat = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat.getAdditionalRenderState().setWireframe(true);
mat.setColor("Color", color);
g.setMaterial(mat);
rootNode.attachChild(g);
return g;
}
private void attachCoordinateAxes(Vector3f pos){
Arrow arrow = new Arrow(Vector3f.UNIT_X);
arrow.setLineWidth(2);
putShape(arrow, ColorRGBA.Red).setLocalTranslation(pos);
arrow = new Arrow(Vector3f.UNIT_Y);
arrow.setLineWidth(2);
putShape(arrow, ColorRGBA.Green).setLocalTranslation(pos);
arrow = new Arrow(Vector3f.UNIT_Z);
arrow.setLineWidth(2);
putShape(arrow, ColorRGBA.Blue).setLocalTranslation(pos);
}
@Override
public void simpleInitApp() {
// *** 1. Start (Set background color as yellow)
viewPort.setBackgroundColor(ColorRGBA.Yellow);
// *** 1. End
// *** 2. Start (Show coordinates, red x, green y, blue z)
attachCoordinateAxes(new Vector3f(0,1,0));
// *** 2. End
// *** 3. Start (Load Icoshpere --> ico)
Spatial ico = assetManager.loadModel("Models/Icosphere.mesh.xml");
// *** 3. End
// *** 4. Start (Set ico to pink color)
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Pink);
ico.setMaterial(mat);
// *** 4. End
// *** 5. Start (Show it)
rootNode.attachChild(ico);
// *** 5. End
}
@Override
public void simpleUpdate(float tpf) {
// *** 6. Start (Rotate at different rates in x,y,z)
rootNode.rotate(100*FastMath.DEG_TO_RAD*tpf,
200*FastMath.DEG_TO_RAD*tpf,
300*FastMath.DEG_TO_RAD*tpf);
// *** 6. End
}
@Override
public void simpleRender(RenderManager rm) {
//TODO: add render code
}
}
Output:
No comments:
Post a Comment