internal void SetClickedFaceAsBottom(Ray pointer) { Ray adjustedPointer = new Ray(pointer.Start - offset, pointer.Direction); hovered = false; float distance = float.PositiveInfinity; Vector3 clickedPoint = Vector3.Zero; Plane clickedPlane = null; var triangleIndex = 0; var count = 0; foreach (Triangle t in base.Triangles) { TriangleRayIntersect i = new TriangleRayIntersect(t, adjustedPointer); if (i.Intersects) { float d = (adjustedPointer.Start - i.Point).Length; if (d < distance) { distance = d; clickedPoint = i.Point; clickedPlane = t.Plane; triangleIndex = count; } } count++; } if (clickedPlane != null) { fromTransform = Transformation; this.Transformation = Matrix4.Identity; Vector3 originalCenter = (this.MinPoint + this.MaxPoint) * 0.5f; clickedPlane = Triangles.ElementAt(triangleIndex).Plane; var up = Vector3.UnitZ; if (Math.Abs(clickedPlane.Normal.Z) > 0.95) { up = Vector3.UnitX; } Matrix4 rotate = Matrix4.LookAt(Vector3.Zero, clickedPlane.Normal, up); rotate = rotate.ClearTranslation(); // We want the original clicked point to be at the same X and Y, and at Z = 0 Vector3 fix = Vector3.Transform(clickedPlane.Point, rotate); Vector3 newCenter = Vector3.Transform(originalCenter, rotate); Console.WriteLine("Original Center: " + originalCenter); rotate = Matrix4.Mult(rotate, Matrix4.CreateTranslation(originalCenter.X - newCenter.X, originalCenter.Y - newCenter.Y, -fix.Z)); transformBeginTime = DateTime.Now; targetTransform = rotate; this.isTransforming = true; this.Transformation = targetTransform; this.GenerateTabPaths(lastToolRadius); this.Transformation = Matrix4.Identity; this.RefreshDisplayLists(); } }
float IClickable3D.DistanceToObject(Ray pointer) { Ray adjustedPointer = new Ray(pointer.Start - offset, pointer.Direction); hovered = false; float distance = float.PositiveInfinity; hoveredTriangle = null; if (!isTransforming) { foreach (Triangle t in base.Triangles) { TriangleRayIntersect i = new TriangleRayIntersect(t, adjustedPointer); if (i.Intersects) { float d = (adjustedPointer.Start - i.Point).Length; if (d < distance) { distance = d; mouseHoverPoint = i.Point; hoveredTriangle = t; } } } } // Remember the closest edge - debugging //float x = 0; //closestEdge = null; //foreach (Edge edge in this.Edges) //{ // List<Vector3> vertices = new List<Vector3>(edge.Vertices); // LineSegment segment = new LineSegment(vertices[0], vertices[1]); // float d = segment.Distance(mouseHoverPoint); // if (d < x || closestEdge == null) // { // closestEdge = edge; // x = d; // } //} isPointedAt = distance < float.PositiveInfinity; return(distance); }