A vector multiplied by a positive number results in vector in the same direction.
We use this example vector, with origin located at 0,0,0.
// *** 1. Start (vec=x+1.5y+2z) (Blue) Vector3f vec = new Vector3f(1.0f,1.5f,2.0f); Arrow arrow = new Arrow(vec); arrow.setLineWidth(3); Geometry geoArrow = new Geometry("arrow",arrow); geoArrow.setMaterial(mat); rootNode.attachChild(geoArrow); // *** 1. End
We can use math functions to write the magnitude, and we can multiply the vector by the inverse of this number.
// *** 2. Start (normalizing vector using math) float magnitude = FastMath.sqrt( vec.x*vec.x+vec.y*vec.y+vec.z*vec.z); Vector3f normMath = vec.mult(1f/magnitude); System.out.println("normMath = " + normMath); // *** 2. End
We could also normalize with Vector3f methods.
// *** 3. Start (normalized vecotor) (Red) Vector3f vecNorm = vec.normalize(); vec.normalizeLocal(); // In-place normalization System.out.print("vec = " + vec + ", vecNorm = " + vecNorm); Arrow arrow1 = new Arrow(vec); arrow1.setLineWidth(3); Geometry geoArrow1 = new Geometry("arrowNorm",arrow1); geoArrow1.setMaterial(mat1); rootNode.attachChild(geoArrow1); // *** 3. End
We create an opposite direction vector from the normalized vector.
// *** 4. Start (Opposite) (Green) vec.negateLocal(); // In place negation Arrow arrow2 = new Arrow(vec); arrow2.setLineWidth(3); Geometry geoArrow2 = new Geometry("arrowNormNeg",arrow2); geoArrow2.setMaterial(mat2); rootNode.attachChild(geoArrow2); // *** 4. End
The three components (x,y,z) are shown. For the y and z arrows, we translate in either x or both x and y.
// *** 5. Start (Components) (Yellow) Vector3f vecCopy = new Vector3f(1.0f,1.5f,2.0f); Vector3f vecX = new Vector3f(vecCopy.x,0,0); // only x Arrow arrowX = new Arrow(vecX); arrowX.setLineWidth(2); Geometry geoArrowX = new Geometry("arrowX",arrowX); geoArrowX.setMaterial(mat3); rootNode.attachChild(geoArrowX); Vector3f vecY = new Vector3f(0,vecCopy.y,0); // only y Arrow arrowY = new Arrow(vecY); arrowY.setLineWidth(3); Geometry geoArrowY = new Geometry("arrowY",arrowY); geoArrowY.setLocalTranslation(vecX); // displaced in x geoArrowY.setMaterial(mat3); rootNode.attachChild(geoArrowY); Arrow arrowZ = new Arrow(new Vector3f(0,0,vecCopy.z)); arrowZ.setLineWidth(4); Geometry geoArrowZ = new Geometry("arrowZ",arrowZ); geoArrowZ.setLocalTranslation( new Vector3f( vecCopy.x,vecCopy.y,0)); // displaced in x,y geoArrowZ.setMaterial(mat3); rootNode.attachChild(geoArrowZ); // *** 5. End
// JMonkey45.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.debug.Arrow; public class JMonkey45 extends SimpleApplication { public static void main(String[] args) { JMonkey45 app = new JMonkey45(); app.start(); } @Override public void simpleInitApp() { viewPort.setBackgroundColor(ColorRGBA.LightGray); flyCam.setEnabled(false); Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat.setColor("Color", ColorRGBA.Blue); Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat1.setColor("Color", ColorRGBA.Red); Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat2.setColor("Color", ColorRGBA.Green); Material mat3 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); mat3.setColor("Color", ColorRGBA.Yellow); // *** 1. Start (vec=x+1.5y+2z) (Blue) Vector3f vec = new Vector3f(1.0f,1.5f,2.0f); Arrow arrow = new Arrow(vec); arrow.setLineWidth(3); Geometry geoArrow = new Geometry("arrow",arrow); geoArrow.setMaterial(mat); rootNode.attachChild(geoArrow); // *** 1. End // *** 2. Start (normalizing vector using math) float magnitude = FastMath.sqrt( vec.x*vec.x+vec.y*vec.y+vec.z*vec.z); Vector3f normMath = vec.mult(1f/magnitude); System.out.println("normMath = " + normMath); // *** 2. End // *** 3. Start (normalized vecotor) (Red) Vector3f vecNorm = vec.normalize(); vec.normalizeLocal(); // In-place normalization System.out.print("vec = " + vec + ", vecNorm = " + vecNorm); Arrow arrow1 = new Arrow(vec); arrow1.setLineWidth(3); Geometry geoArrow1 = new Geometry("arrowNorm",arrow1); geoArrow1.setMaterial(mat1); rootNode.attachChild(geoArrow1); // *** 3. End // *** 4. Start (Opposite) (Green) vec.negateLocal(); // In place negation Arrow arrow2 = new Arrow(vec); arrow2.setLineWidth(3); Geometry geoArrow2 = new Geometry("arrowNormNeg",arrow2); geoArrow2.setMaterial(mat2); rootNode.attachChild(geoArrow2); // *** 4. End // *** 5. Start (Components) (Yellow) Vector3f vecCopy = new Vector3f(1.0f,1.5f,2.0f); Vector3f vecX = new Vector3f(vecCopy.x,0,0); // only x Arrow arrowX = new Arrow(vecX); arrowX.setLineWidth(2); Geometry geoArrowX = new Geometry("arrowX",arrowX); geoArrowX.setMaterial(mat3); rootNode.attachChild(geoArrowX); Vector3f vecY = new Vector3f(0,vecCopy.y,0); // only y Arrow arrowY = new Arrow(vecY); arrowY.setLineWidth(3); Geometry geoArrowY = new Geometry("arrowY",arrowY); geoArrowY.setLocalTranslation(vecX); // displaced in x geoArrowY.setMaterial(mat3); rootNode.attachChild(geoArrowY); Arrow arrowZ = new Arrow(new Vector3f(0,0,vecCopy.z)); arrowZ.setLineWidth(4); Geometry geoArrowZ = new Geometry("arrowZ",arrowZ); geoArrowZ.setLocalTranslation( new Vector3f( vecCopy.x,vecCopy.y,0)); // displaced in x,y geoArrowZ.setMaterial(mat3); rootNode.attachChild(geoArrowZ); // *** 5. End } @Override public void simpleUpdate(float tpf) { rootNode.rotate(tpf,tpf,tpf); } @Override public void simpleRender(RenderManager rm) { } }
Output:
No comments:
Post a Comment