【问题标题】:jmonkey rotation and translationjmonkey 旋转和平移
【发布时间】:2012-12-04 02:55:15
【问题描述】:

我在 JME (JMonkey) 中遇到旋转然后平移两个框的问题。我搜索了论坛,发现其他语言的一些类似问题,但我不明白答案,这可能是因为我不知道其他语言。我有两个带有 .lookat( [the other box] ) 的盒子,一个旋转,然后是一个本地翻译。在我看来,本地平移应该将盒子朝它所面对的方向移动,但它似乎不是沿着世界轴移动。值得注意的一件事;我对在 3d 中使用矩阵数学一无所知,我发现的一些答案使用矩阵数学来解决问题。我想了解这一点,以便将来避免这个问题。我已将我的代码尽可能小,因此它没有任何不必要的部分。

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() )));
}
}

【问题讨论】:

    标签: java rotation jmonkeyengine


    【解决方案1】:

    看看这个:

    @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);
    
    }
    

    【讨论】:

    • 这确实帮助了我,是的。也许官方 JMonkeyEngine3 文档认为用户更倾向于数学和内部工作原理,但我看到的这个问题仍然出现了很多次。
    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多