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:创建脚本。定义三个变量:
public GameObject whiteSph; //白色球体 施加普通力的对象
public GameObject redSph; //红色球体 施加目标位置力的对象
public GameObject targetPos;//目标对象
2:GUI绘制两个Button,分别控制“普通力”和“位置力”逻辑代码
void OnGUI()
{
if (GUILayout.Button("普通力"))
{
redSph.rigidbody.AddForce(,,); //Y轴上力的大小为1000。即向上
}
if (GUILayout.Button("位置力"))
{
//算出whiteSph到targetPos的目标向量
Vector3 c = targetPos.transform.position - whiteSph.transform.position; //在c位置施加一个位置力,targetPos将会向这个位置移动
whiteSph.rigidbody.AddForceAtPosition(c, targetPos.transform.position, ForceMode.Impulse);
}
}
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-物理引擎的更多相关文章
- Unity3D游戏开发初探—3.初步了解U3D物理引擎
一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:“如果说我看得比较远的话,那是因为我站在巨人的肩膀 ...
- Unity3D实践系列09, 物理引擎与碰撞检测
在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is T ...
- [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)
通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...
- [原]Unity3D深入浅出 - 物理引擎之刚体部件(Rigidbody)
在虚拟世界中,任何物体都是没有活力的,要想变的真实,Rigidbody是必不可少的组件,下面介绍Rigidbody的各个属性: Mass:质量 Drag:阻力,对象在运动时遇到的空气阻力,0表示没有空 ...
- Unity3D笔记三 物理引擎
一.物理引擎 1.物理引擎就是模拟真实世界中物体碰撞.跌落等反应,通过Ballance.愤怒的小鸟来理解什么是物理引擎.Unity的物理引擎使用的是NviDIA的PhysX.2.选中一个游戏对象,主菜 ...
- Unity3d 物理 Rigidbody预防穿插
Unity3d 物理 Rigidbody预防穿插 @广州小龙 Unity的物理引擎采用的是Physx引擎,里面的组件是Rigidbody!这个可以模拟物理效果! Rigidbody,这个是可以进行穿插 ...
- [转载]Unity3D游戏引擎最详尽基础教程
原文地址:Unity3D游戏引擎最详尽基础教程作者:ShangShang 我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGor ...
- 003-unity3d 物理引擎简介以及示例
一.概述 物理引擎就是模拟真实世界中物体碰撞.跌落等反应的引擎,通过ballence.愤怒的小鸟等理解.Unity3D的物理引擎使用的是Nvidia的PhysX. 物理引擎是一个计算机程序模拟牛顿力学 ...
- Verlet-js JavaScript 物理引擎
subprotocol最近在Github上开源了verlet-js.地址为https://github.com/subprotocol/verlet-js.verlet-js是一个集成Verlet的物 ...
- 制作简单的2D物理引擎(一)——动力学基础
一切的基础 点 在二维平面中,点$P$就是坐标$(x,y)$,点集就是一系列坐标的集合$\{P_1,P_2,...,P_n\}$,不过这个集合是有序的(顺时针). 向量 加减运算 $$\vec{P}\ ...
随机推荐
- Archive of all Android Studio releases / Eclipse 版本大全 / OpenJDK 各版本
一 Android Studio 版本大全 https://developer.android.com/studio/archive.html Download Archives This is an ...
- 题目1461:Tempter of the bone(深度优先遍历DFS)
题目链接:http://ac.jobdu.com/problem.php?pid=1461 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- sql中的group by 和 having 用法解析
转载博客:http://www.cnblogs.com/wang-123/archive/2012/01/05/2312676.html --sql中的group by 用法解析:-- Group B ...
- XmlSerializer的GenerateTempAssembly性能问题例外
XmlSerializer的两个构造函数不会出现每次构造都创建TempAssembly的性能问题,其内部做了缓存. public XmlSerializer(Type type) public Xml ...
- pycharm 里面引用pymysql
import pymysql db =pymysql.connect(host ='192.168.1.131',port=3306,user='jack',password ='jack',db = ...
- gcc6.3的安装
author:headsen chen date: 2018-10-12 15:11:35 1,环境:centos7.3 ,64位,内核 3.10 2,安装过程 #!/bin/bash yum i ...
- javaweb分页的后端实现
先上demo图 servlet实现部分: package servlet; import java.io.IOException; import java.util.List; import java ...
- js 字符中 带 函数 再传对象参数
不替换 ( .replace(/\"/g, "\\\"") )则会有错误: Uncaught SyntaxError: missing ) after argu ...
- hdu5266 pog loves szh III 【LCA】【倍增】
Pog and Szh are playing games. Firstly Pog draw a tree on the paper. Here we define 1 as the root of ...
- POJ - 1191 棋盘分割 记忆递归 搜索dp+数学
http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...