2014-10-31 77 views
1

我有兩個模型實例modelInstance1modelInstance2libGDX 3D以下和麪向對象

modelInstance1 - position Vector3(0,0,0) 
modelInstance2 - position Vector3(10,10,10) 

我該怎麼辦將modelInstance1旋轉到modelInstance2並在更新方法中移動此方向?答案後

問:

我試圖APLY答案基本xoppa魔方教程和東西是不好的。請問有什麼不對?

@Override 
public void create() { 
    environment = new Environment(); 
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f)); 
    environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f)); 

    modelBatch = new ModelBatch(); 

    cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    cam.position.set(10f, 10f, 10f); 
    cam.lookAt(0,0,0); 
    cam.near = 1f; 
    cam.far = 300f; 
    cam.update(); 

    ModelBuilder modelBuilder = new ModelBuilder(); 
    model = modelBuilder.createBox(5f, 5f, 10f, 
     new Material(ColorAttribute.createDiffuse(Color.GREEN)), 
     Usage.Position | Usage.Normal); 

    instance1 = new ModelInstance(model); 
    instance2 = new ModelInstance(model); 

    instance2.transform.translate(10,0,10); 

    camController = new CameraInputController(cam); 
    Gdx.input.setInputProcessor(camController); 
} 

渲染和更新方法。

@Override 
public void render() { 

    Vector3 position1 = new Vector3(), position2 = new Vector3(), direction = new Vector3(); 

    instance1.transform.getTranslation(position1); 
    instance2.transform.getTranslation(position2); 
    direction = (position2).sub(position1).nor(); 

    instance1.transform.setToRotation(direction, Vector3.X); 

instance2.transform.translate(0.05f, 0, 0.05f).rotate(0, 1, 0, 10*Gdx.graphics.getDeltaTime()).translate(0, 0, 0); 


    camController.update(); 

    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 

    modelBatch.begin(cam); 
    modelBatch.render(instance1, environment); 
    modelBatch.render(instance2, environment); 
    modelBatch.end(); 
} 

我試圖改變setToRotate方法:

instance1.transform.setToLookAt(position1, position2, new Vector3(0,1,0)); 

但同樣的問題..

+0

對「跟隨」的約束是什麼? – cfrick 2014-10-31 14:31:00

+0

將modelInstance1旋轉到modelInstance2並移動此方向。 – 2014-10-31 14:41:33

+0

您是否嘗試過將第一個modelInstance的矩陣乘以指向第二個的lookAtMatrix? – TheWhiteLlama 2014-10-31 15:27:42

回答

1

僞代碼面向樣子:

modelInstance1.direction(from matrix) = (modelInstance2.position).sub(modelInstance1.position).nor(); 
modelInstance1.setRotation(modelInstance1.direction, Vector3.Y); 

更新:這個例子中的方向矢量是應用程序 編輯對象的Vector3.Y軸。 Hovewer你的場景可能有另一個軸系統,所以有時你需要嘗試不同的物體軸來找到目標軸。

+0

我改了一個帖子,你能告訴我什麼是錯的嗎? – 2014-11-01 10:20:02

+1

* instance2.transform.translate *應該在* direction *計算之前(如果期望instance1在instance2上查找)。這只是*面對*部分。 – 2014-11-01 10:42:37

+0

好的,以及如何在移動instance2上查看instance1?您正在使用應該足夠 – 2014-11-01 10:55:07

0

最後....這就是它!!!!!!!!!!!!!!!!!!

當有人知道代碼是如何同你更好地讓我知道吧。

我希望幫助別人。 :)

Vector3 position1 = new Vector3(), position2 = new Vector3(), direction = new Vector3(); 

    instance2.transform.translate(0.5f, 0, 0.5f).rotate(0, 1, 0, 45*Gdx.graphics.getDeltaTime()).translate(0, 0, 0); 

    instance1.transform.getTranslation(position1); 
    instance2.transform.getTranslation(position2); 
    direction = (position2).sub(position1).nor(); 

    direction.set(-direction.x, -direction.y, -direction.z); 

    Quaternion quaternion = new Quaternion(); 
    Matrix4 instanceRotation = instance1.transform.cpy().mul(instance1transform); 

    instanceRotation.setToLookAt(direction, new Vector3(0,-1,0)); 
    instanceRotation.rotate(0, 0, 1, 180); 
    instanceRotation.getRotation(quaternion); 

    instance1.transform.set(position1, quaternion); 
+0

但是不適用於Y軸 – 2014-11-02 12:22:23