相对于 javafx 中的视图移动相机?
Move camera relative to view in javafx?
我的场景中有一个相机,我目前正在使用 WASD 在 x y 和 z 轴上移动它。但是,我希望它根据它所面对的方向移动。为了更好地说明我的意思,我使用程序搅拌器中的片段来演示这个想法。
Image 1
在图 1 中,这很容易。向前移动只会在 x(红色)轴上移动,向两侧移动将在 y(绿色)轴上移动。当相机旋转时会出现问题,从而改变它相对于轴的位置,如图 2 的俯视图所示:
Image 2
如果我现在尝试向前移动(红色箭头的方向),我需要移动以适应旋转,并调整 x 和 y 坐标,以便相机向前移动 透视.
有办法吗?
我已经尝试了很多涉及正弦和余弦的计算,以及相当多的 google 搜索,但没有结果。 Google 大部分显示未解决的问题或使用 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);
}
}
我的场景中有一个相机,我目前正在使用 WASD 在 x y 和 z 轴上移动它。但是,我希望它根据它所面对的方向移动。为了更好地说明我的意思,我使用程序搅拌器中的片段来演示这个想法。
Image 1
在图 1 中,这很容易。向前移动只会在 x(红色)轴上移动,向两侧移动将在 y(绿色)轴上移动。当相机旋转时会出现问题,从而改变它相对于轴的位置,如图 2 的俯视图所示:
Image 2
如果我现在尝试向前移动(红色箭头的方向),我需要移动以适应旋转,并调整 x 和 y 坐标,以便相机向前移动 透视.
有办法吗? 我已经尝试了很多涉及正弦和余弦的计算,以及相当多的 google 搜索,但没有结果。 Google 大部分显示未解决的问题或使用 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);
}
}