从3d到2d空间(使用三角形)展开纹理坐标的多边形

时间:2011-01-30 20:05:27

标签: c++ model 3d geometry uv-mapping

所以我在Ogre3D中创建了一个模型,这个模型由许多任意旋转和位置的三角形组成。我想像许多建模程序一样“展开”模型,以便将所有三角形映射到2d(x,y),但保持三角形大小。这是用于贴花。必须保持三角形尺寸的原因,以便在施加纹理时不会有任何拉伸。

这是我想要进入的方向,但我无法将其可视化并实现正确的算法:

//Verticies will have a converted bool;

func( triangle x):
     for each of x's vertices:
           map to x,y coordinates if not converted;
           check other triangles for common vertex if so call func(common_tri);

一旦返回,将会有所有三角形的转换版本,以便它们全部展开并放置在纹理上,我遇到麻烦的是映射到x,y空间。我不确定如何在3d空间中获得一个二维空间的三角形,以便保持其所有属性(如从角度视图到表面的纵向视图)。任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:0)

我认为顶点是矢量。

因此,您可以对每个向量进行标准化,然后删除Z坐标,然后再次应用乘法。 即tri = vec1,vec2,vec3, vec1Length = vec1.getLength() newVec1 = vec1.normalize()* vec1Length

因为这将保留矢量的大小,但将它们映射到2d平面。 (或者应该,我不是100%,这在数学上是正确的。)

另一种方法是将三角形本身视为二维平面,然后将矢量从局部空间转换为世界空间的二维平面。

例如,世界起源是(0,0,0)

三角形本身是由三个点定义的平面,您使用一个向量作为X坐标,找到垂直于该向量的向量,并且您已定义y坐标。你也可以定义Z×X交叉乘积Y,这将给你一个距离世界原点的“偏移”,你可以将它们映射到2d平面上,由来自世界原点的X,Y向量重新命名(即(1) ,0)和(0,1))。在很多基本的计算机图形书中应该有数学运算。