【问题标题】:Unwrapping a polygon from 3d to 2d space (using triangles) for texture coordinates将多边形从 3d 空间展开到 2d 空间(使用三角形)以获得纹理坐标
【发布时间】:2011-06-18 05:26:40
【问题描述】:

所以我在 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 空间,以便保持其所有属性(例如从倾斜视图变为表面的垂直视图)任何帮助将不胜感激。

【问题讨论】:

  • 如果没人能回答你,你可能想检查搅拌机的来源,uv 展开必须在 某处 那里。 svn.blender.org/svnroot/bf-blender/trunk/blender
  • 嗯,我在 XSI 中查看了这些类型的操作,但它们都没有达到我想要做的事情他们会环绕,我希望它只是在材料上保持平坦。不过感谢您的建议。
  • 我不确定您是否假设给定顶点映射到 xy 中的唯一点。给定一个拓扑为球体的模型,以这种方式肯定将其映射到平面是不可能的(例如考虑一个简单的立方体。)相关地,如果你想避免拉伸,即使是立方体的三个边在单个顶点不能都映射到平面上共有的顶点。因此,我认为您要么必须分别处理每个三角形,要么必须进行拉伸,在后一种情况下,至少某些顶点需要多个映射。
  • 一般来说,您无法将 3D 表面映射到 2D 而不会有一些失真。例如,参见en.wikipedia.org/wiki/Map_projection。如果您愿意允许一些失真,那么有数以万计的映射/展开算法。
  • 一个三角形是的,但是你想要一个有很多三角形的模型。你想保持空间关系完整吗(即:保持三角形与其邻居相连)?如果是这样,则没有从 3D 到 2D 的通用映射可以保留所有相关三角形的几何形状。

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


【解决方案1】:

我会将顶点视为向量。

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

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

您可以这样做的另一种方法是将三角形本身视为 2d 平面,然后将向量从该局部空间转换到世界空间的 2d 平面。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多