public Vector3 InterpolateScale(float interpolationFactor) { Shape2DExtrudeControlPoint startControlPoint = _controlPoints[Mathf.FloorToInt(interpolationFactor)]; Shape2DExtrudeControlPoint endControlPoint = _controlPoints[Mathf.CeilToInt(interpolationFactor)]; float lerpFactor = interpolationFactor - Mathf.Floor(interpolationFactor); return(Vector3.Lerp(startControlPoint.GetScale(), endControlPoint.GetScale(), lerpFactor)); }
public Quaternion InterpolateRotation(float interpolationFactor) { Shape2DExtrudeControlPoint startControlPoint = _controlPoints[Mathf.FloorToInt(interpolationFactor)]; Shape2DExtrudeControlPoint endControlPoint = _controlPoints[Mathf.CeilToInt(interpolationFactor)]; float lerpFactor = interpolationFactor - Mathf.Floor(interpolationFactor); return(Quaternion.Lerp(startControlPoint.GetRotation(), endControlPoint.GetRotation(), lerpFactor)); }
private Vector3[] VerticesFromShape(Shape2D shape, Vector3 position, Quaternion rotation, Vector3 scale) { Vector3[] vertices = new Vector3[shape.points.Length]; for (int shapePointIndex = 0; shapePointIndex < shape.points.Length; shapePointIndex++) { vertices[shapePointIndex] = Shape2DExtrudeControlPoint.TransformPoint(shape.points[shapePointIndex], position, rotation, scale); } return(vertices); }
public Vector3 InterpolatePosition(float interpolationFactor) { Shape2DExtrudeControlPoint startControlPoint = _controlPoints[Mathf.FloorToInt(interpolationFactor)]; Shape2DExtrudeControlPoint endControlPoint = _controlPoints[Mathf.CeilToInt(interpolationFactor)]; float lerpFactor = interpolationFactor - Mathf.Floor(interpolationFactor); switch (interpolationMethod) { case InterpolationMethod.Linear: return(Vector3.Lerp(startControlPoint.GetPosition(), endControlPoint.GetPosition(), lerpFactor)); case InterpolationMethod.Bezier: return(BezierCurve.BezierPosition(startControlPoint.GetPosition(), startControlPoint.GetForwardHandlePosition(), endControlPoint.GetPosition(), endControlPoint.GetBackwardHandlePosition(), lerpFactor)); default: throw new InvalidOperationException("The current interpolation method is not supported: " + interpolationMethod); } }
private Vector3[] CreateNormals(Shape2D shape) { // Creates the normals Vector3[] meshNormals = new Vector3[(resolution * (_controlPoints.Length - 1) + 1) * shape.normals.Length]; // For each control point... for (int controlPointIndex = 0; controlPointIndex < _controlPoints.Length; controlPointIndex++) { // For each resolution pass... for (int resolutionPass = 0; resolutionPass < resolution; resolutionPass++) { // Calculates the interpolated values float lerpFactor = controlPointIndex + (float)resolutionPass / resolution; Quaternion interpolatedRotation = InterpolateRotation(lerpFactor); // Caches some values int meshNormalBaseIndex = (controlPointIndex * resolution + resolutionPass) * shape.normals.Length; // For each normal in the shape... for (int shapeNormalIndex = 0; shapeNormalIndex < shape.normals.Length; shapeNormalIndex++) { // Assigns the normal to each vertex using the interpolated information int meshNormalIndex = meshNormalBaseIndex + shapeNormalIndex; meshNormals[meshNormalIndex] = Shape2DExtrudeControlPoint.TransformDirection(shape.normals[shapeNormalIndex], interpolatedRotation); } // The last control point only has one resolution pass! if (controlPointIndex == _controlPoints.Length - 1) { break; } } } return(meshNormals); }