A rotation needs an axis and an angle. Here we have two rotations on two sphere objects. The two are translated by 3 x-units.
Sphere1 is blue and shown in Wireframe so the individual faces can be seen.
// *** 1. Start (Sphere1 attached to node1) Sphere sph1 = new Sphere(8, 16, 1); Geometry geom1 = new Geometry("Sphere1", sph1); Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat1.setColor("Color", ColorRGBA.Blue); mat1.getAdditionalRenderState().setWireframe(true); geom1.setMaterial(mat1); node1.attachChild(geom1); // *** 1. End
Sphere2 is green and also shown in Wireframe.
// *** 2. Start (Sphere2 attached to node2) Sphere sph2 = new Sphere(8, 16, 1); Geometry geom2 = new Geometry("Sphere2", sph2); Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat2.setColor("Color", ColorRGBA.Green); mat2.getAdditionalRenderState().setWireframe(true); geom2.setMaterial(mat2); node2.attachChild(geom2); // *** 2. End
axis1 is a red arrow at 45 degrees to +x axis in xy plane. Rotation for sphere1 is based on this axis.
// *** 3. Start (Arrow1,+45 deg to +x axis, node1) Vector3f axis1 = new Vector3f(2f,2f,0f); Arrow arrow1 = new Arrow(axis1); Geometry geoArrow1 = new Geometry("geoArrow1",arrow1); Material matArrow1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); matArrow1.setColor("Color", ColorRGBA.Red); geoArrow1.setMaterial(matArrow1); node1.attachChild(geoArrow1); // *** 3. End
axis2 is -45 degree to +x axis in xy-plane. It will be used for axis of rotation for sphere2.
// *** 4. Start (Arrow2,-45 deg to +x axis, node2) Vector3f axis2 = new Vector3f(2f,-2f,0f); Arrow arrow2 = new Arrow(axis2); Geometry geoArrow2 = new Geometry("geoArrow2",arrow2); Material matArrow2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); matArrow2.setColor("Color", ColorRGBA.Red); geoArrow2.setMaterial(matArrow2); node2.attachChild(geoArrow2); // *** 4. End
node2 is translated, so arrow2 and sphere2, can be clearly seen, so they are not overlapping.
// *** 5. Start (Move node2 by 3 units right) node2.setLocalTranslation(3,0,0); // *** 5. End
Understanding Quaternion math is not necessary in using them. We use fromAngleAxis() and give the angle and axis.
// *** 6. Start (Quaternions) quat1 = new Quaternion(); quat1.fromAngleAxis(FastMath.DEG_TO_RAD, axis1); quat2 = new Quaternion(); quat2.fromAngleAxis(FastMath.DEG_TO_RAD, axis2); // *** 6. End
In the simpleUpdate(), we rotate by 1 degree per frame for of two spheres.
// *** 7. Start (Rotations (1 deg/frame) using Quaternions) node1.rotate(quat1); //node1.rotate(FastMath.DEG_TO_RAD, //FastMath.DEG_TO_RAD,0); // or this node2.rotate(quat2); //node2.rotate(FastMath.DEG_TO_RAD, //-FastMath.DEG_TO_RAD,0); // or this // *** 7. End
// JMonkey46.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.Quaternion; import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.debug.Arrow; import com.jme3.scene.shape.Sphere; public class JMonkey46 extends SimpleApplication { public static void main(String[] args) { JMonkey46 app = new JMonkey46(); app.start(); } Quaternion quat1,quat2; Node node1,node2; @Override public void simpleInitApp() { viewPort.setBackgroundColor(ColorRGBA.White); flyCam.setEnabled(false); node1 = new Node("node1"); node2 = new Node("node2"); // *** 1. Start (Sphere1 attached to node1) Sphere sph1 = new Sphere(8, 16, 1); Geometry geom1 = new Geometry("Sphere1", sph1); Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat1.setColor("Color", ColorRGBA.Blue); mat1.getAdditionalRenderState().setWireframe(true); geom1.setMaterial(mat1); node1.attachChild(geom1); // *** 1. End // *** 2. Start (Sphere2 attached to node2) Sphere sph2 = new Sphere(8, 16, 1); Geometry geom2 = new Geometry("Sphere2", sph2); Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat2.setColor("Color", ColorRGBA.Green); mat2.getAdditionalRenderState().setWireframe(true); geom2.setMaterial(mat2); node2.attachChild(geom2); // *** 2. End // *** 3. Start (Arrow1,+45 deg to +x axis, node1) Vector3f axis1 = new Vector3f(2f,2f,0f); Arrow arrow1 = new Arrow(axis1); Geometry geoArrow1 = new Geometry("geoArrow1",arrow1); Material matArrow1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); matArrow1.setColor("Color", ColorRGBA.Red); geoArrow1.setMaterial(matArrow1); node1.attachChild(geoArrow1); // *** 3. End // *** 4. Start (Arrow2,-45 deg to +x axis, node2) Vector3f axis2 = new Vector3f(2f,-2f,0f); Arrow arrow2 = new Arrow(axis2); Geometry geoArrow2 = new Geometry("geoArrow2",arrow2); Material matArrow2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); matArrow2.setColor("Color", ColorRGBA.Red); geoArrow2.setMaterial(matArrow2); node2.attachChild(geoArrow2); // *** 4. End // *** 5. Start (Move node2 by 3 units right) node2.setLocalTranslation(3,0,0); // *** 5. End rootNode.attachChild(node1); rootNode.attachChild(node2); // *** 6. Start (Quaternions) quat1 = new Quaternion(); quat1.fromAngleAxis(FastMath.DEG_TO_RAD, axis1); quat2 = new Quaternion(); quat2.fromAngleAxis(FastMath.DEG_TO_RAD, axis2); // *** 6. End } @Override public void simpleUpdate(float tpf) { // *** 7. Start (Rotations (1 deg/frame) using Quaternions) node1.rotate(quat1); //node1.rotate(FastMath.DEG_TO_RAD, //FastMath.DEG_TO_RAD,0); // or this node2.rotate(quat2); //node2.rotate(FastMath.DEG_TO_RAD, //-FastMath.DEG_TO_RAD,0); // or this // *** 7. End } @Override public void simpleRender(RenderManager rm) { //TODO: add render code } }
Output:
No comments:
Post a Comment