向左还是向右?Unity中俯视视角下人物智能转向的控制方法
再利用動畫控制人物移動的過程中,實現(xiàn)智能轉(zhuǎn)向(自動判斷向左還是向右轉(zhuǎn))功能的方法有許多種,效果不一而足,代碼量也千差萬別,在這里,博主給出以下四種可以實現(xiàn)轉(zhuǎn)向方法以供參考
1.利用三維向量Vector3.Slerp插值實現(xiàn)轉(zhuǎn)向:
? ? ? ? ? ? ?transform.forward = Vector3.Slerp(transform.forward, TargetDir, Time.deltaTime*speed);
最為簡短易懂的方法,TargetDir是目標方向,speed是轉(zhuǎn)向速度;
————————————————————————————————————————————————————————————————————————————
2.利用四元數(shù)的Quaternion.Lerp插值實現(xiàn)轉(zhuǎn)向:
? ? //先得到一個旋轉(zhuǎn)(四元數(shù)newRotation?),他的方向是目標朝向,轉(zhuǎn)軸是y軸
? ? ? ? ? ? Quaternion newRotation = Quaternion.LookRotation(TargetDir, transform.up);
? ? //在當前朝向的四元數(shù)通過插值的方法平滑變?yōu)槟繕顺虻乃脑獢?shù)
? ? ? ? ? ? transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, Time.deltaTime * rotatespeed);
————————————————————————————————————————————————————————————————————————————
以上兩種方法在實現(xiàn)轉(zhuǎn)向的思想上相似,插值的過程中對于該向左轉(zhuǎn)還是右轉(zhuǎn)會自動判斷最近的轉(zhuǎn)法,所以并不需要做過多的思考,但考慮到在三維中常用的歐拉角坐標存在著萬向節(jié)鎖的問題,所以第二種方法更穩(wěn)妥一些;
下面給出兩種利用數(shù)學(xué)知識判斷方向的并實現(xiàn)轉(zhuǎn)向的方法:
————————————————————————————————————————————————————————————————————————————
3.利用向量叉乘判斷旁向并實現(xiàn)轉(zhuǎn)向:
? ??//求當前朝向與目標朝向的夾角
? ? ? ? ? ? float angle = Vector3.Angle(NowDir, TargetDir);
? ? ? ? ? ? //求當前朝向和目標朝向的叉積
? ? ? ? ? ? Vector3 crossVector = Vector3.Cross(NowDir, TargetDir);
? ? ? ? ? ? //根據(jù)左手定則可以判斷應(yīng)該朝那邊轉(zhuǎn)向
? ? ? ?if (crossVector.y < 0)//結(jié)果小于0說明目標方向在左,應(yīng)該左拐
? ? ? ?{
? ? ? ? ? ?angle = -angle;
? ? ? ? ? ? ? ? } ? ? ??
? ? ? ?else { }//如果叉乘結(jié)果向上,應(yīng)該右拐,angle可以不做處理
? ? ? ?//進行旋轉(zhuǎn),angle大于0默認右轉(zhuǎn),angle小于0則左轉(zhuǎn)
? ? ? ?transform.Rotate(Vector3.up * angle * Time.deltaTime * rotatespeed);
關(guān)于叉乘到底是啥不在這里進行講解,通過百度理解它應(yīng)該不難
————————————————————————————————————————————————————————————————————————————
4.利用目標朝向與左右正交向量的夾角大小判斷左右轉(zhuǎn)向:
?? ?//當前朝向與目標朝向的夾角
? ? ? ? ? ? float angle = Vector3.Angle(NowDir, TargetDir);
? ? ? ? ? ? //當前朝向的左正交向量
? ? ? ? ? ? Vector3 leftOrthogonal = new Vector3(-NowDir.z, 0, NowDir.x);
? ? ? ? ? ? //當前朝向的右正交向量
? ? ? ? ? ? Vector3 rightOrthogonal = new Vector3(NowDir.z, 0, -NowDir.x);
? ? ? ? ? ? //目標朝向與左,右正交向量的夾角
? ? ? ? ? ? float angleleft = Vector3.Angle(TargetDir, leftOrthogonal);
? ? ? ? ? ? float angleright = Vector3.Angle(TargetDir, rightOrthogonal);
? ? ? ? ? ? //如果目標向量與左正交向量夾角更小,則可以判斷此時左轉(zhuǎn)更恰當
? ? ? ? ? ? if (angleleft < angleright)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? angle = -angle;
? ? ? ? ? ? }
? ? ? ? ? ? else { }//如果目標向量與右正交向量夾角更小,angle可以不做處理
? ? ? ? ? ? //進行旋轉(zhuǎn),angle大于0默認右轉(zhuǎn),angle小于0則左轉(zhuǎn)
? ? ? ? ? ? transform.Rotate(Vector3.up *angle* Time.deltaTime * rotatespeed);
給出一張示意圖:
———————————————————————————————————————————————————————————————————————————
后兩種方法重在判斷應(yīng)該左拐還是右拐的邏輯代碼的實現(xiàn)上,雖然篇幅較長,但有助于熟練掌握智能轉(zhuǎn)向的本質(zhì)
? ? ? ? ? ? ? ? 以上為本人ThirtythreeStars(33星)的原創(chuàng)博客,如有錯誤歡迎指正,如需轉(zhuǎn)發(fā)著名出處和作者即可
總結(jié)
以上是生活随笔為你收集整理的向左还是向右?Unity中俯视视角下人物智能转向的控制方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零经验小白的独游历程——俯视角45度游戏
- 下一篇: 机房服务器显示器切换,两台电脑主机,一台