关于Unity中的刚体和碰撞器的相关用法(一)
1.創(chuàng)建一個(gè)3D工程
2.構(gòu)造項(xiàng)目文件目錄
3.保存場(chǎng)景為game_scene到文件夾scenes中
4.創(chuàng)建一個(gè)Plane平面類型的GameObject節(jié)點(diǎn)和一個(gè)Sphere球體類型的GameObject節(jié)點(diǎn)
5.給Plane貼上圖片,Sphere貼上材質(zhì),可以設(shè)置球的材質(zhì)的Shader為Mobile/Diffuse
6.運(yùn)行,發(fā)現(xiàn)球在空中靜止,因?yàn)闆](méi)有添加受力體,也就是剛體組件Rigidbody,添加后運(yùn)行,球從空中掉到平面上,前提是兩者都已經(jīng)有Collider碰撞器組件,否則只要一方?jīng)]有Collider就會(huì)穿過(guò)彼此。
?
Rigidbody組件屬性
1.Mass(質(zhì)量): [0, 10],默認(rèn)為1, [0.1, 10]日常生活的感受;
2.Drag(阻力): 物體移動(dòng)時(shí)的阻力
3.AngularDrag(旋轉(zhuǎn)阻力): 旋轉(zhuǎn)時(shí)候的衰減;
4.Use Gravity(使用重力): 是否受重力影響;
5.Is Kinematic(是否受牛頓運(yùn)動(dòng)學(xué)影響): false,正常的物理計(jì)算,true運(yùn)動(dòng)只會(huì)在代碼和動(dòng)畫里面受影響,普通的碰撞等都不會(huì)改變它的運(yùn)動(dòng)狀態(tài);
6.Interpotate: (物體運(yùn)動(dòng)插值模式) None(最近計(jì)算值) Interpolate(內(nèi)插值) extrapolate(外插值)
7.Collision Detection:Discrete(離散模式 資源少,靜止,低速,普通物體) Continuous(連續(xù)檢測(cè),高速體積小,子彈)。被使用了Continusous檢測(cè)撞擊的對(duì)象(被子彈撞擊的物體),使用Continus Dynamic模式;
子彈發(fā)射碰撞物體,在兩個(gè)update之間,時(shí)間dt范圍之內(nèi),使用Discrete,子彈會(huì)偶然穿過(guò)物體,且顯示沒(méi)有發(fā)生碰撞,Continuous會(huì)判斷初始和穿過(guò)之后這段距離之間有沒(méi)有發(fā)生碰撞,有就吧子彈還原到撞到物體表面的狀態(tài),子彈不會(huì)穿過(guò)物體。
Discrete優(yōu)點(diǎn)運(yùn)行速度快,性能消耗小,缺點(diǎn)有穿透。
Continuous優(yōu)點(diǎn)不會(huì)穿透,缺點(diǎn)運(yùn)行速度慢,性能消耗大。
Continus Dynamic搭配Continuous,提升仿真效果。
8.Constraints(約束):哪個(gè)坐標(biāo)軸打鉤哪個(gè)就不會(huì)改變,位置和旋轉(zhuǎn),都可以設(shè)置。
?
剛體變量
1: 角速度(angularVelocity);
2: 線性速度(velocity);
3: 重心(center of mass)
4: 碰撞檢測(cè)開(kāi)關(guān)(detectCollisions): 默認(rèn)為true, 關(guān)閉檢測(cè)碰撞 false;
5: intertiaTensor慣性張量 intertiaTensorRotation 慣性張量旋轉(zhuǎn);
6: 最大角速度(maxAngularVelocity);
7: 最大穿透速度(maxDepenetrationVelocity)
8: position:剛體的世界坐標(biāo),與圖像的transform.position盡量保持一致。因?yàn)槭莿傮w帶動(dòng)圖像在運(yùn)動(dòng),所以剛體先動(dòng),然后圖像才動(dòng),所以兩者坐標(biāo)大致相同。
9: rotation: 剛體在世界坐標(biāo)的旋轉(zhuǎn),與圖像的transform.rotation也是盡量保持一致。
10: useConeFiction是否使用錐形摩擦,一般false; true一般不使用;
?
創(chuàng)建一個(gè)ball的腳本,掛載在Sphere球體下面。ball腳本的內(nèi)容:
Rigidbody body;// Use this for initializationvoid Start () {this.body = this.GetComponent<Rigidbody>();Debug.Log(this.body.angularVelocity); // 角速度Debug.Log(this.body.velocity); // 線性速度;Debug.Log(this.body.centerOfMass); //重心;// 關(guān)閉了以后就不會(huì)有碰撞,這個(gè)球就會(huì)穿透這個(gè)平面// this.body.detectCollisions = false; // transform.position 也會(huì)有一個(gè)坐標(biāo)大致相等。Debug.Log(this.body.position); // 剛體所在的世界坐標(biāo)Debug.Log(this.body.rotation); // 剛體的旋轉(zhuǎn)}
?
剛體常用方法
F *T=沖量變化=MV1-MV0
F:力的大小和方向
T:力的作用時(shí)間
當(dāng)V0為0時(shí),F *T=MV
?
世界坐標(biāo)就是Scene視圖右上角那個(gè)坐標(biāo)系的坐標(biāo),和物體自身的模型坐標(biāo)系沒(méi)有關(guān)系。
Mesh Colllider網(wǎng)格碰撞器不能直接加剛體組件Rigidbody,會(huì)報(bào)錯(cuò)。因?yàn)檎麄€(gè)plane都會(huì)往下掉,觸發(fā)打鉤剛體屬性中的is?Kinematic才沒(méi)事。
ball腳本里面的補(bǔ)充
Rigidbody body; void Start () {this.body = this.GetComponent<Rigidbody>();// 力的方向,世界坐標(biāo)方向上的力。// f * t = m * (v1 - v0) t = 0.02f;//瞬間作用力// this.body.AddForce(Vector3.up * this.body.mass * 10 * 20, ForceMode.Force);// f * t = 1.0f * (v1-v0); t = 0.02f;// this.body.AddForce(Vector3.up * this.body.mass * 20, ForceMode.Acceleration);// f * t = m * (v1-v0); t = 1.0f;//持續(xù)作用力// this.body.AddForce(Vector3.up * this.body.mass * 20, ForceMode.Impulse);// f?1.0=1.0?v(VelocityChange)// this.body.AddForce(Vector3.up * this.body.mass * 20, ForceMode.VelocityChange);// postion世界坐標(biāo),保證在剛體內(nèi)部,世界坐標(biāo)的力,籃球在空中挑一下轉(zhuǎn)起來(lái),點(diǎn)力// this.body.AddForceAtPosition(Vector3.up * this.body.mass * 20, new Vector3(-0.4f, 2.99f, 0), ForceMode.Impulse);// 相對(duì)與模型的坐標(biāo)方向的力;籃球在空中挑一下轉(zhuǎn)起來(lái)// this.body.AddRelativeForce(Vector3.up * this.body.mass * 20, ForceMode.Impulse);// 力矩// this.body.AddTorque(Vector3.right * 10);//杠桿,模型繞著世界的X軸旋轉(zhuǎn)// this.body.AddRelativeTorque(Vector3.right * 10);//模型繞著自身的X軸旋轉(zhuǎn) }我覺(jué)得力分為
a.瞬間作用力
b.持續(xù)作用力
c:點(diǎn)力(空中挑一下籃球的某個(gè)點(diǎn))
d:力矩(繞某個(gè)軸旋轉(zhuǎn))
?
?物理管理器
1:Gravity 重力,設(shè)置重力的大小和方向;
2: Default Material:為每個(gè)物體給一個(gè)默認(rèn)的物理材質(zhì);
3: Bounce Threshold 反彈閾值,低于這個(gè)不進(jìn)行反彈計(jì)算;
4: SleepThreshold 休眠閾值能量低于這個(gè)閾值休眠 E = (sqrt(v) + sqrt(A)) * 0.5,休眠就是剛體休眠,如果兩個(gè)物體碰撞到一起,等能量用完了就不會(huì)去調(diào)用OnCollisionStay函數(shù)了
5: Default Contact offset默認(rèn)接觸偏差,低于該值認(rèn)為剛體已經(jīng)接觸必須>0;
6: Solver Iteration Count關(guān)節(jié)和連接迭代次數(shù);
7: Raycasts Hit Triggers 射線是否命中觸發(fā)器, true檢測(cè)命中, false忽略觸發(fā)器;
8:Enable Adaptive Force 允許自適應(yīng)力 修正模擬運(yùn)動(dòng)狀態(tài)的數(shù)值偏差;
8: 碰撞矩陣,配置層級(jí)間的碰撞關(guān)系,哪些層之間會(huì)發(fā)生碰撞檢測(cè),哪些層之間什么都不會(huì)發(fā)生;
?
物理形狀/碰撞器
is Trigger打鉤之后,只進(jìn)行碰撞檢測(cè),不進(jìn)行物理運(yùn)算,也就是沒(méi)有物理效果。
1:Box Collider 盒子碰撞器;
2: Sphere Collider 球體碰撞器
3: Capsule Collider 膠囊碰撞器;
4: Mesh Collider 網(wǎng)格碰撞器;
5: Terrian Collider 地形碰撞器;
6: Wheel Collider車輪碰撞器;
?
物理材質(zhì)
是添加在碰撞器的屬性里面,create-->Phsic Material,創(chuàng)建好材質(zhì)后,關(guān)聯(lián)到球的Collider上面,這樣球掉下來(lái)的時(shí)候就會(huì)彈起來(lái)
1:每種物體的彈力,摩擦力等物理參數(shù)可能不一樣,unity使用物理材質(zhì)來(lái)描述它們;
2:Dynamic Friction 滑動(dòng)摩擦
3: Static Firction 靜態(tài)摩擦
4: Bounciness 表面彈性;
5: Friction Combine 摩擦力的混合方式
6: Bounciness Combine 彈力的混合方式;,Average就是每次彈完就取平均值,慢慢停下來(lái)
?
?
注意:
Is Kinematic是剛體組件的屬性,勾選時(shí)物體不會(huì)受物理碰撞的影響,沒(méi)有碰撞效果,但是會(huì)調(diào)用碰撞函數(shù)OnCollisionEnter等。只有兩個(gè)都設(shè)置Is Kinematic的剛體之間會(huì)發(fā)生穿透現(xiàn)象,只有其中一個(gè)Is Kinematic則不會(huì)穿透
is trigger是碰撞器組件的屬性,勾選時(shí)物體不會(huì)受物理碰撞的影響,變得透明,但是會(huì)調(diào)用觸發(fā)器函數(shù)OnTriggerEnter等
?
轉(zhuǎn)載于:https://www.cnblogs.com/HangZhe/p/7207571.html
總結(jié)
以上是生活随笔為你收集整理的关于Unity中的刚体和碰撞器的相关用法(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java-类的结构及使用
- 下一篇: Coursera Algorithms