zoukankan      html  css  js  c++  java
  • Unity学习笔记2:物理引擎和碰撞

    本小节主要是Unity物理引擎,刚体碰撞方面的散记。

    Character Controller的一些特性:
    本身不受physics影响,需要接受外力作用时,使用onCharacterColliderHit().
    Skin width:最好设置为radius的10%,防止角色经常卡住。
    step offset:对于2meter高的Character最好设为0.1到0.4
    min move distance设为0即可。

    Rigidbody的属性设置:
    Is Kinematic:打开后物体不受物理引擎影响,只受transform的控制。比如制作一个上升的平台,本身是rigidbody,且不受物理引擎影响,打开Is Kinematic.
    Interpolate:使运动更光滑。
    Freeze Rotation:使旋转不受碰撞或由script里定义施加的外力影响。只受tranform控制。

    对rigidbody使用力的script方法:AddForce(),AddTorque().当使用physics时不要直接修改transform.

    collision detection:高速运动的碰撞体应设为continuous,防止出现上一帧在其他碰撞物体的这边,下一帧已经穿过碰撞物体到达另一边的情形。默认为discrete.只有box,sphere和capsule的collider才能设置为continuous.

    对于rigidbody,size是个比mass更重要的属性,所以在建模的时候强烈建议总是参考实际标准大小(unity中单位长度是米)。实时instantiate一个物体并修改它的大小,会影响其物理属性,因而会降低游戏性能。

    两个rigidbody自由下落的速度不受mass影响,而是用drag(空气阻力)这个参数来控制。drag值越大,看起来感觉物体重量越轻(典型的0.001-金属块,10-羽毛)。

    对rigidbody使用constant force组件来设置一个constant force,这个力可以是force或torque。
    对物体施加constant force时,设置一个drag值可让物体加速到一个特定的最大速度以后不再加速。drag值越大这个速度越小。

    某带有rigidbody的collider碰撞时会发送三个消息给该collider的对象,分别是Collider.OnCollisionEnter,Collider.OnCollisionExit和Collider.OnCollisionStay,这些事件可以在script里选择利用NVIDIA PhysX engine进行特别处理。

    打开collider的Is trigger选项,碰撞就不受到物理引擎影响,而是通过发送三个消息变成某个事件的trigger。(同样的,发生碰撞的两个collider中至少有一个必须是rigidbody)这三个消息函数分别是:Collider.OnTriggerEnter,Collider.OnTriggerExit和Collider.OnTriggerStay.引发的事件可以是切换场景,开门,播放教程等等,自由发挥你的想象力。

    总结下来:三种collider:
    1.static collider: 带有collider却没有rigidbody的对象,最好用于静止物体如环境地理。
    2.rigidbody collider:带有rigidbody的collider对象,能够根据物理引擎很好的响应外力和碰撞作用。
    3.kinematic rigidbody collider:带有rigidbody的collider对象,开启Is kinematic之后,等效于可以频繁使用insform来移动(而非rigidbody collider利用外力或碰撞的物理效应)的static collider,用于需要rigidbody但不希望响应物理效果的对象。另外就是可以给其设置Is trigger,作为某些事件的触发器,但Is trigger的设置对象必须是rigidbody,但你又不希望其受物理定律约束的情形。

    注:kinematic还常用来创造ragdoll.由于kinematic可以方便的开关,通常情况下开启kinematic方便角色移动等,但遇到碰撞、爆炸冲击等情况,可以在脚本里添加代码使其关闭kinematic变为普通的rigidbody接受物理作用。

    Collision Action Matirx(各种碰撞属性对象碰撞的消息发送标准):


    各种碰撞属性对象的碰撞消息发送标准

    不难看出其中规律。
    另外Unity3.X以后支持Layer-based Collision Detection,这个在后面script的学习里会详细介绍。
    两个mesh collider不能互相碰撞除非都设为convex。mesh collider设置为convex有个限制,这个mesh必须少于255个三角形。
    Physics Material:设置物体的弹性,摩擦系数,软硬程度的组件。
    Hinge Joint:关节组件。用于门的轴或者链条等。
    Spring Jonit:弹簧组件。实时创建和调整spring的方法——创建一个空的game object作为spring绑定的connected body对象,在脚本里控制这个空的game object从而有效控制spring.
  • 相关阅读:
    阿里terway源码分析
    golang timeoutHandler解析及kubernetes中的变种
    第四章 控制和循环
    关于 自媒体的声明
    java用正则表达式获取url的域名
    javaweb三大核心基础技术
    NumPy之计算两个矩阵的成对平方欧氏距离
    C/C++之计算两个整型的平均值
    C/C++代码优化之整型除以2的指数并四舍五入
    SSE系列内置函数中的shuffle函数
  • 原文地址:https://www.cnblogs.com/definitelymaybe/p/3617784.html
Copyright © 2011-2022 走看看