0
我環顧了一會兒,我似乎無法找到一種方法來指出一個方向說[1,2,3],而沒有計算任何東西之間的角度。我其實一般都是新來的3D圖形,所以我不知道我是否錯過了簡單的東西。有沒有辦法將相機指向Javafx8中特定矢量的方向?
我環顧了一會兒,我似乎無法找到一種方法來指出一個方向說[1,2,3],而沒有計算任何東西之間的角度。我其實一般都是新來的3D圖形,所以我不知道我是否錯過了簡單的東西。有沒有辦法將相機指向Javafx8中特定矢量的方向?
我編輯了我的答案,提供了一個如何操作相對於場景中當前位置的仿射變換 的示例。這是一個非常有用的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)));
}
);