【问题标题】:algorithm for calculating texture tile coordinates in 3d model generated based on height map基于高度图生成的3d模型中计算纹理瓦片坐标的算法
【发布时间】:2016-02-09 07:20:09
【问题描述】:

我正在将高度图转换为 3d 模型,我有一个小纹理,表示 4 个点(即 2 个三角形)。当点之间的高度差太大时,问题是纹理平铺。我想平铺我的纹理以避免高拉伸,但我在实现一般情况算法时遇到问题。我已经渲染了图片,以代表我的意思:

在这个例子中,我只使用了一半的纹理(1 个三角形),所有的纹理坐标都是我手动设置的。

请帮我找到一般情况下计算纹理坐标的算法

代码:

class procedure GraphicEngine.AddHeightmapQuad(X, Y, Z1, Z2, Z3, Z4: Double);
const
  Length = 1;
var
  Vertices: PVertex;
  v1, v2, v3, v4: TD3DVector;
begin
  OleCheck(Triangles.Lock(TrianglesCount * 3 * SizeOf(TVertex), 2 * 3 * SizeOf(TVertex), Pointer(Vertices), 0));
  Dec(Vertices);

  Vertices[1]:= TVertex.Create(X         , Y         , Z1,  0,  0);
  Vertices[2]:= TVertex.Create(X + Length, Y         , Z2,  1,  0);
  Vertices[3]:= TVertex.Create(X         , Y + Length, Z3,  0,  1);

  Vertices[4]:= TVertex.Create(X + Length, Y         , Z2,  1,  0);
  Vertices[5]:= TVertex.Create(X         , Y + Length, Z3,  0,  1);
  Vertices[6]:= TVertex.Create(X + Length, Y + Length, Z4,  1,  1);

  D3DXVec3Subtract(v1, Vertices[2].vec, Vertices[1].vec);
  D3DXVec3Subtract(v2, Vertices[3].vec, Vertices[1].vec);

  D3DXVec3Subtract(v3, Vertices[4].vec, Vertices[6].vec);
  D3DXVec3Subtract(v4, Vertices[5].vec, Vertices[6].vec);

  Vertices[2].U:= Sqrt(1 + Sqr(v1.z));
  Vertices[3].V:= Sqrt(1 + Sqr(v2.z));

  Vertices[4].U:= Sqrt(1 + Sqr(v4.z));
  Vertices[5].V:= Sqrt(1 + Sqr(v3.z));

  Vertices[6].U:= Sqrt(1 + Sqr(v4.z));
  Vertices[6].V:= Sqrt(1 + Sqr(v3.z));     

  Inc(TrianglesCount, 2);

  OleCheck(Triangles.Unlock);
end;

【问题讨论】:

    标签: algorithm textures procedure heightmap


    【解决方案1】:

    您可以通过计算三角形的实际大小来计算纹理的精确拉伸。更简单的是,您可以简单地计算边缘的长度来调整坐标。将纹理中的一个点固定为 0,0,然后下一个而不是 0, 1 将是 0, sqrt(1 + (h1 - h2)^2) 并且对于网格的另一点也是如此(h1 和 h2 是点的高度)。为避免不匹配,请确保在执行下一个单元格时复制坐标。

    【讨论】:

    • 前两种情况下输出正确,但在第三种情况下不正确:link
    • 你能在更大的网格上试试吗?此设置将确保您仍然匹配相邻单元格上的图块。如果您不关心这一点,您可以将其中一个点更改为 dot(norm(v1), norm(v2)) * sqrt(1 + (h1 - h2)^2), sqrt(1 + (h1 - h2)^2)),其中 v1 和 v2 是从 0,0 点到三角形其他顶点的向量。
    • 我制作 7x7 网格。因为我的纹理应该只在高度图四边形上平铺,我认为只有第一个三角形应该与四边形中的第二个三角形匹配,但我认为我误用了一些东西,因为这两个三角形看起来不太平铺:link。我在我的第一篇文章中添加了代码,也许你可以指出一个错误
    • 你不能既没有跳跃也没有翘曲。不是普通的二维纹理。你必须选择其中一个。
    猜你喜欢
    • 2023-04-09
    • 2013-07-16
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多