java - JavaFX 3D围绕纬度旋转相机Y
问题描述
我已经定义了一个围绕场景原点旋转的相机,带有一个 Rotate X 轴和一个 Rotate 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 轴线平行于框架。
解决方案
我意识到我必须修改 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();
}
推荐阅读
- python - python:ctypes访问头文件中的常量
- django - 将 CSV 文件转换为 Django 模板
- python-3.x - 在 python 中使用函数 any() 时代码不显示任何答案
- python - 如何从我的根路径自动重定向?
- node.js - 结构指针类型的 node-ffi OUT 参数无法接收来自 DLL 调用的返回值
- javascript - 如何根据选择的选项将数据输出到表
- python - 如果需要,如何通过插入虚拟行来获得分组对角线值?
- azure - 如何在 Azure API 管理实例中远程登录
- r - 根据条件替换列集中的值
- php - Woocommerce 无需结帐即可免费下载