示例#1
0
        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();
            }
        }
示例#2
0
        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);
        }