gpt4 book ai didi

3d - 如何在 JavaFX 中围绕自定义枢轴旋转对象?

转载 作者:行者123 更新时间:2023-12-05 09:23:36 24 4
gpt4 key购买 nike

我想围绕一个自定义枢轴旋转一个对象,这是它的点,所以我有这样的代码:

private final EventHandler<MouseEvent> mouseEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
dragStartX = mouseEvent.getSceneX();
dragStartY = mouseEvent.getSceneY();
mousePosX = mouseEvent.getSceneX();
mousePosY = mouseEvent.getSceneY();
mouseOldX = mouseEvent.getSceneX();
mouseOldY = mouseEvent.getSceneY();

if (mouseEvent.isMiddleButtonDown()) {
pivot = mouseEvent.getPickResult().getIntersectedPoint();
camForm1.rx.setPivotX(pivot.getX());
camForm1.ry.setPivotY(pivot.getY());
camForm1.rz.setPivotZ(pivot.getZ());
System.out.println(pivot);
}

} else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) {

double modifier = 1.0;
double modifierFactor = 0.3;

if (mouseEvent.isControlDown()) {
modifier = 0.1;
}
if (mouseEvent.isShiftDown()) {
modifier = 10.0;
}

mouseOldX = mousePosX;
mouseOldY = mousePosY;
mousePosX = mouseEvent.getSceneX();
mousePosY = mouseEvent.getSceneY();
mouseDeltaX = (mousePosX - mouseOldX); //*DELTA_MULTIPLIER;
mouseDeltaY = (mousePosY - mouseOldY); //*DELTA_MULTIPLIER;

double flip = -1.0;

if (mouseEvent.isPrimaryButtonDown() && mouseEvent.isSecondaryButtonDown()) {
camForm2.t.setX(camForm2.t.getX() + flip * mouseDeltaX * modifierFactor * modifier * 0.3); // -
camForm2.t.setY(camForm2.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // - yFlip*
} else if (mouseEvent.isSecondaryButtonDown()) {
camForm1.ry.setAngle(camForm1.ry.getAngle() - mouseDeltaX * modifierFactor * modifier * 2.0); // + yFlip*
camForm1.rx.setAngle(camForm1.rx.getAngle() + flip * mouseDeltaY * modifierFactor * modifier * 2.0); // -

}
}
}
};

camForm1camForm2XForm 类的例子。

    public class XForm extends Group {

public enum RotateOrder {
XYZ, XZY, YXZ, YZX, ZXY, ZYX
}

public Translate t = new Translate();
public Translate p = new Translate();
public Translate ip = new Translate();
public Rotate rx = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.X_AXIS);
public Rotate ry = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.Y_AXIS);
public Rotate rz = new Rotate(0.0, 0.0, 0.0, 0.0, Rotate.Z_AXIS);
public Scale s = new Scale();

public XForm() {
super();
getTransforms().addAll(t, rz, ry, rx, s);
}
...
}

但是旋转是围绕点 O(0, 0, 0) 进行的。我做错了什么?

最佳答案

刚刚自己处理了这个问题。

我不太明白你的代码,但是 Rotate class允许设置自定义枢轴点。

一个例子:

Box box = new Box(1, 1, 1); // can be any Node
box.getTransforms().add(new Rotate(angle, pivotX, pivotY, pivotZ, Rotate.Z_AXIS));

关于3d - 如何在 JavaFX 中围绕自定义枢轴旋转对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20457122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com