Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
 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);
 }