public void dragged(int dx, int dy, boolean isControlDown, boolean isShiftDown) { if (pickedTransformable != null) { boolean controlDown = isControlDown; boolean shiftDown = isShiftDown; double deltaFactor; if (camera instanceof edu.cmu.cs.stage3.alice.core.camera.OrthographicCamera) { edu.cmu.cs.stage3.alice.core.camera.OrthographicCamera orthoCamera = (edu.cmu.cs.stage3.alice.core.camera.OrthographicCamera) camera; double nearClipHeightInScreen = renderTarget .getAWTComponent() .getHeight(); // TODO: should be viewport, but not working right now double nearClipHeightInWorld = orthoCamera.getSceneGraphOrthographicCamera().getPlane()[3] - orthoCamera.getSceneGraphOrthographicCamera().getPlane()[1]; deltaFactor = nearClipHeightInWorld / nearClipHeightInScreen; if (controlDown) { if (shiftDown) { helper.setTransformationRightNow( edu.cmu.cs.stage3.math.MathUtilities.createIdentityMatrix4d(), camera); helper.setPositionRightNow(zeroVec, pickedTransformable); pickedTransformable.rotateRightNow( edu.cmu.cs.stage3.math.MathUtilities.getXAxis(), -dy * .01, helper); pickedTransformable.rotateRightNow( edu.cmu.cs.stage3.math.MathUtilities.getYAxis(), -dx * .01, pickedTransformable); } else { helper.setTransformationRightNow( edu.cmu.cs.stage3.math.MathUtilities.createIdentityMatrix4d(), camera); helper.setPositionRightNow(zeroVec, pickedTransformable); pickedTransformable.rotateRightNow( edu.cmu.cs.stage3.math.MathUtilities.getZAxis(), -dx * .01, helper); } } else if (shiftDown) { helper.setTransformationRightNow( edu.cmu.cs.stage3.math.MathUtilities.createIdentityMatrix4d(), camera); helper.setPositionRightNow(zeroVec, pickedTransformable); tempVec.x = 0.0; tempVec.y = -dy * deltaFactor; tempVec.z = 0.0; pickedTransformable.moveRightNow(tempVec, helper); } else { helper.setTransformationRightNow( edu.cmu.cs.stage3.math.MathUtilities.createIdentityMatrix4d(), camera); helper.setPositionRightNow(zeroVec, pickedTransformable); tempVec.x = dx * deltaFactor; tempVec.y = -dy * deltaFactor; tempVec.z = 0.0; pickedTransformable.moveRightNow(tempVec, helper); } } else { double projectionMatrix11 = renderTarget.getProjectionMatrix(camera.getSceneGraphCamera()).getElement(1, 1); double nearClipDist = camera.nearClippingPlaneDistance.doubleValue(); double nearClipHeightInWorld = 2 * (nearClipDist / projectionMatrix11); double nearClipHeightInScreen = renderTarget .getAWTComponent() .getHeight(); // TODO: should be viewport, but not working right now double pixelHeight = nearClipHeightInWorld / nearClipHeightInScreen; // double pixelHeight = nearClipHeightInWorld/300; double objectDist = pickedTransformable.getPosition(camera).getLength(); deltaFactor = (objectDist * pixelHeight) / nearClipDist; if (controlDown) { if (shiftDown) { helper.setTransformationRightNow( edu.cmu.cs.stage3.math.MathUtilities.createIdentityMatrix4d(), camera); helper.setPositionRightNow(zeroVec, pickedTransformable); pickedTransformable.rotateRightNow( edu.cmu.cs.stage3.math.MathUtilities.getXAxis(), -dy * .01, helper); pickedTransformable.rotateRightNow( edu.cmu.cs.stage3.math.MathUtilities.getYAxis(), -dx * .01, pickedTransformable); } else { helper.setTransformationRightNow( edu.cmu.cs.stage3.math.MathUtilities.createIdentityMatrix4d(), world); helper.setPositionRightNow(zeroVec, pickedTransformable); pickedTransformable.rotateRightNow( edu.cmu.cs.stage3.math.MathUtilities.getYAxis(), -dx * .01, helper); } } else if (shiftDown) { helper.setTransformationRightNow( edu.cmu.cs.stage3.math.MathUtilities.createIdentityMatrix4d(), world); helper.setPositionRightNow(zeroVec, pickedTransformable); tempVec.x = 0.0; tempVec.y = -dy * deltaFactor; tempVec.z = 0.0; pickedTransformable.moveRightNow(tempVec, helper); } else { javax.vecmath.Matrix4d cameraTransformation = camera.getSceneGraphTransformable().getAbsoluteTransformation(); cameraUp.x = cameraTransformation.m10; cameraUp.y = cameraTransformation.m11; cameraUp.z = cameraTransformation.m12; cameraForward.x = cameraTransformation.m20; cameraForward.y = cameraTransformation.m21; cameraForward.z = cameraTransformation.m22; helper.setPositionRightNow(zeroVec, pickedTransformable); if (Math.abs(cameraForward.y) < Math.abs(cameraUp.y)) { // if we're looking mostly level cameraForward.y = 0.0; helper.setOrientationRightNow(cameraForward, cameraUp, world); } else { // if we're looking mostly up or down cameraUp.y = 0.0; cameraForward.negate(); helper.setOrientationRightNow(cameraUp, cameraForward, world); } tempVec.x = dx * deltaFactor; tempVec.y = 0.0; tempVec.z = -dy * deltaFactor; pickedTransformable.moveRightNow(tempVec, helper); } } } }
public Matrix33 calculatePointAt( ReferenceFrame target, javax.vecmath.Vector3d offset, javax.vecmath.Vector3d upGuide, ReferenceFrame asSeenBy, boolean onlyAffectYaw) { synchronized (s_calculatePointAtHelperOffset) { if (upGuide == null) { upGuide = MathUtilities.getYAxis(); } if (asSeenBy == null) { asSeenBy = (ReferenceFrame) getParent(); } Matrix44 transform = getTransformation(asSeenBy); Vector3 position = transform.getPosition(); // Vector3 position = new Vector3( transform.m30, transform.m31, // transform.m32 ); ReferenceFrame actualTarget; if (offset == null) { actualTarget = target; } else { s_calculatePointAtHelperOffset.setParent(target); Matrix44 m = new Matrix44(); m.m30 = offset.x; m.m31 = offset.y; m.m32 = offset.z; s_calculatePointAtHelperOffset.setLocalTransformation(m); actualTarget = s_calculatePointAtHelperOffset; } Matrix33 result; if (onlyAffectYaw) { // setup "helperA" with the orientation of "asSeenBy" and the // position of "this" s_calculatePointAtHelperA.setParent(asSeenBy); s_calculatePointAtHelperA.setLocalTransformation(new Matrix44()); s_calculatePointAtHelperA.setPosition(Vector3.ZERO, this); // calculate the angle of rotation around y of "actualTarget" as // seen by "helperA" Vector3 targetPosition = actualTarget.getPosition(s_calculatePointAtHelperA); double targetTheta = Math.atan2(targetPosition.x, targetPosition.z); // place "helperB" out in front of "this" s_calculatePointAtHelperB.setParent(this); s_calculatePointAtHelperB.setPosition(MathUtilities.getZAxis(), this); // calculate the angle of rotation around Y of "helperB" as seen // by "helperA" Vector3 forwardPosition = s_calculatePointAtHelperB.getPosition(s_calculatePointAtHelperA); double forwardTheta = Math.atan2(forwardPosition.x, forwardPosition.z); // setup "helperB" to have position and orientation of "this" s_calculatePointAtHelperB.setLocalTransformation(new Matrix44()); // calculate how much to rotate double deltaTheta = targetTheta - forwardTheta; // rotate "helperB" around Y as seen by "helperA" s_calculatePointAtHelperB.rotate( MathUtilities.getYAxis(), deltaTheta, s_calculatePointAtHelperA); // extract result result = s_calculatePointAtHelperB.getAxes(asSeenBy); // clean up s_calculatePointAtHelperA.setParent(null); s_calculatePointAtHelperB.setParent(null); } else { javax.vecmath.Vector3d targetPosition = actualTarget.getPosition(asSeenBy); javax.vecmath.Vector3d zAxis = MathUtilities.normalizeV(MathUtilities.subtract(targetPosition, position)); javax.vecmath.Vector3d xAxis = MathUtilities.normalizeV(MathUtilities.crossProduct(upGuide, zAxis)); if (Double.isNaN(xAxis.lengthSquared())) { xAxis.set(0, 0, 0); zAxis.set(0, 0, 0); // throw new RuntimeException( // "cannot calculate point at: zAxis=" + zAxis + " upGuide=" // + upGuide ); } javax.vecmath.Vector3d yAxis = MathUtilities.crossProduct(zAxis, xAxis); result = new Matrix33(xAxis, yAxis, zAxis); } if (offset == null) { s_calculatePointAtHelperOffset.setParent(null); } return result; } }