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

问题描述 投票:0回答:1

所以我在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 空间到 2d 空间中获得一个三角形,以便它保持其所有属性(例如从表面的角度视图到垂直视图)。任何帮助将不胜感激。

c++ model 3d geometry uv-mapping
1个回答
0
投票

我会将顶点视为向量。

因此,您可以标准化每个向量,然后删除 Z 坐标,然后再次应用乘法。

tri = vec1,vec2,vec3, 
vec1Length = vec1.getLength()
newVec1 = vec1.normalize() * vec1Length

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

实现此目的的另一种方法是将三角形本身视为 2d 平面,然后将向量从局部空间转换到世界空间的 2d 平面。

例如,世界原点是 (0,0,0)。

三角形本身是由三个点定义的平面,您使用一个向量作为 X 坐标,找到一个垂直于该向量的向量,然后定义 y 坐标。您还可以定义 Z by X 叉积 Y,这将为您提供距世界原点的“偏移量”,然后您可以将它们映射回由来自世界原点的 X、Y 向量表示的 2d 平面(即( 1,0) 和 (0,1))。许多基础计算机图形书籍中应该有数学知识来做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.