0

我有一个用三角形条制成的立方体,我正在尝试找到它的 UV 坐标。

vert = new VBO<Vector3>(new Vector3[] {
            new Vector3(1, 1, 1), 
            new Vector3(0, 1, 1), 
            new Vector3(1, 1, 0),
            new Vector3(0, 1, 0),
            new Vector3(1, 0, 1),
            new Vector3(0, 0, 1),
            new Vector3(0, 0, 0),
            new Vector3(1, 0, 0)
       });
ind = new VBO<uint>(new uint[] { 3, 2, 6, 7, 4, 2, 0, 3, 1, 6, 5, 4, 1, 0 }, BufferTarget.ElementArrayBuffer);

有谁知道他们会是什么?

4

1 回答 1

0

简短回答:您可以为 UV 坐标分配任何值,即使它们重叠(尽管这通常是不可取的)。只要您为每个顶点坐标创建一个 UV 坐标。如果您对重叠没问题,您可以将 8 个 Vector2(s) 声明为您的 UV 坐标,并为它们分配介于 -1 和 1 之间的任何值。

长答案:

这一切都取决于您索引坐标的方式。

UV 坐标告诉您如何将 2D 纹理的 2D 多边形区域映射到 3D 模型几何体。如果您的 UV(s) 和顶点使用相同的索引(这对于您的顶点坐标来说似乎不是最佳的),则每个顶点坐标都应该有一个 UV 坐标。

索引指定您的哪些坐标(三角形的 3 个索引,正方形的 4 个索引)与 2D(纹理)或 3D(模型)多边形相关。定义顶点坐标的方式,除非您以每 3 个顶点定义一个三角形的方式复制每个顶点,否则您必须使用索引来指示 8 个顶点中的哪一个是多边形。例如,索引 { 0, 1, 和 3 } 表示立方体顶部的右上后部(此处为后部,意思是在正 Z 轴上更远)三角形。

为顶点和 UV 使用相同的索引数组时会出现问题。如果您按原样索引您的模型,您的模型面不会有任何问题,但您的一些 UV 面会与其他先前定义的 UV 面重叠。这是因为某些面的顶点将与纹理空间另一侧的其他顶点共享。把你的立方体想象成一个十字架,把它放在一起,你会把底座绕回顶部。如果您的立方体的几何图形仅存在于二维中(就像在您的 UV 坐标中一样),您就不能这样做。

在这种情况下,看似最好的解决方案是使用立方体投影,我还不知道该怎么做。所以,我会推荐我理解的下一个最佳解决方案:

复制任何会导致 UV 面相互缠绕的顶点(十字的底部),以及可能会导致纹理应用于顶点坐标的方式过度扭曲的顶点;头部的 2 个外部顶点“臀部”(?)和十字架的手臂将进一步间隔开,需要纹理变形才能产生所需的输出。

这样做应该会导致您拥有 10 个顶点坐标、10 个 UV 坐标和 36 个索引,其中每 3 个索引定义一个三角形(12 个三角形)。

请记住,有多种方法可以实现您的要求,因此建议进行更深入的研究。

先前描述的坐标和索引对齐的视觉表示。 (固定Z轴)

这表示索引 0 和 1 处的顶点和 UV 坐标与索引 8 和 9 的重复。顶点坐标 8 和 9 与顶点 0 和 1 保持相同的 3D 位置值,而 UV 坐标 8 和 9 位于 Y 轴的下方轴比坐标 6 和 7。

我忘了把它放在示例图像中,但示例中的索引是:

int indices[] = {
    0, 1, 2,
    1, 2, 3,
    2, 3, 4,
    3, 4, 5,
    0, 2, 4,
    0, 4, 6,
    1, 3, 5,
    1, 5, 7,
    4, 5, 6,
    5, 6, 7,
    6, 7, 8,
    7, 8, 9
}

这将为您提供 12 个模型空间三角形和 12 个 UV 三角形,其中每 3 个索引是一个三角形。

编辑:根据@Rabbid76 提供的链接,14 个顶点和 UV 坐标会更好,因为你不会得到失真。我提到的方式只是另一种方式,它有起有落(更多的失真,更少的内存使用)。

于 2020-08-31T01:33:05.823 回答