unity畫球面-Unity實(shí)現(xiàn)球面行走_(dá)第1頁
unity畫球面-Unity實(shí)現(xiàn)球面行走_(dá)第2頁
unity畫球面-Unity實(shí)現(xiàn)球面行走_(dá)第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

unity畫球?_Unity實(shí)現(xiàn)球???0x0.引?在?些游戲內(nèi)的星球體積是很?的,但是??的星球仍然有引?。游戲內(nèi)的物體是可以貼在其表?上的,如同?學(xué)作品《?王?》中所形容的??星球那樣。圖?來源點(diǎn)擊此處對于靜態(tài)物體(如上圖的?樹苗?花等)??,可以將其直接放置在??星球上的固定位置,但是對于動態(tài)可移動的物體呢?如果需要實(shí)現(xiàn)動態(tài)的物體沿著球???呢?注意到上圖的星球并??個規(guī)則的球體,其存在凸起等。那么如何在Unity中實(shí)現(xiàn)這樣的效果?本?介紹如何使?Unity制作?個球???的效果,其最終效果如下圖所?:0x1.思路要實(shí)現(xiàn)這樣的效果,其思路并?是使得需要繞???的物體單純?nèi)ビ?jì)算其繞某?個點(diǎn)旋轉(zhuǎn)。因?yàn)槠浔?并??個規(guī)則球體。那么如何著?解決這個問題?思考?下現(xiàn)實(shí)中物體是如何貼在星球表?的呢?其主要原因便是重?。在Unity的物理引擎中對重?是實(shí)現(xiàn)了的,并且可以通過Rigidbody組件去修改其是否受重?影響。對于重?的整體設(shè)置則可以在ProjectSetting的Physics選項(xiàng)卡中找到。但是Unity的重??向默認(rèn)是朝向世界坐標(biāo)-y軸?向的,僅僅調(diào)節(jié)此處的設(shè)置是并不能滿?需求的。那么從這個地?思考開去,我們就能得到其解決思路:模擬重?。0x2.編碼實(shí)現(xiàn)對于重?模擬,仍然通過Rigidbody組件來實(shí)現(xiàn),?先需要將上?默認(rèn)的useGravity選項(xiàng)取消防?物體受到默認(rèn)重?設(shè)置的影響。然后需要確定?個重?的?向,這?可以通過對場景中某個物體的位置引?來計(jì)算重??向,也就是說,加?場景中存在?個物體作為引?中?,它對其他物體產(chǎn)?重?影響,其好處是可以通過調(diào)整其位置來動態(tài)更改引?中?,也可以通過更換引?來實(shí)現(xiàn)。在這種?式下,重??向?yàn)閺奈矬w的位置到引?中?位置的?向向量。如下圖中黃?箭頭所?:這?的實(shí)現(xiàn)?式?較簡單,其代碼也就?句話://gravityCenter為引?中?Vector3gravityDir=(transform.position-gravityCenter.position).normalized;但是對于其物體如何“站?”的問題,可以分為兩種計(jì)算?式,其不同的計(jì)算?式導(dǎo)致的效果也是不?樣的。其?是可以將物體站?的?向設(shè)置為上圖中重??向的反?向。這樣粗略看上去的效果是沒有問題的,但是對于?些細(xì)節(jié)還是會有錯誤。如果物體站?在?個斜坡上,這樣的物體站?的朝向會出現(xiàn)錯誤,會出現(xiàn)下圖的結(jié)果:這樣是不太符合常理的,雖然現(xiàn)實(shí)?活中是通過摩擦?重?等等各種?的相互作?導(dǎo)致我們站在斜坡上,但是很明顯不應(yīng)該是這樣的站??向。這種?向的編碼實(shí)現(xiàn)也是?常簡單的:transform.rotation=Quaternion.FromToRotation(transform.up,gravityDir)*transform.rotation;另外?種計(jì)算?式則?較符合現(xiàn)實(shí)情況,站??向朝向腳下地?的法線?向,也就是下圖中橙?箭頭?向。要實(shí)現(xiàn)這樣的站??向需要?到碰撞檢測,需要獲取到腳下的?向與碰撞體的碰撞點(diǎn),然后對其進(jìn)?法線?向的計(jì)算,好在Unity中是直接提供了碰撞點(diǎn)的,我們可以在OnCollisionEnter/OnCollisionStay?法中對其進(jìn)?計(jì)算。privatevoidOnCollisionEnter(Collisioncollision){transform.rotation=Quaternion.FromToRotation(transform.up,//這?只取第?個碰撞點(diǎn),如果沒有穿透,?般只有?個碰撞點(diǎn),但是如果是墻?等情況還是要分開處理collision.contacts[0].normal)*transform.rotation;}這樣處理的?式也是可以的,但是在凹凸不平的表???時,可能出現(xiàn)?常?畜的情況。故需要對其碰撞?度做出?定限制,在?度未達(dá)到某?個閾值的時候不需要進(jìn)?法線站?。其編碼可以改成如下形式:privatevoidOnCollisionEnter(Collisioncollision){floatangle=Vector3.Angle(transform.up,collision.contacts[0].normal);if(angle>45f)transform.rotation=Quaternion.FromToRotation(transform.up,collision.contacts[0].normal)*transform.rotation;elsetransform.rotation=Quaternion.FromToRotation(transform.up,(transform.position-gravityCenter.position).normalized)*transform.rotation;}這樣做在?定程度上緩解了?畜問題,但是距離“好?”的程度還差不少,此處僅提供

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論