private void ProcessMouseManipulation() { if (!MouseTracker.LeftMousePressed) { checkForHit = true; hitActor = null; HookPoint = Point3d.Unset; HookPointOnMouseLine = Point3d.Unset; } else { if (checkForHit) { checkForHit = false; Vector3d mouseLineDirection = MouseTracker.MouseLine.Direction; mouseLineDirection.Unitize(); PxGhManager.Scene.Raycast( MouseTracker.MouseLine.From.ToSystemVector(), mouseLineDirection.ToSystemVector(), 9999f, 999, HitCallback, HitFlag.Position); } if (hitActor != null) { Rhino.Geometry.Plane frame = hitActor.GlobalPose.ToRhinoPlane(); HookPoint = frame.Origin + frame.XAxis * hookPoint.X + frame.YAxis * hookPoint.Y + frame.ZAxis * hookPoint.Z; HookPointOnMouseLine = MouseTracker.MouseLine.ClosestPoint(HookPoint, false); if (MouseManipulationMode == MouseManipulationMode.Position) { frame.Origin = HookPointOnMouseLine + (frame.Origin - HookPoint); hitActor.GlobalPose = frame.ToMatrix(); hitActor.LinearVelocity = Vector3.Zero; hitActor.AddForceAtLocalPosition((hitActor.Mass * -Gravity).ToSystemVector(), hookPoint.ToSystemVector(), ForceMode.Force, true); } else { Vector3d force = (HookPointOnMouseLine - HookPoint) * MouseManipulationStrength * (MouseManipulationMode == MouseManipulationMode.Acceleration ? hitActor.Mass : 1.0); hitActor.AddForceAtLocalPosition(force.ToSystemVector(), hookPoint.ToSystemVector(), ForceMode.Force, true); } } } }
private bool HitCallback(RaycastHit[] hits) { foreach (RaycastHit hit in hits) { if (!(hit.Actor is RigidDynamic)) { continue; } hitActor = (RigidDynamic)hit.Actor; Rhino.Geometry.Plane frame = hitActor.GlobalPose.ToRhinoPlane(); Vector3d v = hit.Position.ToRhinoPoint() - frame.Origin; hookPoint = new Point3d(v * frame.XAxis, v * frame.YAxis, v * frame.ZAxis); return(true); } return(false); }