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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

unity画线之模拟小球抛物线运动轨迹

發布時間:2023/12/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity画线之模拟小球抛物线运动轨迹 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

模擬小球的拋物線運動,如圖所示:

這里有點像打臺球游戲,模擬在發射之前模擬其軌跡。
劃線用的是LineRenderer,不清楚的童鞋可以自行查閱咯。其實也很簡單就是掛個LineRenderer腳本,設置它的坐標點就行了,關鍵是這坐標點如何計算的問題了。
高中物理知識,科普一波 首先位移公式,S = V0t+1/2at^2。此次位移的分解,物體在Y軸方向做加速度為重力加速度g的加速運動,在X軸方向勻速運動。則物體在X軸的位移為:Sx=Vxt ,Y軸位移Sy = Vyt+1/2gt^2。
知道公式之后,我們就可以按時間點計算物體的位移了,而unity中都是用坐標表示那么這種公式轉換為代碼的邏輯就更加簡單了:

int posCount = 50; List<Vector3> posList = new List<Vector3>(); for (int i = 1; i < posCount ; i++){float x = Vec0.x * deltaTime*i;float y = 1f / 2f * Physics.gravity.y * Mathf.Pow(deltaTime, 2) + Vec0.y * deltaTime*i;posList.Add(oldPos + new Vector2(x, y));}

這樣就計算了出來了50個點,將這50個點全部賦值給LineRenderer就基本模擬完成了。

public void SetPoint(List<Vector2> posList){lineRenderer.positionCount = posList.Count;for (int i = 0; i < posList.Count; i++){lineRenderer.SetPosition(i, posList[i]);}}

為什么要說基本完成呢,這種模擬只是模擬球的最開始的軌跡,在游戲中球會發生碰撞,碰撞之后會反彈,那么這種反彈的軌跡如何實現呢?如圖:

首先要知道球在什么時候發生碰撞,碰撞的面法向量是啥?如果知道面的法向量,入射角那么就可以求出線的反射角了。如何知道在什么時候發生碰撞呢?
這里我用的方法是計算每一段時間球的位移,將這一段時間的位移看作是直線,然后利用unity提供的射線來檢測是否碰撞,這種方法由于每一段是直線所以檢測出來碰撞值也是近似值,當然也沒有考慮球碰撞時的摩擦力對球的影響,總之算是一個粗略的解決方法,如果大家有什么更好的方法,希望評論告知,在下感激不盡,首先拋磚迎玉,實現的具體代碼如下:

public List<Vector2> CalculateTrajectory(Vector2 startVel){List<Vector2> posList = new List<Vector2>();Vector2 curPos = Vector2.zero;Vector2 changePos = Vector2.zero;float detlaTime =0.01f;Vector2 vel0 = startVel;Vector2 nextPos = Vector2.zero;int timeCount = 0;Vector2 direction = startVel.normalized; //速度的實時方向for (int i = 0; i < 100; i++){//總的時間float time = detlaTime * timeCount;float x = vel0.x * time;float y = 1f / 2f * Physics.gravity.y * Mathf.Pow(time, 2) + vel0.y * time;nextPos = changePos + new Vector2(x, y);// Ray ray = new Ray(curPos + (Vector2)OriginalPos, curSpeedVec);direction = new Vector2(vel0.x, Physics.gravity.y * time + vel0.y).normalized;RaycastHit hit;if (Physics.SphereCast(curPos + (Vector2)OriginalPos, ballCollider.radius, direction, out hit, Vector2.Distance(curPos, nextPos), ~LayerMask.GetMask("Ball"))){Vector2 N = hit.normal;changePos = nextPos;// hit.point - OriginalPos + hit.normal * ballCollider.radius;vel0 = new Vector2(vel0.x, Physics.gravity.y * time + vel0.y);vel0 = vel0 - 2 * (Vector2.Dot(vel0, N)) * N;//改變初始度timeCount = 0;}timeCount++;posList.Add(curPos + (Vector2)OriginalPos);curPos = nextPos;}return posList;}

總結

以上是生活随笔為你收集整理的unity画线之模拟小球抛物线运动轨迹的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。