我使用Java和JavaFXPanel来显示3D模型。
目前我有一个3D模型,我可以遍历和旋转,绝对精细。旋转中心设置为模型的中心,因此旋转始终发生在那里。
功能我正在尝试添加一个可切换的模式,然后当它为真时你单击模型它会将旋转中心改变到单击鼠标的位置并将相机聚焦在该点上。因此,当您退出模式时,您现在围绕此新位置旋转。
我目前处理这个过程的尝试看起来有点像这样:
// Register mouse click event handler
scene.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent me) {
// Was an object selected?
final PickResult result = me.getPickResult();
if (result.getIntersectedNode() instanceof Shape3D) {
// Do some stuff
final Point3D point = result.getIntersectedPoint();
if (isToggleTrue) {
changeCameraFocus(point);
}
}};}
changeCameraFocus方法是:
private void changeCameraFocus(final Point3D point)
{
camera.setTranslateX(point.getX());
camera.setTranslateY(point.getY());
camera.setTranslateZ(point.getZ());
rotationCenter = point;
}
变量rotationCenter使用如下(注意cameraRotate是注册到相机的Affine()),当鼠标在屏幕上拖动时:
cameraRotate.appendRotation(-angle, rotationCenter .getX(), rotationCenter .getY(), rotationCenter .getZ(), rotationAxis);
虽然这可以改变对象和旋转中心的焦点,但是它居中的位置不是鼠标点击发生的位置(尽管它在附近且对象可见)。
尝试使用方法&#34; getScene&#34;和&#34; getScreen&#34;在鼠标事件上获取坐标导致距离模型一个数量级的位置,因此显示器远离一切。
如果有任何帮助,我将不胜感激。
提前致谢。
更新:
我相信我已经接近解决方案,将相机旋转方法重新编写为以下
private void changeCameraFocus(Point3D point)
{
Point3D newPoint = point.subtract(origin);
cameraRotate.setToIdentity();
cameraTranslate.setX(newPoint.getX());
cameraTranslate.setY(newPoint.getY());
modelCentre = point;
}
它解决了这个问题,缺点是每次点击鼠标时都会重置视图的可用性视角,以便显示原始角度。