| 010203040506070809101112131415161718192021 | [/font][/size][/align][align=left][size=4][font=宋体]//在日出和日落之间动画弧线usingUnityEngine;usingSystem.Collections;publicclassexample : MonoBehaviour {        publicTransform sunrise;        publicTransform sunset;        voidUpdate()         {                //弧线的中心                Vector3 center = sunrise.position + sunset.position *                 0.5f;                //向下移动中心,垂直于弧线                center -=newVector3(0, 1, 0);                //相对于中心在弧线上插值                Vector3 riseRelCenter = sunrise.position - center;                Vector3 setRelCenter = sunset.position - center;                transform.position = Vector3.Slerp(riseRelCenter,                                      setRelCenter, Time.time);                transform.position += center;        }} | 
 咱们以a和b两个向量来做插值,假设分10等份,代码比较简单,如下代码[C#] 纯文本查看 复制代码?
咱们以a和b两个向量来做插值,假设分10等份,代码比较简单,如下代码[C#] 纯文本查看 复制代码?| 1234 | [/font][/align][align=left][font=宋体]       for(inti = 1; i < 10; ++i)        {            Vector3 drawVec = Vector3.Slerp(a, b, 0.1f * i);            Debug.DrawLine(Vector3.zero, drawVec, Color.yellow);        } | 
 但是,你不能被表象所欺骗,这样的效果虽然可以,但是却无法控制插值的曲线,也就是那个弧度,虽然你可以调整向量a和向量b的值来调节弧度,比方说a(1,1,0),b(-1,1,0)效果如下,可以看到弧度已经明显变平很多。
但是,你不能被表象所欺骗,这样的效果虽然可以,但是却无法控制插值的曲线,也就是那个弧度,虽然你可以调整向量a和向量b的值来调节弧度,比方说a(1,1,0),b(-1,1,0)效果如下,可以看到弧度已经明显变平很多。 但是我们在实际运用这个函数的时候往往向量a和向量b是固定的,我们想要的是控制这个弧度,那么怎么办呢,其实也就是改变画这个弧度的中心点位置。上面两个示意图上面中心点我们都是用的坐标原点,我们现在想要在不改变a和a的情况下来改变插值的弧度,就只能自己找出一个中心点,这也就是官方实例中求中心点的由来了。[C#] 纯文本查看 复制代码?
但是我们在实际运用这个函数的时候往往向量a和向量b是固定的,我们想要的是控制这个弧度,那么怎么办呢,其实也就是改变画这个弧度的中心点位置。上面两个示意图上面中心点我们都是用的坐标原点,我们现在想要在不改变a和a的情况下来改变插值的弧度,就只能自己找出一个中心点,这也就是官方实例中求中心点的由来了。[C#] 纯文本查看 复制代码?| 0102030405060708091011 | [/font][/align][align=left][font=宋体]       //弧线的中心        Vector3 center = (a + b) * 0.5f;        //我们把中心点向下移动中心,垂直于弧线        center -=newVector3(0, 0.5f, 0);        // 求出新的中心点到向量a和向量b的        Vector3 vecA = a - center;        Vector3 vecB = b - center;        for(inti = 0; i <= 10; ++i)        {            Vector3 drawVec = Vector3.Slerp(vecA, vecB, 0.1f * i);            Debug.DrawLine(center, drawVec, Color.yellow);        } | 
 (至于为什么要 求出新的中心点到向量a和向量b的vecA和vecB是因为,我们在球形插值的时候要的是两个vector3,而这个vector3是要向量a和向量b到中心点的向量,如果我们不求出vecA和vecB的话不论你怎么插值,其实都是从坐标原点进行的插值,你是控制不了插值的弧度的。)从上面的效果图我们可以看到插值出来的弧度开始和结束点并不是a、b两点,而是这两个点向下的偏移量,而这个偏移量正好是向量conter的负值,所以我们在求出drawVec之后需要对其做修正处理。在求出drawVec之后加上下面的代码[C#] 纯文本查看 复制代码?
(至于为什么要 求出新的中心点到向量a和向量b的vecA和vecB是因为,我们在球形插值的时候要的是两个vector3,而这个vector3是要向量a和向量b到中心点的向量,如果我们不求出vecA和vecB的话不论你怎么插值,其实都是从坐标原点进行的插值,你是控制不了插值的弧度的。)从上面的效果图我们可以看到插值出来的弧度开始和结束点并不是a、b两点,而是这两个点向下的偏移量,而这个偏移量正好是向量conter的负值,所以我们在求出drawVec之后需要对其做修正处理。在求出drawVec之后加上下面的代码[C#] 纯文本查看 复制代码?| drawVec += center; | 
 现在的效果图就是我们想要的插值效果了,要想控制弧度,只用调节centor的偏移量就可以了。比方说我们加上这样一条center -= newVector3(0, 2f, 0);可以看到效果如下
现在的效果图就是我们想要的插值效果了,要想控制弧度,只用调节centor的偏移量就可以了。比方说我们加上这样一条center -= newVector3(0, 2f, 0);可以看到效果如下 这个弧度是不是就更平了呢。好,看到现在还没有睡着的同学们,我只能说一句你们有福了,下面可是大餐哦。上面咱们介绍的都是有局限性的,比方说向量a和向量b对于Y轴可是左右对称的,并且X,Y轴的值也是相等的,这在实际运用中可是非常不常见的,现在咱们对向量a做一个比较小的改动看看,把向量a改为(2,1,0),那么效果如下所示
这个弧度是不是就更平了呢。好,看到现在还没有睡着的同学们,我只能说一句你们有福了,下面可是大餐哦。上面咱们介绍的都是有局限性的,比方说向量a和向量b对于Y轴可是左右对称的,并且X,Y轴的值也是相等的,这在实际运用中可是非常不常见的,现在咱们对向量a做一个比较小的改动看看,把向量a改为(2,1,0),那么效果如下所示 哇咔咔,居然还是好好的球形插值啊,哈哈,各位同学别激动,咱们把向量a的Y轴也调整一下看看,把a改为(2,4,0)效果如下图所示
哇咔咔,居然还是好好的球形插值啊,哈哈,各位同学别激动,咱们把向量a的Y轴也调整一下看看,把a改为(2,4,0)效果如下图所示 哇咔咔。。效果是不是非常明显啊,说好的球形插值呢?怎么成了这个样子!!哈哈,各位同学别着急啊,咱们这个球形插值和核心其实就是center点的位置,只要我们求的这个center点的位置在a和b连线中心点的垂线上面,那么就是一个完整的左右对称的插值了。下面咱们加入如下代码[C#] 纯文本查看 复制代码?
哇咔咔。。效果是不是非常明显啊,说好的球形插值呢?怎么成了这个样子!!哈哈,各位同学别着急啊,咱们这个球形插值和核心其实就是center点的位置,只要我们求的这个center点的位置在a和b连线中心点的垂线上面,那么就是一个完整的左右对称的插值了。下面咱们加入如下代码[C#] 纯文本查看 复制代码?| 1 | Vector3 centorPRoject = Vector3.Project(centor, mStart - mEnd);// 中心点在两点之间的投影     centor = Vector3.MoveTowards(centor, centorProject, 1f);// 沿着投影方向移动移动距离(距离越大弧度越小) | 
 所以我们完整的运用Vector3.Slerp的代码应该是这样子滴[C#] 纯文本查看 复制代码?
所以我们完整的运用Vector3.Slerp的代码应该是这样子滴[C#] 纯文本查看 复制代码?| 0102030405060708091011121314151617181920 | [/font][/align][align=left][font=宋体]//在日出和日落之间动画弧线usingUnityEngine;usingSystem.Collections;publicclassexample : MonoBehaviour {        publicTransform sunrise;        publicTransform sunset;        voidUpdate()         {                //弧线的中心                Vector3 center = sunrise.position + sunset.position * 0.5f;                Vector3 centorProject = Vector3.Project(centor, sunrise.position - sunset.position);// 中心点在两点之间的投影                centor = Vector3.MoveTowards(centor, centorProject, 1f);// 沿着投影方向移动移动距离(距离越大弧度越小)                                //相对于中心在弧线上插值                Vector3 riseRelCenter = sunrise.position - center;                Vector3 setRelCenter = sunset.position - center;                transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, Time.time);                transform.position += center;        }} | 
 哇咔咔。。是不是又出问题了?还需要改代码?NO!这是因为我们锁定了视角方向来看的,看上面的2D选项是不是已经选择了啊,哈哈。那么既然Z轴有值了我们就不能已平面视角来看了,等我们把2D锁定给关闭了转换个视角看看。
哇咔咔。。是不是又出问题了?还需要改代码?NO!这是因为我们锁定了视角方向来看的,看上面的2D选项是不是已经选择了啊,哈哈。那么既然Z轴有值了我们就不能已平面视角来看了,等我们把2D锁定给关闭了转换个视角看看。 这样看是不是就顺眼多了呢?哈哈,至此我们的讲解总算结束了,大家可以洗洗了,哈哈。。。等下!谁说可以睡了?我可没说哦,难道大家对我说的都这么信吗?有句古话说的好啊,尽信书则不如无书。。[C#] 纯文本查看 复制代码?
这样看是不是就顺眼多了呢?哈哈,至此我们的讲解总算结束了,大家可以洗洗了,哈哈。。。等下!谁说可以睡了?我可没说哦,难道大家对我说的都这么信吗?有句古话说的好啊,尽信书则不如无书。。[C#] 纯文本查看 复制代码?| centor = Vector3.MoveTowards(centor, centorProject, 1f);// 沿着投影方向移动移动距离(距离越大弧度越小) | 
| 0102030405060708091011121314151617181920212223242526272829 | [/size][/font][/align][align=left][font=宋体][size=14.0pt]   privateVector3 mStart =newVector3(2, 4, -1);    privateVector3 mEnd = newVector3(-1, 1, 2);    // Update is called once per frame    privatevoidUpdate()    {        Debug.DrawLine(newVector3(-100, 0, 0), newVector3(100, 0, 0), Color.green);        Debug.DrawLine(newVector3(0, -100, 0), newVector3(0, 100, 0), Color.green);                Debug.DrawLine(Vector3.zero, mStart, Color.red);        Debug.DrawLine(Vector3.zero, mEnd, Color.red);            Debug.DrawLine(mStart, mEnd, Color.red);        Vector3 centor = (mStart + mEnd) * 0.5f;        Vector3 centorProject = Vector3.Project(centor, mStart - mEnd);// 中心点在两点之间的投影        centor = Vector3.MoveTowards(centor, centorProject, 1f);       // 沿着投影方向移动移动距离(距离越大弧度越小)        Debug.DrawLine(centor, mStart, Color.blue);        Debug.DrawLine(centor, mEnd, Color.blue);        Debug.Log(string.Format("{0} : {1}", Vector3.Distance(centor, mStart), Vector3.Distance(centor, mEnd)));        for(inti = 1; i < 10; ++i)        {            Vector3 drawVec = Vector3.Slerp(mEnd - centor, mStart - centor, 0.1f * i);            drawVec += centor;            Debug.DrawLine(centor, drawVec, 5 == i ? Color.blue : Color.yellow);         }    } | 
新闻热点
疑难解答