zoukankan      html  css  js  c++  java
  • unity3d物理引擎

    简介

           物理引擎就是在游戏中模拟真实的物理效果,比如,场景中有两个立方体对象,一个在空中,一个在地面上,在空中的立方体开始自由下落,然后与地面上的立方体对象发生碰撞,而物理引擎就是用来模拟真实碰撞的效果。

           如果需要让模型感应物理引擎的效果,需要将刚体组件或角色控制器组件添加至该对象中。

    刚体(Rigidbody)

           刚体是一个非常重要的组件,新创建的物体默认情况下是不具有物理效果的,而刚体组件可以给物体添加一些常见的物理属性,比如物体质量、摩擦力和碰撞参数等,这些属性可用来真实的模拟该物体在3D游戏世界中的一切行为。

         下面我们在unity中创建一个plane(平面),两个cube(立方体),

         蓝色cube默认状态是没有rigidbody,

         给红色cube添加刚体组件,选择要添加刚体的对象,

    通过 “Component—>Physics—>Rigidbody”或者在Inspector窗口,选择“AddComponent—>Physics—>Rigidbody ”

      运行后可以发现,添加了刚体的红色cube感应到了物理效应,会从空中落下。而蓝色cube依然是静止不动的

      可以看到Inspector可以看到Rigidbody包含的属性,简单的看下几个属性的含义,详细的可以看手册

       力是物理学中一个非常重要的元素,其种类有很多,刚体组件可以受力的作用,

    比如给刚体施加一个X轴方向的力,那么该刚体绑定的物体将沿X轴方向向前移动,

    这就好比用力将物体仍出去一样,该物体会以抛物线的形式移动,而不是呆板的做匀速平移 。

    力的方式有两种

         1:普通力,通过设定里的方向和大小,相当于把力施加在物体的重心上。

         2:位置力,需要设定目标点的位置,该物体就朝向这个目标位置施加力。

    AddForce和AddForceAtPosition

    还是拿之前的那个列子做演示。在Hierarchy视图中创建两个Sphere,红色的添加普通力,白色的添加位置力

    红色Cube当作位置力的目标对象。即向该位置发射一个位置力

    1:创建脚本。定义三个变量:

    1     public GameObject whiteSph; //白色球体 施加普通力的对象
    2     public GameObject redSph; //红色球体 施加目标位置力的对象
    3     public GameObject targetPos;//目标对象

    2:GUI绘制两个Button,分别控制“普通力”和“位置力”逻辑代码

     1 void OnGUI()
     2     {
     3         if (GUILayout.Button("普通力"))
     4         {
     5             redSph.rigidbody.AddForce(0,1000,0); //Y轴上力的大小为1000。即向上
     6         }
     7         if (GUILayout.Button("位置力"))
     8         {
     9             //算出whiteSph到targetPos的目标向量
    10             Vector3 c = targetPos.transform.position - whiteSph.transform.position;
    11 
    12             //在c位置施加一个位置力,targetPos将会向这个位置移动
    13             whiteSph.rigidbody.AddForceAtPosition(c, targetPos.transform.position, ForceMode.Impulse);
    14         }
    15     }

    3:脚本挂载到Camera上。给变量拖拽赋值。运行看效果.

      运行游戏,刚体会受物理效应会往下落

      1:当单击普通力。红色球体会往天空弹起,因为它有刚体。最终还是外往下落。

      2:当单击位置力。白色球体会朝着红色方块位置添加力。最终移动到这个位置。

      3:当改变红色cube坐标后。目标位置也跟着移动。

    说了这么多。那AddForce和AddForceAtPosition到底有什么区别呢?我也是跟着学。跟着看手册,

    也许只有等以后知道了它运用在什么逻辑代码中。就自然而然了解了。

    手册上的解释:

    1: 添加一个力到刚体。作为结果刚体将开始移动。

    2:在position位置应用force力。作为结果这个将在这个物体上应用一个力矩和力。

    力矩?是什么。这个我也犯迷糊。不过在手册手看到这样一个函数

    AddTorque:添加一个力矩到刚体。作为结果刚体将绕着torque轴旋转。

    手册上函数有很多。有兴趣的可以自己去测试,等下把手册给大家。我也是网上下载的。

    碰撞与休眠

       刚体与物体之间是存在碰撞的,一旦刚体开始移动,就可以在系统方法中监听刚体的碰撞状态,碰撞分为三种:

       1:进入碰撞

       2:碰撞中

       3:碰撞结束

    我们通过一张图片来了解

    碰撞器

      游戏对象如果需要感应碰撞,那么必须给其添加碰撞器,默认情况下,创建游戏对象时,会自动将碰撞器添加到其中。

      unity一共为对象提供了6种碰撞器

      1:Box Collider         盒子碰撞器

      2:Sphere Collider     球体碰撞器

      3:Capsule Collider    胶囊碰撞器

      4:Mesh Collider        网格碰撞器

      5:Wheel Collider      车轮碰撞器

      6:Terrain Collider     地形碰撞器

    在碰撞器之间可以添加物理材质,用于设定物理碰撞后的效果,它将将开始

    相互反弹,反弹的力度是有物理材质决定的。

    unity标准资源包中提供了一些物理材质的资源,我们可以导入到当前工程中

    导入成功后:

    好。我们可以看出之前的游戏中,球体下落是立即禁止的。

    现在给之前的Plane添加弹性材质,运行游戏

    可以看到刚体在弹性材质的作用下。会反弹

    碰撞检测

     1:两个游戏对象必须有Collider

     2:对于双方都要检测的物体,至少其中一个必须是刚体。

     3:如果刚体是运动的,那么在双方都没有设置碰撞体的 Is Trigger属性的时候,

         双方都可以通过OnCollisionEnter函数检测碰撞

    4:如果至少一个碰撞体Is Trigger被设置,那么双方可以通过OnTriggerEnter检测碰撞

    刚接触unity3d不久。这是记录下今天学习的知识,有什么不对的地方请多多指教!!
     
    unity手册下载
    作者: niboy
    出处: http://niboy.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,共同学习、共同进步、但不能乱搞!未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    快速搭建Android 开发环境-使用ADT Bundle
    js window.print ()只打印网页图片
    数据范式的理解与解析技巧
    C#/.Net文件打包下载
    动态加载echarts数据,防止动态加载后数据叠加
    忙忙碌碌程序媛的工作小知识
    动态数据库名称的时候,使用sp_executesql
    C#的NPOI根据模板导出动态EXCEL图表,
    Android 安卓实现页面相互跳转并相互传递参数
    C#编码规范
  • 原文地址:https://www.cnblogs.com/niboy/p/4215638.html
Copyright © 2011-2022 走看看