从任何2D多边形生成3D棱柱

3
我正在Unity中创建一个2D精灵游戏,它是一个3D游戏开发环境。 我已将所有对象的平移限制为XY平面,旋转限制为Z轴。
我的问题是用于检测对象之间碰撞的网格仍必须是3D的。我需要检测玩家对象(胶囊碰撞器)和精灵(其碰撞体积由多边形棱柱定义)之间的碰撞。
我目前正在编写关卡编辑器,并且需要让用户为任何给定的图块定义碰撞区域。在下面的图像中,用户按顺序单击点P1、P2、P3、P4。
显然,这些点连接起来形成了一个四边形。这是我想要的碰撞区域,但是我必须将其转换为3D网格。基本上,我需要生成多边形的挤出,然后分配顶点绕组和三角形等。顶点位置不难解决,因为它只是沿着z轴向下的多边形的平移。
我在为顶点分配绕组顺序方面遇到了麻烦,特别是因为网格必须仅由三角形组成。
显然,我所描绘的结构并不重要,多边形可以是任何2D形状,并且将始终需要形成棱柱。 有人知道任何方法吗?
非常感谢大家的时间。

谷歌搜索“绕组顺序”或“绕组顺序算法”会得到一些有趣的结果。 - Tony The Lion
2个回答

2

创建挤出墙:

对于多边形中的每个顶点a(具有坐标ax,ay): - 将下一个顶点称为“b”(具有坐标bx,by) - 创建与从“a”到“b”的线相对应的挤出矩形: - 矩形具有顶点(ax,ay,z0),(ax,ay,z1),(bx,by,z0),(bx,by,z1) - 可以从两个三角形创建此矩形: - (ax,ay,z0),(ax,ay,z1),(bx,by,z0)和(ax,ay,z1),(bx,by,z0),(bx,by,z1

如果您想创建三角形带,那么它甚至更简单。对于每个顶点a,只需添加(ax,ay,z0)和(ax,ay,z1)。无论您首先处理哪个顶点,在循环遍历所有其他顶点后,还需要再次处理该顶点。

创建端盖:

这一步骤可能对于碰撞目的来说是不必要的。但是,有一个简单的技巧在这里:http://www.siggraph.org/education/materials/HyperGraph/scanline/outprims/polygon1.htm 每个生成的三角形都应在深度z0和z1处添加。


1

一个简单的算法是这样的:

extrudedNormal = faceNormal.multiplyScale(sizeOfExtrusion);//multiply the face normal by the extrusion amt. = move along normal
for each(vertex in face){
   vPrime = vertex.clone();//copy the position of each vertex to a new object to be modified later
   vPrime.addSelf(extrudedNormal);//add translation in the direction of the normal, with the amt. used in the 
 }

所以这个想法很基本:

  • 克隆面的法线并将其向相同方向移动,移动量为您要挤出的量
  • 克隆面的顶点并使用移动(挤出)的法线位置移动它们

有关更完整、功能丰富的示例,请参阅Procedural Modeling Unity samples。它们还包括一个不错的网格挤出示例(请参见ExtrudedMeshTrail.js,它使用MeshExtrusion.cs)。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接