我已经定义了一个绕场景原点旋转的摄像机,它具有X轴旋转和Y轴旋转。
我希望X轴定义Y轴相机的“高度”,以便它绕球体上的给定纬度旋转。
我将旋转定义为:
_cameraTranslate = new Translate(0, 0, -10);
_cameraRotateX = new MyRotate(0, 0, 0, 10, Rotate.X_AXIS);
_cameraRotateY = new MyRotate(0, 0, 0, 10, Rotate.Y_AXIS);
_camera.getTransforms().addAll(_cameraTranslate, _cameraRotateX, _cameraRotateY);
并像这样旋转它们:
private void onMouseDragged(MouseEvent e) {
_cameraRotateX.setAngle360(_cameraRotateX.getAngle() - (-e.getSceneY() + _mouseOldY));
_cameraRotateY.setAngle360(_cameraRotateY.getAngle() - (e.getSceneX() - _mouseOldX));
_mouseOldX = e.getSceneX();
_mouseOldY = e.getSceneY();
}
这是我旋转时所做的事情,如果可以的话,可以移动世界而不是保持X轴平行于框架。
答案 0 :(得分:0)
我意识到我必须修改X摄像机的轴(上下轴)。当摄像机绕Y轴旋转时,X和Z轴移动,因此需要相应地调整旋转。
相反,我添加了一个Point3D,每次移动Y摄像机时都会对其进行修改:
_cameraRotateXAxis = new Point3D(1, 0, 0);
_cameraRotateX = new MyRotate(0, 0, 0, 10, _cameraRotateXAxis);
然后在mouseDragged方法中:
private void onMouseDragged(MouseEvent e) {
_cameraRotateX.setAngle360(_cameraRotateX.getAngle() - (-e.getSceneY() + _mouseOldY));
_cameraRotateY.setAngle360(_cameraRotateY.getAngle() - (e.getSceneX() - _mouseOldX));
_cameraRotateXAxis = _cameraRotateXAxis.add(-_cameraRotateXAxis.getX(), -_cameraRotateXAxis.getY(), -_cameraRotateXAxis.getZ());
double angle = _cameraRotateY.getAngle();
double newDelta = _cameraRotateY.getAngle()%90 / 90d;
if (angle >= 0 && angle < 90) {
_cameraRotateXAxis = _cameraRotateXAxis.add(-(1 - newDelta), 0, newDelta);
}
else if (angle >= 90 && angle < 180) {
_cameraRotateXAxis = _cameraRotateXAxis.add(newDelta, 0, 1 -newDelta);
}
else if (angle >= 180 && angle < 270) {
_cameraRotateXAxis = _cameraRotateXAxis.add(1 - newDelta, 0, -newDelta);
}
else {
_cameraRotateXAxis = _cameraRotateXAxis.add(-newDelta, 0, -(1 - newDelta));
}
_mouseOldX = e.getSceneX();
_mouseOldY = e.getSceneY();
}