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; } }
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; } } }
private Vector3 GetClosestPointToAxis(SceneObject obj, Ray ray, Vector3 axis) { Ray axisRay = new Ray(obj.Transform.Position, axis); return(axisRay.ClosestPointTo(ray)); }