2014-01-05 34 views

回答

0

我編輯了我的答案,提供了一個如何操作相對於場景中當前位置的仿射變換 的示例。這是一個非常有用的3D空間變換。

我會用代碼來介紹基礎知識,我建議您閱讀轉換矩陣。 這是一個很好的Tutorial,並涵蓋了所有「外行人」的條款。

所以首先定義一些回調從仿射矩陣越來越rows和cols:

public Affine affine = new Affine(); 

//Points: fwd, right, up Point3D: pos 

//Forward/look direction  
Callback<Transform, Point3D> forwardColCallback = (a) -> { 
    return new Point3D(a.getMzx(), a.getMzy(), a.getMzz()); 
}; 
Callback<Transform, Point3D> forwardRowCallback = (a) -> { 
    return new Point3D(a.getMxz(), a.getMyz(), a.getMzz()); 
}; 
// up direction 
Callback<Transform, Point3D> upColCallback = (a) -> { 
    return new Point3D(a.getMyx(), a.getMyy(), a.getMyz()); 
}; 
Callback<Transform, Point3D> upRowCallback = (a) -> { 
    return new Point3D(a.getMxy(), a.getMyy(), a.getMzy()); 
}; 
// right direction 
Callback<Transform, Point3D> rightColCallback = (a) -> { 
    return new Point3D(a.getMxx(), a.getMxy(), a.getMxz()); 
}; 
Callback<Transform, Point3D> rightRowCallback = (a) -> {   
    return new Point3D(a.getMxx(), a.getMyx(), a.getMzx()); 
}; 
//position 
Callback<Transform, Point3D> positionCallback = (a) ->{ 
    return new Point3D(a.getTx(), a.getTy(), a.getTz()); 
}; 

Point3D getForwardCol(){ 
    return forwardColCallback.call(getTransformableNode().getLocalToSceneTransform()); 
} 
Point3D getForwardRow(){ 
    return forwardRowCallback.call(getTransformableNode().getLocalToSceneTransform()); 
} 
Point3D getRightDirection(){ 
    return rightDirCallback.call(getTransformableNode().getLocalToSceneTransform()); 
} 
Point3D getRightRow(){ 
    return rightRowCallback.call(getTransformableNode().getLocalToSceneTransform()); 
} 
Point3D getUpCol(){ 
    return upColCallback.call(getTransformableNode().getLocalToSceneTransform()); 
} 
Point3D getUpRow(){ 
    return upRowCallback.call(getTransformableNode().getLocalToSceneTransform()); 
} 
Point3D getPosition(){ 
    return positionCallback.call(getTransformableNode().getLocalToSceneTransform()); 
} 

好吧,現在讓我們來建立一些方法來使用它們。

翻譯:

private void moveForward() {  
    affine.setTx(getPosition().getX() + speed * getForwardRow().x); 
    affine.setTy(getPosition().getY() + speed * getForwardRow().y); 
    affine.setTz(getPosition().getZ() + speed * getForwardRow().z); 
} 

private void strafeLeft() { 
    affine.setTx(getPosition().getX() + speed * -getRightRow().x); 
    affine.setTy(getPosition().getY() + speed * -getRightRow().y); 
    affine.setTz(getPosition().getZ() + speed * -getRightRow().z); 
} 

private void strafeRight() { 
    affine.setTx(getPosition().getX() + speed * getRightRow().x); 
    affine.setTy(getPosition().getY() + speed * getRightRow().y); 
    affine.setTz(getPosition().getZ() + speed * getRightRow().z); 
} 

private void moveBack() { 
    affine.setTx(getPosition().getX() + speed * -getForwardRow().x); 
    affine.setTy(getPosition().getY() + speed * -getForwardRow().y); 
    affine.setTz(getPosition().getZ() + speed * -getForwardRow().z); 
} 

private void moveUp() { 
    affine.setTx(getPosition().getX() + speed * -getUpRow().x); 
    affine.setTy(getPosition().getY() + speed * -getUpRow().y); 
    affine.setTz(getPosition().getZ() + speed * -getUpRow().z); 
} 

private void moveDown() { 
    affine.setTx(getPosition().getX() + speed * getUpRow().x); 
    affine.setTy(getPosition().getY() + speed * getUpRow().y); 
    affine.setTz(getPosition().getZ() + speed * getUpRow().z); 
} 

對於輪作,你可以做這樣的事情通過添加翻譯和3各自的旋轉變換:

// mouse coordinates not implemented in this example  
// You would need to define them 
    scene.setOnMousePressed(me->{  
     t.setX(getPosition().getX()); 
     t.setY(getPosition().getY()); 
     t.setZ(getPosition().getZ()); 

     affine.setToIdentity(); 

     rotateY.setAngle(
       MathUtils.clamp(((rotateY.getAngle() + moveDelta.getX() * (speed * 0.05)) % 360 + 540) % 360 - 180, -360, 360) 
     ); // horizontal     
     rotateX.setAngle(
       MathUtils.clamp(((rotateX.getAngle() - moveDelta.getY() * (speed * 0.05)) % 360 + 540) % 360 - 180, -90, 90) 
     ); // vertical 

     affine.prepend(t.createConcatenation(rotateY.createConcatenation(rotateX))); 
    } 
); 
相關問題