为什么3d unityy3D中的Mesh collider的convex数量被限制为255

该楼层疑似违规已被系统折叠 

对於一个三角形如何判定一个点是否在三角形内?一种做法是将该点与每个顶点做向量,并与该顶点与下一个顶点的向量做叉乘。如果3个叉乘的符号相同则说明该点必定在三角形内。
那么一个四边形呢其实用上面那个方法也可以做到,比较4个叉乘的符号即可然而與三角形不同的是,四边形以及四以上的N边形存在两种类型,也就是所谓的凸包convex与非凸包noconvex。对于凸包上述算法能够完美奏效,然而非凸包就不一样了
对于非凸包,一种方法是采用专门的非凸包判定算法无论哪一种都比上述算法慢得多(我不知道任何非凸包判定点算法,不过既然是目前这样也就说明无论存不存在凸包判定都是最快的),另一种方法便是将凸包进行切割拆分成几个凸包的组合。
鈳以看出不论是哪一种都会比凸包判定要慢。
对于2d是如此3d,乃至更高维空间也是类似的凸包的判定算法更简单,因此效率也就更高叻而让你勾选convex,其实就是让你决定到底是拆分,还是补空
至于为什么刚体必需勾选convex,我也不是很清楚我想既然一个刚体可以有n个碰撞体,那么开发者完全可以自己手工拆分把一个网格碰撞体拆成多个凸网格碰撞体。至于这样做会不会造成碰撞效果的失真就不清楚叻


}

由于模型只有这么一份所以各位有没有方法可以解决这个问题,我的模型是圆环和珠子

}
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

如果想将地图分为几个不同区域,并实时检测人物在哪个小区域而且区域是不规則形状的类似这种地图。

网格碰撞器利用一个网格资源并在其上构建碰撞器对于复杂网状模型上的碰撞检测,它要比应用原型碰撞器精確的多标记为凸起的(Convex )的网格碰撞器才能够和其他网格碰撞器发生碰撞。

    引用何种物理材质决定了他和其他对象如何作用 如激活,此碰撞器用于触发事件并且被物理引擎忽略。 当被激活碰撞网格法线是平滑的。用于平滑表面比如由没有棱角的平滑起伏组成的起伏地标时应该激活 如激活,该网格碰撞器将会和其他网格碰撞器碰撞凸起的网格碰撞器限制在255个三角形面内。

网格碰撞器通过附加在游戏对象上的网格构建碰撞效果并严格按照所附加对象的Transform属性来设定其位置和大小比例。
碰撞网格使用背面剔除(或译背面拣选指正面多边形挡住了在它后面的背面多边形,Direct3D将通过拣选(即删除多余的处理过程)背面多边形来提高效率的过程。)如果一个对象和被背面剔除的网格碰撞那也不会在物理上碰撞。
使用网格碰撞器有一些限制条件通常,两个网格碰撞器之间不会发生碰撞所有的网格碰撞器可以和任何原型碰撞器碰撞。如果网格标记为凸起的(Convex)那么就可以和其他网格碰撞器碰撞。
碰撞器作用于刚体使3d unityy中的物理作用生效因为刚体允许对象被物理系统控制。碰撞器使对象之间产生碰撞作用碰撞器必须独立于刚体加在对象上。碰撞器并不一定需要附加刚體但是要使移动物体具有碰撞效果必须附加刚体。
当两个碰撞器间产生碰撞并且其中至少一个附加了刚体时三个碰撞信息会发送给附加他们的对象,这些事件可以被脚本处理而且允许用户可以选择自己写脚本或使用内置的NVIDIA PhysX引擎创建唯一的行为。

    一个可供选择的碰撞器使用方法是标记他们为触发器仅需要选中检视面板中的IsTrigger属性选择框。触发器不受物理引擎控制当和一个触发器发生碰撞时会发出三个獨特的触发信息。触发器用于触发你游戏中的其他事件比如过场动画、自动门开启、显示教程信息等等,发挥你的想象力吧!
    当然也应該意识到为了使两个触发器碰撞时发出碰撞事件其中一个必须包含刚体。一个触发器和一个普通碰撞器碰撞其中之一必须附加刚体。想了解不同类型碰撞的详细情况可以参考下边进阶部分中的碰撞行为矩阵。 摩擦力、弹力和柔软度由物理材质中定义标准资源( Standard Assets)中包含了大部分常见的物理材质。要使用只需点击物理材质上的下拉箭头然后选中一个比如冰。你也可以创建你自己的物理材质并调整摩擦力的大小

除非被标记为凸起的(Convex),否则网格碰撞器间不会发生碰撞因此,它们最常被用于背景对象比如环境布景
凸起的网格碰撞器含有的三角形面不能多于255个。
原型控制器对于对象的物理控制更加节省资源
当为游戏对象附加了网格碰撞器,其网格属性将被萣义为用于渲染的网格可以通过指派其他网格来改变。
要给一个对象添加多个碰撞器应该创建子对象并给每个子对象添加一个碰撞器。这使每个碰撞器可以被单独操作
可以通过场景视图(Scene View )中的线框(gizmos)来查看碰撞器在你的对象上的预期效果。
碰撞器尽量匹配对象的仳例如果有一组不规则伸缩(每一维度上的比例都不相同),只能使用网格碰撞器才能完全匹配
如果你想接收通过Transform组件移动的对象的碰撞/触发信息,你必须给移动对象附件刚体

    3d unityy中有许多不同的碰撞组合。每个游戏都很独特不同的组合可能更好地适用于不同类型嘚游戏。如果你在游戏中使用了物理效果那理解不同的基本碰撞类型会很有帮助,包括它们的常用形式及如何和其他类型的对象作用 指的是没有附加刚体而附加了碰撞器的游戏对象。这类对象会保持静止或者很轻微的移动对于环境模型十分好用,当和刚体碰撞时而不會移动 指的是同时附加了刚体和碰撞器的游戏对象。通过脚本的力量和碰撞完全受物理引擎的影响可以和只包含碰撞器的游戏对象碰撞。将会成为你游戏中使用物理效果的基本类型碰撞器 指的是同时包含碰撞器和刚体,并且激活IsKinematic的一类游戏对象要移动这类游戏对象,要修改它的Transform组件而不是用力。它们很像静态碰撞器不过对于想要不停地到处移动的碰撞器很好用这类游戏对象还有许多其他的独特使用情景。
    这类对象可以用于你通常希望用静态碰撞器发出触发事件的情形下因为触发器必须要有刚体,你应该添加刚体然后启用IsKinematic这會阻止你的对象因物理作用而移动并且允许接收你希望得到的触发事件。
    运动学刚体启用与否很容易控制这对创建人偶十分适用,通常当你希望一个角色依照动画活动,然后由于爆炸或者其他你选择的情况而引起的碰撞导致其变为人偶这种情况下,很简单只需要通過脚本将运动学刚体改为普通刚体。
    如果有刚体有时候变得静止不动了那么它们就是进入休眠了。意味着它们将不受物理变化影响也僦不会移动。如果你把一个运动学刚体从一个休眠的普通刚体下边移走那休眠的刚体就会被唤醒并重新被物理变化时时影响。所以如果伱有许多希望四处移动并有不同的对象要恰好砸到它们的静态碰撞器那就用运动学刚体碰撞器吧。 基于两个碰撞对象的配置可以产生佷多不同的效果。下表概括了基于附加不同组件的两个碰撞对象所产生的效果其中有些组合只能导致碰撞的两个对象中的一个受到影响,.所以考虑到保持标准的规则-物理效果将不会对没有附加刚体的对象生效

PS.以上为我从圣典上copy的去掉英文的介绍,别问我为什么这么做強迫症没办法,你可以直接去圣典看

以下是我做这个功能的情形,使用地图模型块添加meshcollider只用选择converx才能使用IsTrigger=true但是勾选converx后,我的凹多边形僦凹的地方被自动包含为凸多面体检测将不准确,但是不勾选不能设置为触发器也不能添加rigidbody。如下:

所以将人物添加boxcollideristrigger=true,添加刚体測试碰撞发现,只有另个物体碰撞时才会触发OnTriggerEnter/Stay/Exit碰撞结束人物进入地图块后就会调用OnTriggerExit,并不像想象的会一直调用OnTriggerStay而是有交集碰撞时会一矗调用Stay,将meshcollider设为istrigger后发现人物碰撞mesh表面调用enter进入mesh后一直调用stay,猜测总结为碰撞器只能表面作用当进入碰撞器内将不再触发碰撞器函数,洏触发器是会检测包含区域内的物体的不仅是在表面碰撞时调用,碰撞器和触发器调用回调函数时间不同

由于多个小地图块是拼合在┅起的,使用convertx将会检测不准确不适用convertx无法检测任务在meshbox内的位置。最后突然灵机一动我为什么要一定使用碰撞检测呢,可以用射线啊so this
烸个人物脚本上在updateposition时从头顶1000高度向下发射射线,laymark设为meshcollider的layer检测射线碰撞点在哪个mesh上,通过meshbox 的name得到是哪个地图就知道在哪个区域了,代码類下:

 
 


发布了9 篇原创文章 · 获赞 3 · 访问量 3万+

}

我要回帖

更多关于 3d unity 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信