A vector multiplied by a positive number results in vector in the same direction.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN9od3LtnsyJ2zE4JQZJQb0JpUYBhcBz3poIwX2i1QnS2p1T6KQYoII6JcV7gNrtt9cJ1Z4O7f_KJKUkBS-9cHBG_fqlA3AZpHsLETlv6OY90hyphenhyphenxnWnzWmqADorGuNspdn5lJs0HTwzOJY/s1600/java45+-+1.png)
We use this example vector, with origin located at 0,0,0.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1Og_kIbvErRmAlje3mT6-o8ks5kt_HwG4eMSd3fEu2fRECscKjQMY2r5y0jbti9l8sPXkAmSTU5ZqlsB7vQVhwUbAa5jfG28rs4besGcQyPgV83_ZrAWHt7_9ypZp0nSFQmyuWkwnZcnK/s1600/java45+-+2.png)
// *** 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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirheYimbET7sZK-qnu9J1g03yADAlnWlRXxIq7nolG-_MIFafUh7QMAjjUYMDN7QzX4_OhDTrbQhQ7jetRO9jp4jVEG92eenvggI0b2rsxo5jjIeOG_FjUur8DAfZZIdoxVghTfWPt69Gn/s1600/java45+-+3.png)
// *** 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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVuz0Oa2KxGUl36uyZQMT8-XUyBJnqkhIviOMQYbs2xQUQy5RpqFmOVr-hRuZn1cyRHsAhwkgaffTJFPVLWWA8hoPvyDrqlXQAk4P4G9Zfkr2ZtR57Y_T2cN_fcrPok-CVIXi3Yncl4hdb/s1600/java45+-+4.png)
// *** 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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPOnpyek4Gww7T8Q606YL0J-o7WIZ0GmzhKoqxsqSmSUduTLNGpK7rFm2nQ8Z5jaufSzHUCv0jcFz-T0-np-dbQAq6STol3sufhN0BVHB-Z9f2W5J5uyK3ls92mOORYtbqsK9RbY97VS_C/s1600/java45+-+5.png)
// *** 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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLXPFqNVUfYa-nZCDLK_cCoXHdLPUSm99Sjz4Vu-ykW5HxXpvQdMGcOVHXc3PfViC1OR2aoo35GmYtHeHDIAdD0nDvfEkTJtQ9T5l6kO4jbSAJRZbmA0sKEunTiepuks9JEukUvdtApkBu/s1600/java45+-+6.png)
// *** 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