- X 바닥
- Z 바로
- Y 증가 상단 왼쪽 증가 뷰어를 향해 화면에 수직 증가 내 장면이되는 축이 (적어도 저)
직관 수단
세로 마우스 끌기 이벤트를 사용하여 트랙볼이 장면 X 축을 중심으로 회전하고 마우스의 가로 끌기 이벤트가 발생하여 트랙 바 0 ~ 장면 Y 축을 중심으로 회전합니다. 빨강, Y : 녹색, Z : 파란색하는 PerspectiveCamera 축 원점에 대한 교육 카메라, 내 트랙볼 오라클 자바 FX SmampleApp 3D를 시작으로
, 내 장면 는 고정 축 X을 포함, 그래서 일을 수정 한 (현재는 큐브이므로 은 회전 할 때 어떻게 동작 하는지를 볼 수 있습니다).- 마우스 X 방향으로의 이동을 끌고가
- 마우스 Y 방향으로 이동 끌고 트랙볼의 Y 축 주위 트랙볼을 회전하면 트랙볼 주위 트랙볼 회전 x 축
먼저 트랙볼을 45도 회전시킵니다. Y 축 ( 마우스를 수평으로 끌어서). 그런 다음 마우스를 세로로 드래그하면 트랙볼 이 X 축을 중심으로 회전합니다. 그러나 트랙볼의 X 축은 이제 이전 회전으로 45도를 통해 으로 회전했으며, 고정 된 X 축 (즉, 고정 된 빨간색 축이 나타나는 것처럼 트랙볼을 회전시키는 동작을 얻지 못합니다.
) 내 장면이 코드에서 원래의 코드를 기반으로합니다 : https://docs.oracle.com/javase/8/javafx/graphics-tutorial/sampleapp3d.htm
하는 XForms의 코드는 https://docs.oracle.com/javase/8/javafx/graphics-tutorial/sampleapp3d-code.htm#CJAGGIFG
에서 얼마나 내 목표를 달성하기 위해 코드를 변경해야합니까?
package moleculesampleapp;
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.Shape3D;
public class MoleculeSampleApp1 extends Application {
Group root = new Group();
Xform axisXForm = new Xform();
Xform boxXForm = new Xform();
Xform worldXForm = new Xform();
Xform cameraXform = new Xform();
PhongMaterial redMaterial,greenMaterial,blueMaterial;
PerspectiveCamera camera = new PerspectiveCamera(true);
private static double CAMERA_INITIAL_DISTANCE = -450;
private static double CAMERA_INITIAL_X_ANGLE = -10.0;
private static double CAMERA_INITIAL_Y_ANGLE = 0.0;
private static double CAMERA_NEAR_CLIP = 0.1;
private static double CAMERA_FAR_CLIP = 10000.0;
private static double AXIS_LENGTH = 250.0;
private static double MOUSE_SPEED = 0.1;
private static double ROTATION_SPEED = 2.0;
double mousePosX, mousePosY;
double mouseOldX, mouseOldY;
double mouseDeltaX, mouseDeltaY;
private void handleMouse(Scene scene) {
scene.setOnMousePressed(me -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
});
scene.setOnMouseDragged(me -> {
mouseOldX = mousePosX;
mouseOldY = mousePosY;
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseDeltaX = (mousePosX - mouseOldX);
mouseDeltaY = (mousePosY - mouseOldY);
if (me.isPrimaryButtonDown()) {
boxXForm.ry.setAngle(boxXForm.ry.getAngle() - mouseDeltaX * MOUSE_SPEED * ROTATION_SPEED); // left right
boxXForm.rx.setAngle(boxXForm.rx.getAngle() + mouseDeltaY * MOUSE_SPEED * ROTATION_SPEED); // up down
}
});
}
private void handleKeyboard(Scene scene) {
scene.setOnKeyPressed(event -> {
switch (event.getCode()) {
case Z:
camera.setTranslateZ(CAMERA_INITIAL_DISTANCE);
cameraXform.ry.setAngle(CAMERA_INITIAL_Y_ANGLE);
cameraXform.rx.setAngle(CAMERA_INITIAL_X_ANGLE);
boxXForm.reset();
break;
}
});
}
PhongMaterial createMaterial(Color diffuseColor, Color specularColor) {
PhongMaterial material = new PhongMaterial(diffuseColor);
material.setSpecularColor(specularColor);
return material;
}
@Override
public void start(Stage primaryStage) {
root.getChildren().add(worldXForm);
root.setDepthTest(DepthTest.ENABLE);
// Create materials
redMaterial = createMaterial(Color.DARKRED,Color.RED);
greenMaterial = createMaterial(Color.DARKGREEN,Color.GREEN);
blueMaterial = createMaterial(Color.DARKBLUE,Color.BLUE);
// Build Camera
root.getChildren().add(camera);
cameraXform.getChildren().add(camera);
camera.setNearClip(CAMERA_NEAR_CLIP);
camera.setFarClip(CAMERA_FAR_CLIP);
camera.setTranslateZ(CAMERA_INITIAL_DISTANCE);
cameraXform.ry.setAngle(CAMERA_INITIAL_Y_ANGLE);
cameraXform.rx.setAngle(CAMERA_INITIAL_X_ANGLE);
// Build Axes
Box xAxis = new Box(AXIS_LENGTH, 1, 1);
Box yAxis = new Box(1, AXIS_LENGTH, 1);
Box zAxis = new Box(1, 1, AXIS_LENGTH);
xAxis.setMaterial(redMaterial);
yAxis.setMaterial(greenMaterial);
zAxis.setMaterial(blueMaterial);
axisXForm.getChildren().addAll(xAxis, yAxis, zAxis);
worldXForm.getChildren().addAll(axisXForm);
// Build shiney red box
Shape3D box = new Box(80, 80, 80);
box.setMaterial(redMaterial);
boxXForm.getChildren().add(box);
worldXForm.getChildren().addAll(boxXForm);
Scene scene = new Scene(root, 1024, 768, true);
scene.setFill(Color.GREY);
handleKeyboard(scene);
handleMouse(scene);
primaryStage.setTitle("Molecule Sample Application");
primaryStage.setScene(scene);
primaryStage.show();
scene.setCamera(camera);
}
public static void main(String[] args) {
launch(args);
}
}
왜 당신의 인생을 힘들게 만들고 오른쪽 좌표계를 사용하지 않겠습니까? https://en.wikipedia.org/wiki/Right-hand_rule을 참조하십시오. – mipa
JavaFX 기본 좌표계를 사용하고 있습니다. 그러나 어쨌든 그것은 중요하지 않습니다. 문제는 객체가 좌표계를 소유하기보다는 고정 된 장면 좌표계를 기준으로 객체를 회전시키는 방법입니다. –
사실이 아닙니다. JavaFX에서는 기본 Z 축이 뷰어에서 화면으로 사라집니다. – mipa