Ejemplo n.º 1
0
        private void SpecialLipsPointsUpdate(List <HeadPoint> points, Vector2 targetPoint)
        {
            var mouthIndices = headController.GetMouthIndexes();

            var borders = new Vector3[] { ProgramCore.Project.DetectedLipsPoints[0], ProgramCore.Project.DetectedLipsPoints[4] };

            float maxX, minX;
            var   center = GetCenter(points, mouthIndices, out minX, out maxX);
            var   rightPosUserSelected = MirroredHeadPoint.GetFrontWorldPoint(targetPoint, ProgramCore.CurrentProgram);        // перенояем координаты с левой картинки в правой
            var   delta2 = rightPosUserSelected - center;

            var leftBorder  = MirroredHeadPoint.GetFrontWorldPoint(borders[0], ProgramCore.CurrentProgram) - rightPosUserSelected;
            var rightBorder = MirroredHeadPoint.GetFrontWorldPoint(borders[1], ProgramCore.CurrentProgram) - rightPosUserSelected;

            minX = minX - center.X;
            maxX = maxX - center.X;

            //Подгоняем все точки в центр и растягиваем по ширине
            foreach (var index in mouthIndices)
            {
                var p  = points[index];
                var dx = p.Value.X - center.X;
                dx      = dx < 0.0f ? (dx * leftBorder.X / minX) : (rightBorder.X * dx / maxX);
                p.Value = new Vector2(center.X + dx + delta2.X, p.Value.Y + delta2.Y);
            }
            //Проставляем фиксированные точки
            var indices = new int[] { 15, 17, 1, 39, 37, 38, 16, 51, 53 };
            var i       = 0;

            foreach (var index in indices)
            {
                var p = points[index];
                p.Value = MirroredHeadPoint.GetFrontWorldPoint(ProgramCore.Project.DetectedLipsPoints[i++], ProgramCore.CurrentProgram);
            }

            foreach (var index in mouthIndices)
            {
                var p = points[index];
                autodotsShapeHelper.Transform(p.Value, index);
            }
            var lipsPoints = new List <Vector2>();

            for (int j = 9; j < 13; ++j)
            {
                lipsPoints.Add(MirroredHeadPoint.GetFrontWorldPoint(ProgramCore.Project.DetectedLipsPoints[j], ProgramCore.CurrentProgram));
            }
            autodotsShapeHelper.TransformLips(lipsPoints);

            var         aIndex      = indices[indices.Length - 2];
            var         a           = points[aIndex];
            var         bIndex      = indices[indices.Length - 1];
            var         b           = points[bIndex];
            const float minLipsDist = 0.3f;

            if (a.Value.Y - b.Value.Y < minLipsDist)
            {
                var centerY = (a.Value.Y + b.Value.Y) * 0.5f;
                a.Value.Y = centerY - minLipsDist * 0.5f;
                b.Value.Y = centerY + minLipsDist * 0.5f;
            }

            autodotsShapeHelper.Transform(a.Value, aIndex);
            autodotsShapeHelper.Transform(b.Value, bIndex);
        }