我的场景中有一台相机,我目前正在使用WASD在x y和z轴上移动。然而,我希望它按照它所面临的方向前进。为了更好地说明我的意思,我使用程序blender中的片段来演示这个想法。
图像1
在图1中,这很容易。向前移动将简单地在x(红色(轴上移动,向两侧移动将在y(绿色(轴上。当相机旋转,从而改变其相对于轴的位置时,就会出现问题,如图2所示:
图像2
如果我现在尝试向前移动(红色箭头的方向(,我需要移动以适应旋转,并调整x和y坐标,以便相机从其角度向前移动
有办法做到这一点吗?我尝试过许多涉及正弦和余弦的计算,以及相当多的谷歌搜索,但都没有结果。谷歌大多使用OpenGL显示未解决的问题或解决方案,而我的数学方程只是输出了不正确的结果。
我希望我能清楚地解释这个问题,如果没有,我很乐意提供更多信息。感谢您抽出时间!
我知道我迟到了3个月,但我想我明白你的意思。
在JavaFX中,你有一个名为world的组(除了相机之外的所有东西都是3d(。如果你想向左旋转相机(例如绕y轴旋转(,你不接触相机,而是接触世界,然后绕y轴转动。
老实说,我不100%理解为什么它有效,但它对我来说有效(我正在开发一款游戏,所以我必须经历它(。
我希望这能回答你的问题:D
编辑1:样本代码
package FXTesting;
import javafx.application.Application;
import javafx.scene.Camera;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;
public class Main extends Application {
public static int SIZEFACTOR = 100;
@Override
public void start(Stage primaryStage) throws Exception {
Group world = createEnvironment();
Scene scene = new Scene(world);
primaryStage.setScene(scene);
primaryStage.setWidth(16 * SIZEFACTOR);
primaryStage.setHeight(9 * SIZEFACTOR);
Camera camera = new PerspectiveCamera();
camera.setFarClip(2000);
camera.setNearClip(1);
scene.setCamera(camera);
Rotate worldRotX = new Rotate(0, Rotate.X_AXIS);
Rotate worldRotY = new Rotate(0, Rotate.Y_AXIS);
Translate worldTransX = new Translate();
world.getTransforms().addAll(worldRotY, worldRotX);
primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, event -> {
switch(event.getCode()){
case LEFT:
worldRotY.setAngle(worldRotY.getAngle() + 10);
break;
case RIGHT:
worldRotY.setAngle(worldRotY.getAngle() - 10);
break;
case UP:
worldRotX.setAngle(worldRotX.getAngle() + 10);
break;
case DOWN:
worldRotX.setAngle(worldRotX.getAngle() - 10);
case W: //w/s is for z
world.setTranslateZ(world.getTranslateZ() + 10);
break;
case S:
world.setTranslateZ(world.getTranslateZ() - 10);
break;
case A:// a/d is x axis
world.setTranslateX(world.getTranslateX() + 10);
break;
case D:
world.setTranslateX(world.getTranslateX() - 10);
break;
case SHIFT:// shift/contr is for y axis
world.setTranslateY(world.getTranslateY() + 10);
break;
case CONTROL:
world.setTranslateY(world.getTranslateY() - 10);
break;
}
});
primaryStage.show();
}
private Group createEnvironment(){
Group group = new Group();
Box ground = new Box();
ground.setHeight(10);
ground.setWidth(1000);
ground.setDepth(1000);
ground.setTranslateX(-500);
ground.setTranslateZ(-500);
Box box = new Box(100,100,100);
box.setTranslateY(10);
group.getChildren().addAll(ground, box);
return group;
}
public static void main(String... args){
launch(args);
}
}