2012-12-04 5 views
3

Je rencontre un problème dans JME (JMonkey) avec rotation puis traduction de deux boîtes. J'ai cherché sur les forums et trouvé des problèmes similaires avec d'autres langues, mais je ne comprends pas les réponses et c'est peut-être parce que je ne connais pas les autres langues. J'ai deux boîtes avec .lookat ([l'autre boîte]), une rotation, puis une traduction locale. Dans mon esprit, la traduction locale devrait déplacer la boîte dans la direction vers laquelle elle se trouve, mais elle ne semble pas se déplacer le long des axes du monde. Une chose de note; Je ne sais rien à propos de l'utilisation des mathématiques matricielles en 3D, certaines des réponses que j'ai trouvées utilisaient les mathématiques matricielles pour résoudre le problème. Je voudrais comprendre cela afin que je puisse éviter ce problème à l'avenir. J'ai réduit mon code aussi petit que possible, donc il n'y a pas de parties insensibles.jmonkey rotation et traduction

package jme3test.helloworld; 
import com.jme3.app.SimpleApplication; 
import com.jme3.font.BitmapText; 
import com.jme3.material.Material; 
import com.jme3.math.Vector3f; 
import com.jme3.scene.Geometry; 
import com.jme3.scene.shape.Box; 
import com.jme3.math.ColorRGBA; 
import com.jme3.renderer.RenderManager; 
import com.jme3.renderer.ViewPort; 
import com.jme3.scene.Node; 
import com.jme3.scene.Spatial; 
import com.jme3.scene.control.AbstractControl; 
import java.util.ResourceBundle.Control; 


public class SSF2 extends SimpleApplication { 
public Geometry blue = null; 
public Geometry red = null; 

public static void main(String[] args){ 
    final SSF2 app = new SSF2(); 
    app.start(); 
} 

@Override 
public void simpleInitApp() { 
    // create a blue box at coordinates (1,-1,1) 
    Box box1 = new Box(Vector3f.ZERO, 1f,2f,.5f); 
    blue = new Geometry("Box", box1); 
    Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 
    mat1.setColor("Color", ColorRGBA.Blue); 
    blue.setMaterial(mat1); 
    blue.move(-5,0,-3); 

    // create a red box straight above the blue one at (1,3,1) 
    Box box2 = new Box(Vector3f.ZERO, 1f,2f,.5f); 
    red = new Geometry("Box", box2); 
    Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 
    mat2.setColor("Color", ColorRGBA.Red); 
    red.setMaterial(mat2); 
    red.move(5,0,-3); 

    rootNode.attachChild(blue); 
    rootNode.attachChild(red); 

    blue.lookAt(red.getWorldTranslation(), new Vector3f(0,1,0)); 
    red.lookAt(blue.getWorldTranslation(), new Vector3f(0,1,0)); 
} 

@Override 
public void simpleUpdate(float tpf) { 
    blue.setLocalTranslation(new Vector3f((blue.getLocalTranslation().getX() + .02f), (blue.getLocalTranslation().getY()) , (blue.getLocalTranslation().getZ()))); 
    red.setLocalTranslation(new Vector3f((red.getLocalTranslation().getX() + .02f), (red.getLocalTranslation().getY()) , (red.getLocalTranslation().getZ()))); 
} 
} 

Répondre

2

Découvrez ceci:

@Override 
public void simpleUpdate(float tpf) { 
    red.rotate(0, 0.001f, 0); 

    // For the red (moves in a circle) 
    Quaternion rotation = red.getLocalRotation(); 
    Vector3f front = new Vector3f(0, 0, 0.01f); 
    Vector3f heading = rotation.mult(front); 
    red.move(heading); 

    /// For the blue (follows the red) 
    blue.lookAt(red.getWorldTranslation(), Vector3f.UNIT_Y); 
    float velocity = 0.01f; 
    Vector3f trajectory = red.getWorldTranslation().subtract(blue.getWorldTranslation()); 
    trajectory = trajectory.normalize(); 
    Vector3f offset = trajectory.mult(velocity); 
    blue.move(offset); 
    System.out.print(offset); 

} 
+0

Cela m'a aidé, oui. Peut-être que les docs officiels de JMonkeyEngine3 supposent que les utilisateurs sont plus enclins aux maths et au fonctionnement interne, mais cette question que j'ai vu se lever plusieurs fois encore. – noncom

Questions connexes