opengl 使用复杂UV贴图挤出圆柱体

k2fxgqgv  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(159)

这一切都是通过编程完成的,而不是使用任何类型的3D编辑器。
我收到了一个像这样的形状:

Map棋盘格的UV坐标,只是形状的x,y坐标,但我可以指望,任何我想Map到它上面的东西,大小都是1.0,1.0。
现在,我的工作是通过编程从这个形状中挤出一个圆柱体。非常简单:

我只是从顶部取了UV坐标,并将它们保留在底部的顶点上。但是现在,规范说最终的圆柱体应该看起来像这样(这是模拟的,我还没有能够生成它):

我以为我只是要调整我的UV坐标来说明高度,并在侧面得到跳棋,但我最终得到的是一个像这样的漩涡纹理:

我知道为什么,我只是在V坐标上加上n,但是当v坐标被拉伸时,它并不总是在棋盘格边界上,所以它的结果就像图像一样。
我相信我需要某种方向向量来添加圆柱体底部的UV坐标,以使侧边棋盘格笔直,但我尝试的所有方法都产生了更糟糕的混乱。
如何正确地对这些边进行UV贴图?

4szc88ey

4szc88ey1#

想象一下打开一个圆柱体(为了简单起见,忘记了顶部和底部的盖子)。你不就得到了一个矩形吗?现在,让我们想想水平和垂直坐标是如何计算的。
当你计算椭圆(圆柱体的基本形状)的弧度时,你也要计算UMap坐标。你还需要的是V方向的坐标:圆柱体的底部可以是v0,顶部是v1坐标。

|< 0..2*PI >|

u0,v1       u1,v1
  x-----------x   ---
  | | | | | | |    ^
  | | | | | | |  height (extrusion length)
  | | | | | | |    v
  x-----------x   ---
u0,v0       u1,v0

正式名称:

radian_delta = 2*PI / num_slices;
height_delta = height / num_segments;

u_coord = (slice_index * radian_delta) / (2*PI);
v_coord = (segment_index * height_delta) / height;

相关问题