日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

向左还是向右?Unity中俯视视角下人物智能转向的控制方法

發(fā)布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 向左还是向右?Unity中俯视视角下人物智能转向的控制方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

再利用動畫控制人物移動的過程中,實現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。