关于Unity中的刚体和碰撞器的相关用法(一)
1.创建一个3D工程
2.构造项目文件目录
3.保存场景为game_scene到文件夹scenes中
4.创建一个Plane平面类型的GameObject节点和一个Sphere球体类型的GameObject节点
5.给Plane贴上图片,Sphere贴上材质,可以设置球的材质的Shader为Mobile/Diffuse
6.运行,发现球在空中静止,因为没有添加受力体,也就是刚体组件Rigidbody,添加后运行,球从空中掉到平面上,前提是两者都已经有Collider碰撞器组件,否则只要一方没有Collider就会穿过彼此。
Rigidbody组件属性
1.Mass(质量): [0, 10],默认为1, [0.1, 10]日常生活的感受;
2.Drag(阻力): 物体移动时的阻力
3.AngularDrag(旋转阻力): 旋转时候的衰减;
4.Use Gravity(使用重力): 是否受重力影响;
5.Is Kinematic(是否受牛顿运动学影响): false,正常的物理计算,true运动只会在代码和动画里面受影响,普通的碰撞等都不会改变它的运动状态;
6.Interpotate: (物体运动插值模式) None(最近计算值) Interpolate(内插值) extrapolate(外插值)
7.Collision Detection:Discrete(离散模式 资源少,静止,低速,普通物体) Continuous(连续检测,高速体积小,子弹)。被使用了Continusous检测撞击的对象(被子弹撞击的物体),使用Continus Dynamic模式;
子弹发射碰撞物体,在两个update之间,时间dt范围之内,使用Discrete,子弹会偶然穿过物体,且显示没有发生碰撞,Continuous会判断初始和穿过之后这段距离之间有没有发生碰撞,有就吧子弹还原到撞到物体表面的状态,子弹不会穿过物体。
Discrete优点运行速度快,性能消耗小,缺点有穿透。
Continuous优点不会穿透,缺点运行速度慢,性能消耗大。
Continus Dynamic搭配Continuous,提升仿真效果。
8.Constraints(约束):哪个坐标轴打钩哪个就不会改变,位置和旋转,都可以设置。
刚体变量
1: 角速度(angularVelocity);
2: 线性速度(velocity);
3: 重心(center of mass)
4: 碰撞检测开关(detectCollisions): 默认为true, 关闭检测碰撞 false;
5: intertiaTensor惯性张量 intertiaTensorRotation 惯性张量旋转;
6: 最大角速度(maxAngularVelocity);
7: 最大穿透速度(maxDepenetrationVelocity)
8: position:刚体的世界坐标,与图像的transform.position尽量保持一致。因为是刚体带动图像在运动,所以刚体先动,然后图像才动,所以两者坐标大致相同。
9: rotation: 刚体在世界坐标的旋转,与图像的transform.rotation也是尽量保持一致。
10: useConeFiction是否使用锥形摩擦,一般false; true一般不使用;
创建一个ball的脚本,挂载在Sphere球体下面。ball脚本的内容:
Rigidbody body;
// Use this for initialization
void Start () {
this.body = this.GetComponent<Rigidbody>();
Debug.Log(this.body.angularVelocity); // 角速度
Debug.Log(this.body.velocity); // 线性速度;
Debug.Log(this.body.centerOfMass); //重心; // 关闭了以后就不会有碰撞,这个球就会穿透这个平面
// this.body.detectCollisions = false; // transform.position 也会有一个坐标大致相等。
Debug.Log(this.body.position); // 刚体所在的世界坐标
Debug.Log(this.body.rotation); // 刚体的旋转
}
刚体常用方法
F *T=冲量变化=MV1-MV0
F:力的大小和方向
T:力的作用时间
当V0为0时,F *T=MV
世界坐标就是Scene视图右上角那个坐标系的坐标,和物体自身的模型坐标系没有关系。
Mesh Colllider网格碰撞器不能直接加刚体组件Rigidbody,会报错。因为整个plane都会往下掉,触发打钩刚体属性中的is Kinematic才没事。
ball脚本里面的补充
Rigidbody body;
void Start () {
this.body = this.GetComponent<Rigidbody>();
// 力的方向,世界坐标方向上的力。
// 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;//持续作用力
// 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世界坐标,保证在刚体内部,世界坐标的力,篮球在空中挑一下转起来,点力
// this.body.AddForceAtPosition(Vector3.up * this.body.mass * 20, new Vector3(-0.4f, 2.99f, 0), ForceMode.Impulse);
// 相对与模型的坐标方向的力;篮球在空中挑一下转起来
// this.body.AddRelativeForce(Vector3.up * this.body.mass * 20, ForceMode.Impulse);
// 力矩
// this.body.AddTorque(Vector3.right * 10);//杠杆,模型绕着世界的X轴旋转
// this.body.AddRelativeTorque(Vector3.right * 10);//模型绕着自身的X轴旋转
}
我觉得力分为
a.瞬间作用力
b.持续作用力
c:点力(空中挑一下篮球的某个点)
d:力矩(绕某个轴旋转)
物理管理器
1:Gravity 重力,设置重力的大小和方向;
2: Default Material:为每个物体给一个默认的物理材质;
3: Bounce Threshold 反弹阈值,低于这个不进行反弹计算;
4: SleepThreshold 休眠阈值能量低于这个阈值休眠 E = (sqrt(v) + sqrt(A)) * 0.5,休眠就是刚体休眠,如果两个物体碰撞到一起,等能量用完了就不会去调用OnCollisionStay函数了
5: Default Contact offset默认接触偏差,低于该值认为刚体已经接触必须>0;
6: Solver Iteration Count关节和连接迭代次数;
7: Raycasts Hit Triggers 射线是否命中触发器, true检测命中, false忽略触发器;
8:Enable Adaptive Force 允许自适应力 修正模拟运动状态的数值偏差;
8: 碰撞矩阵,配置层级间的碰撞关系,哪些层之间会发生碰撞检测,哪些层之间什么都不会发生;
物理形状/碰撞器
is Trigger打钩之后,只进行碰撞检测,不进行物理运算,也就是没有物理效果。
1:Box Collider 盒子碰撞器;
2: Sphere Collider 球体碰撞器
3: Capsule Collider 胶囊碰撞器;
4: Mesh Collider 网格碰撞器;
5: Terrian Collider 地形碰撞器;
6: Wheel Collider车轮碰撞器;
物理材质
是添加在碰撞器的属性里面,create-->Phsic Material,创建好材质后,关联到球的Collider上面,这样球掉下来的时候就会弹起来
1:每种物体的弹力,摩擦力等物理参数可能不一样,unity使用物理材质来描述它们;
2:Dynamic Friction 滑动摩擦
3: Static Firction 静态摩擦
4: Bounciness 表面弹性;
5: Friction Combine 摩擦力的混合方式
6: Bounciness Combine 弹力的混合方式;,Average就是每次弹完就取平均值,慢慢停下来
注意:
Is Kinematic是刚体组件的属性,勾选时物体不会受物理碰撞的影响,没有碰撞效果,但是会调用碰撞函数OnCollisionEnter等。只有两个都设置Is Kinematic的刚体之间会发生穿透现象,只有其中一个Is Kinematic则不会穿透
is trigger是碰撞器组件的属性,勾选时物体不会受物理碰撞的影响,变得透明,但是会调用触发器函数OnTriggerEnter等
关于Unity中的刚体和碰撞器的相关用法(一)的更多相关文章
- 关于Unity中的刚体和碰撞器的相关用法(二)
在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...
- 关于Unity中的Mesh Collider碰撞器
原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件,一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件,主角可以放在平面上. 在导入场景后 ...
- Unity中的定时器与延时器
JavaScript中的定时器与延时器,分别是 setInterval.setTimeout,对应的清理函数是:clearInterval.clearTimeout. 而在Unity中,则分别是:In ...
- 关于Unity中使用刚体制作简单跑酷案例
一.步骤 1.创建一个Canvas 2.对Canvas进行初始化,记得把Game视图的分辨率调成和Canvas里面设置的一样的分辨率960X640 3.创建一个Image的UI节点作为Canvas的子 ...
- Java中unicode增补字符(辅助平面)相关用法简介
转载自 http://blog.csdn.net/gjb724332682/article/details/51324036 前言 Java从1.5版本开始,加入了unicode辅助平面的支持.相关的 ...
- 碰撞器与触发器[Unity]
请看原帖,移步:Unity3d碰撞检测中碰撞器与触发器的区别 要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动.碰撞体是物理组件的一类,它要与刚体一起添加 ...
- [Unity2D]Box Collider 2D盒子碰撞器
盒子碰撞器(BoxCollider2D)是Unity2D中常用的碰撞器,所有为碰撞器,顾名思义,就是用于检测物体之间的碰撞情况的,Unity2D里面除了BoxCollider2D碰撞器之外还集成Box ...
- Unity3D笔记 英保通十 射线碰撞器检测
射线碰撞检测可以用来检测方向和距离: 通过Physics.RayCast光线投射来实现:常用于射击利用发射的射线来判断.还有对战中刀剑交战中.. 一.要涉及到RayCast和RayCastHit 1. ...
- c#索引器的简单用法
abstract class Bird { protected string name; public abstract string Name { get; set; } public abstra ...
随机推荐
- SQL作业
USE [test] GO /****** Object: StoredProcedure [dbo].[wangchuang] Script Date: 2016/8/25 14:09:24 *** ...
- 【Unity】6.4 Transform--移动、旋转和缩放游戏对象
分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 Unity引擎提供了丰富的组件和类库,为游戏开发提供了非常大的便利,熟练掌握和使用这些API,对于游戏开发的效率提高很重 ...
- vue2.x 路由懒加载 优化打包体积
当打包构建应用时,Javascript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了. 结合 Vue 的异步组 ...
- 压力测试工具ab及centos下单独安装方法 nginx和tomcat静态资源的性能测试
Apache安装包中自带的压力测试工具Apache Benchmark(简称ab)简单易用,这里采用ab作为压国测试工具. 独立安装: ab运行需要信赖apr-util包: # yum install ...
- HTML5学习笔记(十五):方法
在一个对象中绑定函数,称为这个对象的方法. 在JavaScript中,对象的定义是这样的: var xiaoming = { name: '小明', birth: 1990 }; 但是,如果我们给xi ...
- nodejs批量处理图片
var gm = require('gm');var imageMagick = gm.subClass({ imageMagick : true });var path = require('pat ...
- (转)CTP: 平昨仓与平今仓,log轻轻告诉你.......
转自:http://blog.csdn.net/wowotuo/article/details/43242663 CTP的相关文档告诉我们,中金所和三大商品交易所中,只有上期所区分平今仓和平昨仓.也就 ...
- 项目日志的管理和应用 log4js-Node.js中的日志管理模块使用与封装
开发过程中,日志记录是必不可少的事情,尤其是生产系统中经常无法调试,因此日志就成了重要的调试信息来源. Node.js,已经有现成的开源日志模块,就是log4js,源码地址:点击打开链接 项目引用方法 ...
- H3C交换机SNMP配置
1.启动/关闭SNMP Agent服务 在系统视图模式下: 启用:snmp-agent 关闭:undo snmp-agent 注:缺省情况下snmp agent是关闭的 2. 使能或禁止SNMP相应版 ...
- MATLAB左除和右除
矩阵的除法包括左除(A\B).右除(A/B)和点除(A./B)三种. 一般情况下,x = A\b是方程组A*x = b的解, 而x = b/A是方程组x*A = b的解, x = A./B表示同型矩阵 ...