Unity3D中使用mesh collider和box collider的区别


踩坑过程记录。
设备是HTC的VIVE 和 Unity 5.x
CPU: Intel Xeon Silver 4116 * 2
GPU: NVIDIA Quadro P6000
RAM: 64GB

这个问题是在解决项目卡顿问题的同时出现的:

最近在用U3D做一个VR项目,需求是要给网格加碰撞体以实现获取手柄射线与网格碰撞的具体坐标,利用坐标去计算后面所需要的数据,并且看起来只有加碰撞体这一条路可以走。

这个project实际上是在前期已经做好了AssetsBundle,通过和用户的交互,来动态加载网格的这样一个过程。一开始我在想给所有的mesh手动加碰撞体,直接框起来加collider,结果证明超级卡,直接卡着不动了。


在制作Bundle时加上Mesh Collider

开始决定在批量制作制作Prefab的时候加上碰撞体,然后再制作bundle。在代码上加了两句 X.AddComponent<MeshCollider();
X.GetComponent<MeshCollider().mesh = MESHNAME;
MESHNAME是对应的网格名称,对应相应的网格。做完bundle,并且替换完开始测试。结果实在是太夸张了,原来运行的时候加载网格一帧只要0.18秒左右,加完mesh collider后用Unity的profiler工具监测每一帧发现在加载的时候加载一帧需要2s…结果如下图。

可以看到每一帧渲染需要2s,不管是CPU GPU 还是Memory都直线飙升,观察Overview可以看到主要占用资源的是唤醒下一步的协程,一项项展开后发现是一个名叫 Mesh.Bake PhysX CollisionData 的进程占用了98.7%的资源。 Google后知道这个其实就是网格碰撞器渲染的进程,建议将Play Setting中的Prebake Collision Meshes勾上,从名字可以看出来这个选项的功能就是提前烘焙网格碰撞器。事实证明这也没有什么卵用。


这个时候我就在想应该怎么解决这个问题,前面和用户进行交互采用的方法是添加一个Canvas幕布加上元碰撞器box collider,在它下面生成一个图形子类或者是用Canvas Group with box collider。我就在想mesh collider和box collider使用起来有什么区别(或者是对于网格资源来讲 应用这两个collider有什么区别),百度了一圈好像没有什么相关结果,于是去Google了一下。发现Mesh Collider和Box Collider差别还真的蛮大的。

在unity中网格是长这个样子的:

如果看不清的话 放大以后是这样的:

可以发现网格其实是由一个个小的三角形拼出来的,这些小三角形就是网格的最基础的组成单位,而每一个mesh里面有大量的小三角形。在渲染Mesh Collider时需要对这些不规则形状的三角形进行大量计算,这些计算十分耗时。相对而言 元碰撞器Box Collider就容易渲染很多。从元碰撞器的参数来看,有size和center,意味着这是一个规则的三维方块,相比起来规则图形的运算就会简单很多,所以就算是一个规则图形的网格碰撞器的渲染也会比原碰撞器慢很多。

所以要慎用 Mesh Collider!!!


在将MeshCollider改成BoxCollider后速度明显快了许多,又回到了之前没加碰撞器的加载速度,但是BoxCollider也不是完美的。将BoxCollider的参数center修改至贴合网格的位置,再将size的x和z改为255 y改为0(Mesh Size定义为255 * 255这样就完美贴合网格了,但是因为将y置成了0,这个BoxCollider就是一个255*255的平面,将视角换成x,y平面时就看不见碰撞器了。这意味着在不同的高度进行射线碰撞检测的时候会造成比较大的误差,并且这个误差是根据视角所在高度而改变的。视角越高,误差越小,同理视角越低,误差将无限增大。 这就是另一个问题了。

最简单解决这个问题的方法就是设置一定的视角限制,以进行误差控制。

其实还有一种方案就是根据不同的网格来动态设置BoxCollider的大小 x,y,z都动态传入参数,选择最适合网格模型的方块来定义BoxCollider,前提是网格模型的高度变化不是特别大。
这个方案也会有不小的误差,但是比前一种方案将会好很多。

两种碰撞器各有利弊:MeshCollider的精度非常高,但是渲染需要消耗巨大资源。
BoxCollider的误差随高度变化而变化,但是资源消耗极少。

所以在选择碰撞器的过程中还是要按照需求来选择最适合的方案。

Unity3D中使用mesh collider和box collider的区别相关推荐

  1. unity3D中使用mesh画圆柱面

    尽管unity3D中直接有模块画圆柱体,但画圆面仍旧需要自己使用mesh来绘制.使用mesh画图一般分为四个步骤. 1.顶点 2.三角形 3.UV 4.负载属性与mesh 自己绘制一个简单的平面代码如 ...

  2. 关于Unity中的Mesh Collider碰撞器

    原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件,一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件,主角可以放在平面上. 在导入场景后 ...

  3. Unity3D中需要的单词

    Unity3D下分8个菜单 分别是File(文件)Edit(编辑)Assets(资源) GameObject(游戏对象)  Component(组件)Terrain(地形) Window(窗口) He ...

  4. Unity3D中需要的英文。

    MR.C编制 这本书 主要对 unity3d的所有菜单与参数进行了翻译 并逐个讲解 来帮助大家初步的认识Unity3D的每个命令的作用 Unity3D下分8个菜单栏(翻译的不一定准) 分别是File( ...

  5. Unity3D中实现物体内部的碰撞检测(流体在容器内飞溅)

    Unity3D中实现物体内部的碰撞检测-流体在容器内飞溅 方法一 方法二 将流体设置在容器内部,想让其填充满,却发现粒子碰到网格就会飞溅或者穿透,想到是物体内部的碰撞检测出了问题. 在Unity3D中 ...

  6. unity3d中布娃娃系统

    转自: http://forum.mirax.com.tw/unity/viewtopic.php?f=133&t=221 关于unity3d中布娃娃系统使用的教程不多,下面是一篇比较详细基础 ...

  7. 【Fracturing Destruction】点破小球——Unity3D中达到条件才触发的物体爆裂、炸裂、碎裂效果

    在<[Fracturing & Destruction]Unity3D的物体爆裂.炸裂.碎裂效果>(点击打开链接)提到了Unity3D的物体爆裂.炸裂.碎裂效果到底是用哪些组件去制 ...

  8. 如何在unity3d中制作灯光效果

    unity3d中如何制作建筑场景里面的灯光? 灯光在建筑场景里面是相当重要的一个环节,我们需要在场景里面模拟出日光投射的效果,在模型导入后,使用Game Object > Create Othe ...

  9. Unity3D中Ragdoll的用法

    一.创建Ragdoll 见unity3d组件文档里的Ragdoll Wizard.由于unity3d中的Ragdoll设置的骨骼点名字与3DMAX里人体骨骼命名有些不一样,下图为Unity3D自带的修 ...

最新文章

  1. Spring Boot集成Swagger导入YApi@无界编程
  2. 1.6的锁优化(适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁)
  3. C++:搭建深度学习环境及实战
  4. python-I/O-文件操作
  5. 把握linux内核设计思想(十二):内存管理之slab分配器
  6. 学计算机的你伤不起啊(转)
  7. 微信小程序 WXBizDataCrypt 解密 报错
  8. 用java二分法计算a的n次幂_用二分法计算a的n次幂算法分析
  9. 庖丁解牛之spring源码系列二 spring bean生命周期介绍
  10. 龙之谷冰龙linux手工服务端,【网游】【龙之谷】v300冰龙巢穴一键服务端+客户端+GM工具+视频教程...
  11. 肝脏、心脏、脾脏、肺脏、肾脏的毒素表现以及食疗排毒
  12. VB.NET合并图片
  13. 9.9的阿里巴巴编码规范考试竟如此简单?搜集试题分享!让我们一起守护开发规范!
  14. 榆熙教育:电商运营必备关键指标公式
  15. 【游戏逆向】游戏玩家技能冷却分析
  16. 基于 OE、Yocto、Arago 构建 TI 板卡的定制文件系统
  17. 命名实体识别(NER)知识汇总
  18. 从头开始学51单片机之4:C51程序设计基础
  19. 笨小孩--投资中的确定性
  20. freebsd ports更新源

热门文章

  1. Linux常用命令 (分门别类)
  2. 这七张操作系统思维导图,带你深入了解操作系统
  3. Linux中cat more less head tail
  4. 表的操作--创建表(简单)
  5. mysql打不开 10061_mysql 10061报错,mysql 10061解决方法,10061问题,mysql学习,mysql启动
  6. 数组reduce的使用方法
  7. 【无标题】闲习业:分享一下副业兼职创业的方法
  8. Python如何快速查每个类的用法和帮助文档
  9. 德国飞往意大利民航客机机翼撕裂 途中乘客发现裂痕
  10. android动画详解二 属性动画原理