上海 国际网站设计,电子商务网站建设的盈利模式,安康养老院收费价格表,好的版式设计网站一#xff1a;前言
一条贝塞尔曲线是由一组定义的控制点P0到 Pn#xff0c;n1为线性#xff0c;n2为二次......第一个和最后一个控制点称为起点和终点#xff0c;中间的控制点一般不会位于曲线上 获取两个点之间的点就是通过线性插值#xff08; Mathf.Lerp#xff09…一前言
一条贝塞尔曲线是由一组定义的控制点P0到 Pnn1为线性n2为二次......第一个和最后一个控制点称为起点和终点中间的控制点一般不会位于曲线上 获取两个点之间的点就是通过线性插值 Mathf.Lerp0 t 1 二贝塞尔曲线公式
——线性公式给定点P0、P1线性贝兹曲线只是一条两点之间的直线。这条线由下式给出 ——二阶贝塞尔曲线二次方贝塞尔曲线的路径由给定点P0、P1、P2的函数Bt公式推导由P0P1P1P2分别求线性公式所得的结果P0‘ 和 P1‘再带入线性公式整理所得即为二次公式 P0P1所求 P1P2所求 P0P1P2二次方公式简化所得 ——三阶贝塞尔曲线P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1并从P2的方向来到P3。一般不会经过P1或P2这两个点只是在那里提供方向。P0和P1之间的间距决定了曲线在转而趋进P3之前走向P2方向的“长度有多长”。 其公式为 三公式转换为代码
using UnityEngine;/// summary
/// 贝塞尔工具类
/// /summary
public static class BezierUtils
{/// summary/// 线性贝塞尔曲线/// /summarypublic static Vector3 BezierCurve(Vector3 p0, Vector3 p1, float t){Vector3 B Vector3.zero;B (1 - t) * p0 t * p1;return B;}/// summary/// 二阶贝塞尔曲线/// /summarypublic static Vector3 BezierCurve(Vector3 p0, Vector3 p1, Vector3 p2, float t){Vector3 B Vector3.zero;float t1 (1 - t) * (1 - t);float t2 2 * t * (1 - t);float t3 t * t;B t1 * p0 t2 * p1 t3 * p2;return B;}/// summary/// 三阶贝塞尔曲线/// /summarypublic static Vector3 BezierCurve(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t){Vector3 B Vector3.zero;float t1 (1 - t) * (1 - t) * (1 - t);float t2 3 * t * (1 - t) * (1 - t);float t3 3 * t * t * (1 - t);float t4 t * t * t;B t1 * p0 t2 * p1 t3 * p2 t4 * p3;return B;}
} 四绘制出曲线 using System.Collections.Generic;
using UnityEngine;public class BezierTest : MonoBehaviour
{public int m_CurveDensity;//曲线密度public bool m_IsSecondOrderBezier;//是否为二阶贝塞尔曲线否则为三阶贝塞尔曲线private ListTransform m_ControlPointList new ListTransform();//所有的控制点控制点作为挂载此脚本的游戏物体的子物体public void OnDrawGizmos(){//添加控制点m_ControlPointList.Clear();foreach (Transform trans in transform){m_ControlPointList.Add(trans);}ListVector3 pointList new ListVector3();//曲线上的所有点if (m_IsSecondOrderBezier){if (m_ControlPointList.Count 3){return;}//获取曲线上的所有点for (int i 0; i m_ControlPointList.Count - 2; i 2){Vector3 p0 m_ControlPointList[i].position;Vector3 p1 m_ControlPointList[i 1].position;Vector3 p2 m_ControlPointList[i 2].position;for (int j 0; j m_CurveDensity; j){float t j * 1f / m_CurveDensity;Vector3 point BezierUtils.BezierCurve(p0, p1, p2, t);pointList.Add(point);}}}else{if (m_ControlPointList.Count 4){return;}//获取曲线上的所有点for (int i 0; i m_ControlPointList.Count - 3; i 3){Vector3 p0 m_ControlPointList[i].position;Vector3 p1 m_ControlPointList[i 1].position;Vector3 p2 m_ControlPointList[i 2].position;Vector3 p3 m_ControlPointList[i 3].position;for (int j 0; j m_CurveDensity; j){float t j * 1f / m_CurveDensity;Vector3 point BezierUtils.BezierCurve(p0, p1, p2, p3, t);pointList.Add(point);}}}//绘制所有点foreach (var point in pointList){Gizmos.DrawSphere(point, 0.1f);}//绘制控制点连线Gizmos.color Color.red;for (int i 0; i m_ControlPointList.Count - 1; i){Gizmos.DrawLine(m_ControlPointList[i].position, m_ControlPointList[i 1].position);}}
}