コード例 #1
0
ファイル: MorphHelper.cs プロジェクト: reward-hunters/LLC
//=================================== OLD ===================================

        public void ProcessPoints_old(ProjectedDots dots, HeadPoints points)
        {
            projectedDots = dots;
            headPoints    = points;

            headIndices.Clear();
            for (int i = 0; i < dots.Points.Count; ++i)
            {
                headIndices.Add(i);
            }

            var rotaionMatrix = ProgramCore.MainForm.ctrlRenderControl.headMeshesController.RenderMesh.RotationMatrix;

            Matrix4.Invert(ref rotaionMatrix, out RotationMatrix);

            rightPower = 1.0f - Math.Abs(ProgramCore.MainForm.ctrlRenderControl.headMeshesController.RenderMesh.HeadAngle) * 2.0f / (float)Math.PI;
            //rightPower = Math.Min(1.0f, Math.Max(rightPower, 0.0f));
            // (float)Math.Cos(headPoints.HeadMesh.HeadAngle);

            rightVector   = headPoints.GetWorldPoint(new Vector3(1.0f, 0.0f, 0.0f));
            forwardVector = headPoints.GetWorldPoint(new Vector3(0.0f, 0.0f, 1.0f));

            ProcessHeadPoints_old();

            //SpecialAlignment();         // выравниваем точки рта-глаз-носа по центру лица
            //  MirrorPoints(headPoints.HeadMesh.HeadAngle > 0.0f);             // отразить форму лица зеркально
        }
コード例 #2
0
ファイル: MorphHelper.cs プロジェクト: reward-hunters/LLC
        public void ProcessPoints(ProjectedDots dots, HeadPoints points)
        {
            projectedDots = dots;
            headPoints    = points;

            rightVector   = headPoints.GetWorldPoint(new Vector3(1.0f, 0.0f, 0.0f));
            forwardVector = headPoints.GetWorldPoint(new Vector3(0.0f, 0.0f, 1.0f));
            upVector      = headPoints.GetWorldPoint(new Vector3(0.0f, 1.0f, 0.0f));

            headIndices.Clear();
            for (int i = 0; i < dots.Points.Count; ++i)
            {
                headIndices.Add(i);
            }

            var rotationMatrix = ProgramCore.MainForm.ctrlRenderControl.headMeshesController.RenderMesh.RotationMatrix;

            Matrix4.Invert(ref rotationMatrix, out RotationMatrix);

            ProcessHeadPoints();

            FixLipsPoints();
        }
コード例 #3
0
        public void ProcessPoints(ProjectedDots dots)
        {
            int[] dotIndices = Type == MorphTriangleType.Right ?
                               new int[] { 67, 69, 6, 8, 10, 11 } :
            new int[] { 66, 68, 5, 7, 9, 11 };

            var right = new Vector3(1.0f, 0.0f, 0.0f);

            right = ProgramCore.MainForm.ctrlRenderControl.headMeshesController.RenderMesh.GetWorldPoint(right);

            var a = dots.Points[dotIndices.First()];
            var b = Convex[FirstIndex];

            var sa = Vector3.Dot(new Vector3(a.X, a.Y, 0.0f), right);
            var sb = Vector3.Dot(new Vector3(b.X, b.Y, 0.0f), right);

            A = new Vector3(a.X, a.Y, 0.0f);
            B = new Vector3(b.X, b.Y, 0.0f);

            var ds = Math.Abs(sa / sb);

            foreach (var part in ProgramCore.MainForm.ctrlRenderControl.headMeshesController.RenderMesh.Parts)
            {
                foreach (var point in part.MorphPoints)
                {
                    point.Position.X *= ds;

                    foreach (var index in point.Indices)
                    {
                        part.Vertices[index].Position = point.Position;
                    }
                }

                part.UpdateBuffers();
            }
        }
コード例 #4
0
        public void Initialize(ProjectedDots dots, HeadMorphing headMorphing)
        {
            MorphTriangleType realType = Type;

            if (IsReversed)
            {
                realType = Type == MorphTriangleType.Left ? MorphTriangleType.Right : MorphTriangleType.Left;
            }

            List <Vector2> points = new List <Vector2>();

            foreach (var part in ProgramCore.MainForm.ctrlRenderControl.headMeshesController.RenderMesh.Parts)
            {
                foreach (var point in part.MorphPoints)
                {
                    if (point.TriangleType != realType || point.Position.Z < 0.0f)
                    {
                        continue;
                    }
                    if (IsReversed)
                    {
                        points.Add(point.ReversedWorldPosition.Xy);
                    }
                    else
                    {
                        points.Add(point.WorldPosition.Xy);
                    }
                }
            }

            Convex = Triangulate.ComputeConvexHull(points, (Type == MorphTriangleType.Left) == IsReversed);

            LastIndex = Convex.Count - 1;

            float prevX = Convex[LastIndex].X;
            float prevY = Convex[LastIndex].Y;

            for (int i = LastIndex - 1; i >= 0; --i)
            {
                float y = Convex[i].Y;
                float x = Convex[i].X;
                if (x > prevX == (Type == MorphTriangleType.Left))
                {
                    continue;
                }
                if (y < prevY)
                {
                    break;
                }
                prevX      = x;
                prevY      = y;
                FirstIndex = i;
            }
            Convex.RemoveRange(0, FirstIndex);
            if (Type == MorphTriangleType.Left)
            {
                Convex.Insert(0, GetPoint(dots.Points[52]));
                Convex.Insert(0, GetPoint(dots.Points[3]));
                Convex.Insert(0, GetPoint(dots.Points[58]));
                Convex.Insert(0, GetPoint(headMorphing.headPoints.Points[72].Xy));
                Convex.Insert(0, GetPoint(headMorphing.headPoints.Points[73].Xy));
                Convex.Insert(0, GetPoint(headMorphing.headPoints.Points[74].Xy));
                Convex.Insert(0, GetPoint(headMorphing.headPoints.Points[75].Xy));
            }
            else
            {
                Convex.Insert(0, GetPoint(dots.Points[53]));
                Convex.Insert(0, GetPoint(dots.Points[4]));
                Convex.Insert(0, GetPoint(dots.Points[59]));
                Convex.Insert(0, GetPoint(headMorphing.headPoints.Points[70].Xy));
                Convex.Insert(0, GetPoint(headMorphing.headPoints.Points[77].Xy));
                Convex.Insert(0, GetPoint(headMorphing.headPoints.Points[76].Xy));
                Convex.Insert(0, GetPoint(headMorphing.headPoints.Points[75].Xy));
            }
            FirstIndex = 7;
            LastIndex  = Convex.Count - 1;

            var tempPoints = new List <Point>();

            for (int index = 0; index < Convex.Count; ++index)
            {
                var position = Convex[index];
                tempPoints.Add(new Point((uint)index, position.X, position.Y));
            }
            Indices.Clear();
            Indices.AddRange(Triangulate.Delaunay(tempPoints));
        }