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

时间:2011-02-21 14:18:26

标签: math 3d geometry computational-geometry unity3d

我正在Unity中创建一个2D精灵游戏,这是一个3D游戏开发环境。 我已将对象的所有平移约束到XY平面并旋转到Z轴。

我的问题是用于检测对象之间碰撞的网格必须仍然是3D。我需要检测玩家对象(胶囊对撞机)和精灵(其多边形棱镜定义的碰撞体积)之间的碰撞。

我目前正在编写关卡编辑器,我需要让用户为任何给定的tile定义碰撞区域。在下图中,用户按顺序单击点P1,P2,P3,P4。

enter image description here

显然,这些要点联合起来形成一个四边形。这是我想要的碰撞区域,但是我必须将其转换为3D网格。基本上我需要生成多边形的挤出,然后分配顶点绕组和三角形等。顶点位置不是一个问题,因为它只是多边形沿z轴的平移。

enter image description here

我在创建一个分配顶点绕组顺序的算法时遇到了麻烦,特别是因为网格必须只包含三角形。

显然,我所说明的结构并不重要,多边形可以是任何2d形状,并且总是需要形成棱镜。 有谁知道这方面的任何方法?

非常感谢您的时间。

2 个答案:

答案 0 :(得分: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 
 }

所以这个想法很基本:

  • 克隆脸部法线并将其移入 amt的方向相同。您 想要挤出
  • 克隆面顶点并移动它们 使用移动(挤压)法线 位置

有关功能更丰富的示例,请参阅Procedural Modeling Unity samples。它们也包括一个漂亮的Mesh挤出样品(参见使用MeshExtrusion.cs的ExtrudedMeshTrail.js)。

古德勒克!

答案 1 :(得分:1)

创建挤压墙:

对于多边形中的每个顶点a(坐标a x y ): - 调用下一个顶点'b'(坐标b x ,b y ) - 创建对应于从“a”到“b”的直线的拉伸矩形:    - 矩形有顶点( x y ,z 0 ),(a x ,a < sub> y ,z 1 ),(b x ,b y ,z 0 ) ,(b x ,b y ,z 1 )    - 可以从两个三角形创建此矩形:      - (a x y ,z 0 ),(a x ,a y < / sub>,z 1 ),(b x ,b y ,z 0 )和(a < sub> x y ,z 1 ),(b x ,b y , z 0 ),(b x ,b y ,z 1

如果你想创建一个三角形条,它甚至更简单。对于每个顶点a,只需添加(a x y ,z 0 )和(a x ,一个<子>ý和z <子> 1 )。首先处理的顶点也需要在遍历所有其他顶点后再次处理。

创建结束上限:

此步骤可能不需要用于冲突。但是,这里有一个简单的技术:http://www.siggraph.org/education/materials/HyperGraph/scanline/outprims/polygon1.htm 每个结果三角形应在深度z 0 和z 1 处添加。