Revisão | a76a4e8fc80a61f6223846895715265e27ee2024 (tree) |
---|---|
Hora | 2021-06-13 20:42:03 |
Autor | sebastian_bugiu |
Commiter | sebastian_bugiu |
Moved stuff around in preparation for changing from XForm crap to ENG_Quaternion and ENG_Vector3D.
@@ -504,7 +504,7 @@ | ||
504 | 504 | |
505 | 505 | { |
506 | 506 | mouseEventHandler = event -> { |
507 | - // System.out.println("MouseEvent ..."); | |
507 | +// System.out.println("MouseEvent ..."); | |
508 | 508 | |
509 | 509 | double flip = -1.0; |
510 | 510 |
@@ -530,17 +530,22 @@ | ||
530 | 530 | resetCurrentIntersectedNode(); |
531 | 531 | } else { |
532 | 532 | currentIntersectedNode = pickResult.getIntersectedNode(); |
533 | - if (currentIntersectedNode.getTransforms().size() == 0) { | |
534 | - currentIntersectedNode.getTransforms().add(new Affine()); | |
533 | + Asteroid asteroid = nodeToAsteroidMap.get(currentIntersectedNode); | |
534 | + if (asteroid == null) { | |
535 | + currentIntersectedNode = null; | |
536 | + } else { | |
537 | + if (currentIntersectedNode.getTransforms().size() == 0) { | |
538 | + currentIntersectedNode.getTransforms().add(new Affine()); | |
539 | + } | |
540 | + NodeData nodeData = nodeMap.get(currentIntersectedNode); | |
541 | + if (nodeData == null) { | |
542 | + nodeData = new NodeData(); | |
543 | + nodeMap.put(currentIntersectedNode, nodeData); | |
544 | + } | |
545 | + currentIntersectedNodeDistance = pickResult.getIntersectedDistance(); | |
546 | + currentIntersectedNodeInitialPos = Utility.unProjectDirection(camera, cameraXform.rx, cameraXform.ry, cameraXform.rz, mousePosX, mousePosY, | |
547 | + getSubScene().getWidth(), getSubScene().getHeight()); | |
535 | 548 | } |
536 | - NodeData nodeData = nodeMap.get(currentIntersectedNode); | |
537 | - if (nodeData == null) { | |
538 | - nodeData = new NodeData(); | |
539 | - nodeMap.put(currentIntersectedNode, nodeData); | |
540 | - } | |
541 | - currentIntersectedNodeDistance = pickResult.getIntersectedDistance(); | |
542 | - currentIntersectedNodeInitialPos = Utility.unProjectDirection(camera, cameraXform.rx, cameraXform.ry, mousePosX, mousePosY, | |
543 | - getSubScene().getWidth(), getSubScene().getHeight()); | |
544 | 549 | } |
545 | 550 | |
546 | 551 |
@@ -563,20 +568,26 @@ | ||
563 | 568 | mouseDeltaX = (mousePosX - mouseOldX); //*DELTA_MULTIPLIER; |
564 | 569 | mouseDeltaY = (mousePosY - mouseOldY); //*DELTA_MULTIPLIER; |
565 | 570 | |
566 | - | |
571 | + System.out.println("mouseDeltaX: " + mouseDeltaX + " mouseDeltaY: " + mouseDeltaY); | |
567 | 572 | |
568 | 573 | if (currentIntersectedNode != null) { |
569 | 574 | NodeData nodeData = nodeMap.get(currentIntersectedNode); |
570 | 575 | if (currentModifier == Modifier.TRANSLATION) { |
571 | - Point3D vecPos = Utility.unProjectDirection(camera, cameraXform.rx, cameraXform.ry, mousePosX, mousePosY, | |
576 | + Point3D vecPos = Utility.unProjectDirection(camera, cameraXform.rx, cameraXform.ry, cameraXform.rz, mousePosX, mousePosY, | |
572 | 577 | getSubScene().getWidth(), getSubScene().getHeight()); |
573 | - Point3D p = vecPos.subtract(currentIntersectedNodeInitialPos).multiply(currentIntersectedNodeDistance); | |
574 | - nodeData.getNodePos().addInPlace(new ENG_Vector4D(p.getX(), -1 * p.getY(), p.getZ(), 1.0)); | |
578 | + Point3D subtract = vecPos.subtract(currentIntersectedNodeInitialPos); | |
579 | + ENG_Matrix4 rotationMatrix = nodeData.getNodeRotation().toRotationMatrix(); | |
580 | + ENG_Vector4D transformedMousePos = rotationMatrix.transform(new ENG_Vector4D(subtract.getX(), subtract.getY(), subtract.getZ(), 1.0f)); | |
581 | +// Point3D p = subtract.multiply(currentIntersectedNodeDistance); | |
582 | + System.out.println("substract: " + subtract + " transformedMousePos: " + transformedMousePos); | |
583 | + nodeData.getNodePos().addInPlace(new ENG_Vector4D(transformedMousePos.x, -1 * transformedMousePos.y, transformedMousePos.z, 1.0)); | |
575 | 584 | // getCurrentIntersectedNodeTransform().appendTranslation(p.getX(), -1 * p.getY(), p.getZ()); |
576 | 585 | Asteroid asteroid = nodeToAsteroidMap.get(currentIntersectedNode); |
577 | - asteroid.getPosition().set(nodeData.getNodePos()); | |
578 | - currentIntersectedNodeInitialPos = vecPos; | |
579 | - currentIntersectedNodeDistance = event.getPickResult().getIntersectedDistance(); | |
586 | + if (asteroid != null) { | |
587 | + asteroid.getPosition().set(nodeData.getNodePos()); | |
588 | + currentIntersectedNodeInitialPos = vecPos; | |
589 | + currentIntersectedNodeDistance = event.getPickResult().getIntersectedDistance(); | |
590 | + } | |
580 | 591 | } else if (currentModifier == Modifier.ROTATION) { |
581 | 592 | if (mouseDeltaX != 0 || mouseDeltaY != 0) { |
582 | 593 | Point3D zVec = new Point3D(0, 0, 1); |
@@ -592,7 +603,9 @@ | ||
592 | 603 | nodeRotation.mulInPlace(currentRot); |
593 | 604 | nodeRotation.mulInPlace(currentOrientationCopy); |
594 | 605 | Asteroid asteroid = nodeToAsteroidMap.get(currentIntersectedNode); |
595 | - asteroid.getOrientation().set(nodeRotation); | |
606 | + if (asteroid != null) { | |
607 | + asteroid.getOrientation().set(nodeRotation); | |
608 | + } | |
596 | 609 | // Point3D pivot = new Point3D(getCurrentIntersectedNodeTransform().getTx(), getCurrentIntersectedNodeTransform().getTy(), getCurrentIntersectedNodeTransform().getTz()); |
597 | 610 | // System.out.println("rot pivot: " + pivot); |
598 | 611 | // getCurrentIntersectedNodeTransform().appendRotation(1, new Point3D(0, 0, 0), rotAxis); |
@@ -605,22 +618,8 @@ | ||
605 | 618 | trans.setTrans(nodeData.getNodePos()); |
606 | 619 | |
607 | 620 | Affine transform = getCurrentIntersectedNodeTransform(); |
608 | - transform.setMxx(trans.get(0, 0)); | |
609 | - transform.setMxy(trans.get(0, 1)); | |
610 | - transform.setMxz(trans.get(0, 2)); | |
611 | - transform.setTx(trans.get(0, 3)); | |
612 | - transform.setMyx(trans.get(1, 0)); | |
613 | - transform.setMyy(trans.get(1, 1)); | |
614 | - transform.setMyz(trans.get(1, 2)); | |
615 | - transform.setTy(trans.get(1, 3)); | |
616 | - transform.setMzx(trans.get(2, 0)); | |
617 | - transform.setMzy(trans.get(2, 1)); | |
618 | - transform.setMzz(trans.get(2, 2)); | |
619 | - transform.setTz(trans.get(2, 3)); | |
621 | + Utility.setAffine(trans, transform); | |
620 | 622 | } else { |
621 | - | |
622 | - | |
623 | - | |
624 | 623 | @SuppressWarnings("unused") |
625 | 624 | boolean alt = (true || event.isAltDown()); // For now, don't require ALT to be pressed |
626 | 625 | if (alt && (event.isMiddleButtonDown() |
@@ -634,11 +633,11 @@ | ||
634 | 633 | * modifier * 0.3); // - |
635 | 634 | } else if (alt && event.isPrimaryButtonDown()) { |
636 | 635 | cameraXform.ry.setAngle(cameraXform.ry.getAngle() |
637 | - - yFlip * mouseDeltaX | |
636 | + - yFlip * mouseDeltaY | |
638 | 637 | * modifierFactor * modifier |
639 | 638 | * 2.0); // + |
640 | 639 | cameraXform.rx.setAngle(cameraXform.rx.getAngle() |
641 | - + flip * mouseDeltaY | |
640 | + + flip * mouseDeltaX | |
642 | 641 | * modifierFactor * modifier |
643 | 642 | * 2.0); // - |
644 | 643 | } else if (alt && event.isSecondaryButtonDown()) { |
@@ -651,11 +650,14 @@ | ||
651 | 650 | // camera.setTranslateZ(newZ); |
652 | 651 | } |
653 | 652 | } |
653 | + } else if (event.getEventType() == MouseEvent.MOUSE_RELEASED) { | |
654 | 654 | |
655 | 655 | } |
656 | 656 | }; |
657 | 657 | } |
658 | 658 | |
659 | + | |
660 | + | |
659 | 661 | private void resetCurrentIntersectedNode() { |
660 | 662 | currentIntersectedNode = null; |
661 | 663 | currentIntersectedNodeDistance = -1.0; |
@@ -668,24 +670,20 @@ | ||
668 | 670 | camera.setFarClip(10000.0); // TODO: Workaround as per RT-31255 |
669 | 671 | camera.setFieldOfView(90); |
670 | 672 | |
671 | - camera.getTransforms() | |
672 | - .addAll(yUpRotate, | |
673 | - //cameraXRotate, | |
674 | - //cameraYRotate, | |
675 | - cameraPosition, cameraLookXRotate, cameraLookZRotate); | |
673 | + camera.getTransforms().addAll(yUpRotate, | |
674 | + //cameraXRotate, | |
675 | + //cameraYRotate, | |
676 | + cameraPosition, | |
677 | + cameraLookXRotate, | |
678 | + cameraLookZRotate); | |
676 | 679 | //root3D.getChildren().add(camera); |
677 | - root3D.getChildren() | |
678 | - .add(cameraXform); | |
679 | - cameraXform.getChildren() | |
680 | - .add(cameraXform2); | |
681 | - cameraXform2.getChildren() | |
682 | - .add(cameraXform3); | |
683 | - cameraXform3.getChildren() | |
684 | - .add(camera); | |
680 | + root3D.getChildren().add(cameraXform); | |
681 | + cameraXform.getChildren().add(cameraXform2); | |
682 | + cameraXform2.getChildren().add(cameraXform3); | |
683 | + cameraXform3.getChildren().add(camera); | |
685 | 684 | cameraPosition.setZ(-cameraDistance); |
686 | 685 | // camera.setTranslateZ(-cameraDistance); |
687 | - root3D.getChildren() | |
688 | - .add(autoScalingGroup); | |
686 | + root3D.getChildren().add(autoScalingGroup); | |
689 | 687 | |
690 | 688 | SessionManager sessionManager = SessionManager.getSessionManager(); |
691 | 689 | sessionManager.bind(cameraLookXRotate.angleProperty(), |
@@ -1054,4 +1052,16 @@ | ||
1054 | 1052 | // asteroidList.add(new Asteroid("Asteroid1", new ENG_Vector3D(1500.0f -200.0f -250.0f), new ENG_Quaternion(true), 50)); |
1055 | 1053 | templateContext.put("asteroids", asteroidList); |
1056 | 1054 | } |
1055 | + | |
1056 | + public Xform getCameraXform() { | |
1057 | + return cameraXform; | |
1058 | + } | |
1059 | + | |
1060 | + public Xform getCameraXform2() { | |
1061 | + return cameraXform2; | |
1062 | + } | |
1063 | + | |
1064 | + public Xform getCameraXform3() { | |
1065 | + return cameraXform3; | |
1066 | + } | |
1057 | 1067 | } |
@@ -78,16 +78,16 @@ | ||
78 | 78 | camNav.setListener((direction, amount) -> { |
79 | 79 | switch (direction) { |
80 | 80 | case TOP: |
81 | - contentModel.getCameraXRotate().setAngle(contentModel.getCameraXRotate().getAngle()-amount); | |
81 | + contentModel.getCameraXform().rx.setAngle(contentModel.getCameraXform().rx.getAngle()-amount); | |
82 | 82 | break; |
83 | 83 | case BOTTOM: |
84 | - contentModel.getCameraXRotate().setAngle(contentModel.getCameraXRotate().getAngle()+amount); | |
84 | + contentModel.getCameraXform().rx.setAngle(contentModel.getCameraXform().rx.getAngle()+amount); | |
85 | 85 | break; |
86 | 86 | case LEFT: |
87 | - contentModel.getCameraYRotate().setAngle(contentModel.getCameraYRotate().getAngle()+amount); | |
87 | + contentModel.getCameraXform().ry.setAngle(contentModel.getCameraXform().ry.getAngle()+amount); | |
88 | 88 | break; |
89 | 89 | case RIGHT: |
90 | - contentModel.getCameraYRotate().setAngle(contentModel.getCameraYRotate().getAngle()-amount); | |
90 | + contentModel.getCameraXform().ry.setAngle(contentModel.getCameraXform().ry.getAngle()-amount); | |
91 | 91 | break; |
92 | 92 | } |
93 | 93 | }); |
@@ -1,7 +1,9 @@ | ||
1 | 1 | package com.javafx.experiments.utils3d; |
2 | 2 | |
3 | +import headwayent.hotshotengine.ENG_Matrix4; | |
3 | 4 | import javafx.geometry.Point3D; |
4 | 5 | import javafx.scene.PerspectiveCamera; |
6 | +import javafx.scene.transform.Affine; | |
5 | 7 | import javafx.scene.transform.Rotate; |
6 | 8 | |
7 | 9 | public class Utility { |
@@ -11,12 +13,32 @@ | ||
11 | 13 | * in the Scene space |
12 | 14 | */ |
13 | 15 | |
14 | - public static Point3D unProjectDirection(PerspectiveCamera camera, Rotate cameraXOrientation, Rotate cameraYOrientation, double sceneX, double sceneY, | |
16 | + public static Point3D unProjectDirection(PerspectiveCamera camera, | |
17 | + Rotate cameraXOrientation, | |
18 | + Rotate cameraYOrientation, | |
19 | + Rotate cameraZOrientation, | |
20 | + double sceneX, double sceneY, | |
15 | 21 | double sWidth, double sHeight) { |
16 | 22 | double tanOfHalfFOV = Math.tan(Math.toRadians(camera.getFieldOfView()) * 0.5f); |
17 | - Point3D vMouse = new Point3D(tanOfHalfFOV*(2*sceneX/sWidth-1), tanOfHalfFOV*(2*sceneY/sWidth-sHeight/sWidth), 1); | |
18 | - vMouse = cameraYOrientation.transform(vMouse); | |
19 | - vMouse = cameraXOrientation.transform(vMouse); | |
23 | + Point3D vMouse = new Point3D(tanOfHalfFOV*(2*sceneX/sWidth-1), tanOfHalfFOV*(2*sceneY/sWidth-sHeight/sWidth), 0); | |
24 | +// vMouse = cameraZOrientation.transform(vMouse); | |
25 | +// vMouse = cameraYOrientation.transform(vMouse); | |
26 | +// vMouse = cameraXOrientation.transform(vMouse); | |
20 | 27 | return vMouse; |
21 | 28 | } |
29 | + | |
30 | + public static void setAffine(ENG_Matrix4 trans, Affine transform) { | |
31 | + transform.setMxx(trans.get(0, 0)); | |
32 | + transform.setMxy(trans.get(0, 1)); | |
33 | + transform.setMxz(trans.get(0, 2)); | |
34 | + transform.setTx(trans.get(0, 3)); | |
35 | + transform.setMyx(trans.get(1, 0)); | |
36 | + transform.setMyy(trans.get(1, 1)); | |
37 | + transform.setMyz(trans.get(1, 2)); | |
38 | + transform.setTy(trans.get(1, 3)); | |
39 | + transform.setMzx(trans.get(2, 0)); | |
40 | + transform.setMzy(trans.get(2, 1)); | |
41 | + transform.setMzz(trans.get(2, 2)); | |
42 | + transform.setTz(trans.get(2, 3)); | |
43 | + } | |
22 | 44 | } |