예제 #1
0
        public override void Handle(Ray ray, float scale)
        {
            SceneObject obj = Selection.ActiveObject;

            Ray axisRay = new Ray(obj.Transform.Position, SelectedAxis);

            closestPoint = axisRay.ClosestPointTo(ray);
            Vector3 dirToClosest = (closestPoint - obj.Transform.Position) * SelectedAxis;

            hitPoint = GetAxisPlaneHitPoint(obj, ray);
            hitDir   = (hitPoint - obj.Transform.Position);

            float angleOffset = initDir.CalculateAngleTo(hitDir, SelectedAxis);

            if (!float.IsNaN(angleOffset))
            {
                Vector4 rotation = obj.Transform.GetRotationMatrix() * (new Vector4(SelectedAxis * angleOffset, 1f));

                foreach (SceneObject selObj in Selection.Selected)
                {
                    selObj.Transform.LocalRotation = mRotation * Quaternion.FromEulerAngles(rotation.Xyz);
                }

                mRotation = obj.Transform.LocalRotation;
                initDir   = hitDir;
            }
        }
예제 #2
0
        public override void Handle(Ray ray, float scale)
        {
            SceneObject obj = Selection.ActiveObject;

            Ray axisRay = new Ray(obj.Transform.Position, SelectedAxis);

            Vector3 closestPointToAxis = axisRay.ClosestPointTo(ray);
            Vector3 axisPoint          = (obj.Transform.Position + SelectedAxis * scale);

            Vector3 offset = axisPoint - closestPointToAxis;

            if (Control.ModifierKeys.HasFlag(Keys.Control))
            {
                offset.X = (float)Math.Round(offset.X * 4f) / 4f;
                offset.Y = (float)Math.Round(offset.Y * 4f) / 4f;
                offset.Z = (float)Math.Round(offset.Z * 4f) / 4f;
            }

            //obj.Transform.LocalPosition -= offset;
            foreach (SceneObject selObj in Selection.Selected)
            {
                if (!Selection.Selected.Contains(selObj.Parent))
                {
                    selObj.Transform.LocalPosition -= offset;
                }
            }
        }
예제 #3
0
        private Vector3 GetClosestPointToAxis(SceneObject obj, Ray ray, Vector3 axis)
        {
            Ray axisRay = new Ray(obj.Transform.Position, axis);

            return(axisRay.ClosestPointTo(ray));
        }