//=================================== 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); // отразить форму лица зеркально }
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(); }
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(); } }
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)); }