博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity物理引擎浅谈
阅读量:5325 次
发布时间:2019-06-14

本文共 3449 字,大约阅读时间需要 11 分钟。

刚体:

刚体是模拟物理效果的对象。添加了刚体组件的游戏物体,会受重力影响,可以被玩家四处推动,或者直接用脚本添加力给对象来让他四处移动。通常情况下,对同一物体,要么通过刚体操纵,要么通过变换(transform)操纵。但添加刚体组件之后直接通过Transform组件更改物体位置,它和其他对象的碰撞可能出问题(除非Is Kinematic 选项被选中,选中该选项,则没法通过物理模拟来改变物体运动状态)。应避免同时使用两种方式。正确地方法应该是通过施加力或者扭矩来移动刚体。

 

属性:

Mass 质量:物体的质量(任意单位)。建议一个物体的质量不要多于或少于其他单位的100倍。

Drag 阻力:移动时物体受到的空气阻力。0表示没有,极大时物体立即停止运动。
Angular Drag:角阻力 当受扭力旋转时物体受到的空气阻力。0表示没有,极大时物体立即停止旋转。
Use Gravity 是否使用重力
Is Kinematic 是否是运动学:若激活,该物体不再受物理引擎驱动,而只能通过transform来操作。适用于模拟运动的平台或者模拟与铰链关节连接的刚体。
Interpolate 插值
当你发现刚体运动时抖动,可以尝试下面的选项。
None 无 不应用插值。
Interpolate 内插值 基于上一帧的变换来平滑本帧变换。
Extrapolate 外插值 基于下一帧的预估变换来平滑本帧变换。

Collision Detection 碰撞检测模式。用于避免高速物体穿过其他物体,却未触发碰撞。

Discrete 离散

离散碰撞检测。使用离散碰撞检测模式来与场景中其他碰撞器进行碰撞检测。其他物体与它的碰撞检测,也会应用这种模式。适用于普通碰撞(这是默认的模式)。

Continuous 连续
连续碰撞检测。使用离散碰撞检测来检测与动态碰撞器(刚体)的碰撞,使用连续碰撞检测来检测与静态网格(非刚体)的碰撞检测。采用连续动态碰撞检测模式的刚体碰见这类物体也将采用连续碰撞检测模式。而与其他刚体将采用离散碰撞检测模式。这种模式适用于那些采用动态连续碰撞模式的物体碰撞的物体。(这对物理表现有很大的影响,如果你不关心与高速物体的碰撞,那么就让其为默认的离散模式。)
Continuous Dynamic    动态连续
连续动态碰撞检测。使用连续动态碰撞检测模式来检测与连续模式和连续动态模式的物体间的碰撞。也适用于与静态网格(非刚体)的碰撞检测。而与之碰撞的其他模式的物体,采用的是离散动态碰撞检测模式。适用于高速物体。
Constraints 约束 对刚体运动的约束。 限制刚体在某些维度上的移动或|和旋转。

Freeze Position 冻结位置,刚体在世界中沿所选X,Y,Z轴的移动,将无效。
Freeze Rotation 冻结旋转,刚体在世界中沿所选的X,Y,Z轴的旋转,将无效。
velocity:刚体的速度向量,最好不要直接修改它,可以通过它的大小判断撞击的强度。

方法:
Rigibody.AddForce(Vector3),在物体的中心点位置添加一个Vector3的力,使物体朝该Vector3方向运动,运动速度为该向量的模。
Rigibody.AddTorque(Vector3),在物体中心添加一个力矩Vector3,力矩可以使物体旋转,刚体将绕着torque轴旋转。
Rigibody.AddForceAtPosition(Vector3,Vector3),在物体某个位置添加一个力,对于真实的效果,位置应大约在刚体表面的范围。
Rigibody.AddExplosionForce(float forceStrength,Vector3 postion,float range),在某个位置添加一个大小为float,半径为range的爆炸力(向爆炸范围内各个方向的对象施加一个力),用来模拟爆炸效果。爆炸力将随着到刚体的距离线形衰减。。

提示:两个刚体 (Rigidbody) 的相对质量 (Mass) 确定它们在互相碰撞时的反应方式。

使一个刚体 (Rigidbody) 的 质量 (Mass) 大于另一个刚体 (Rigidbody) 不会使其在自由落体过程中下落得更快。请使用阻力 (Drag) 实现此目的。
较小阻力 (Drag)值会使对象看起来较重。较高值会使对象看起来较轻。阻力 (Drag) 的典型值介于 0.001(实心金属块)与 10(羽毛)之间。
如果直接处理对象的变换 (Transform) 组件 (Component) ,但是仍需要物理,请附加刚体 (Rigidbody) 并将其设为运动学 (Kinematic)。
如果通过其变换 (Transform) 组件 (Component) 移动某个游戏对象 (GameObject),但是希望接收碰撞体 (Collider)/触发器 (Trigger) 消息,则必须将刚体 (Rigidbody) 附加到移动的对象。
不能仅仅通过将其“角阻力”(Angular Drag) 设置为无穷大使对象停止旋转。

碰撞体、触发器
发生碰撞条件:两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,没有碰撞体的刚体会彼此相互穿过。发生碰撞时,当两个物体都是碰撞器(Is Trigger都未勾选)时触发OnCollisionXXX,否则触发OnTriggerxxx。

属性:
Is Trigger 是否触发器,勾选后会触发OnTriggerxxx方法,会穿过刚体
Material 材质,后面再讲
Center 中心点,用于调整碰撞盒的位置
Size 大小 在X、Y、Z三维上的碰撞器尺寸。
Convex 凸起的 如激活,该网格碰撞器将会和其他网格碰撞器碰撞。凸起的网格碰撞器限制在255个三角形面内。网格碰撞器之间通常不相互碰撞,但如果一个网格碰撞器被标记为凸起的(Convex ),那么它就可以与其他网格碰撞器碰撞。典型的解决方案是,对移动的对象使用基本碰撞器,而对静态环境对象使用网格碰撞器。
碰撞方法:
OnTriggerEnter( Collider other )当进入触发器
OnTriggerExit( Collider other )当退出触发器
OnTriggerStay( Collider other )当逗留触发器
OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
OnCollisionStay( Collision collisionInfo ) 当逗留碰撞器

Static Colliders 静态碰撞器,包含碰撞器但不含刚体的游戏对象。你不要逐帧移动 一个静态碰撞器,移动静态碰撞器将导致PhysX引擎的内部重置,非常耗费资源,而且会造成性能的极大下降。

 基于层的碰撞检测:Edit->Project Settings->Physics.,打开物理引用界面. 在碰撞矩阵中选择要与其他层相互作用的层,勾选即可.(前提是先设置好层)

物理材质 Physic Material

物理材质用来调节碰撞物体的摩擦力和弹力效果。要创建物理材质从菜单栏选择Assets->Create->Physic Material。然后从项目视图拖拽物理材质到场景的一个碰撞器上。

属性:

Dynamic Friction 动力摩擦力,对象在运动时的摩擦力,取值范围0~1,该值越大,物体受到阻力越大,越快停止运动。
Static Friction 静态摩擦力,对象被放置在表面时的摩擦力,取值范围0~1,该值越大,物体受到阻力越大,开始运动所需力也越大,取值接近0时可模拟冰的效果。
Bouncyness 弹力 0值将不反弹。1值反弹将没有任何能量损失。
Friction Combine Mode 摩擦力结合模式 ,两个碰撞物体的摩擦力是如何结合起来。
Average 使用两个摩擦力的平均值
Min 使用两个摩擦力的最小值
Max 使用两个摩擦力的最大值
Multiply 使用两个摩擦力的乘积

转载于:https://www.cnblogs.com/wang-jin-fu/p/8277581.html

你可能感兴趣的文章
JAVA学习5:用Maven创建第一个web项目(2)servlet演示
查看>>
lua解析赋值类型代码的过程
查看>>
python之路——面向对象进阶
查看>>
Serverless和PaaS的区别
查看>>
Linux中在主机上实现对备机上文件夹及文件的操作的C代码实现
查看>>
hdu 4771 求一点遍历全部给定点的最短路(bfs+dfs)
查看>>
UML 序列图
查看>>
[JS 分析] 有_道_翻_译 MD5 加盐
查看>>
WPF控件深拷贝:序列化/反序列化
查看>>
JAVA_SE基础——32.this关键字调用本类的构造方法
查看>>
winform中datagridview选中行索引获取
查看>>
243. Shortest Word Distance
查看>>
查看被锁的数据[Z]
查看>>
SSM的例子-参考
查看>>
《构建之法》1
查看>>
【菜鸟学Python】案例一:汇率换算
查看>>
文献综述随笔(一)
查看>>
android bindService()
查看>>
JVM 参数设置
查看>>
Volley的基本使用(转)
查看>>