2

我正在从正交角度渲染纹理四边形,并希望通过修改 UV 和四边形四个点(左上、右上、左下、右下)的顶点位置来模拟“深度”。

我发现如果我使左上角和右下角 y 位置相同,我不会得到线性“倾斜”,而是会出现扭曲的,其中覆盖顶部三角形(构成四边形)的纹理似乎底部三角形纹理看起来正常时被压扁。

我可以更改四边形上四个点中的任何一个 UV(但仅在 2D 空间中,无论如何它都是正交投影,因此 3D 空间并不重要)。所以基本上我试图在正交投影中模拟二维四边形的透视,有什么想法吗?它甚至在数学上可能/可行吗?

理想情况下,我想要一种情况,我可以通过一个函数设置 x/y 旋转以及虚拟 z“位置”(模拟 z 深度),并在内部看到它计算位置/uvs 以创建 3D 效果. 看起来这应该都是数学的,可以将一组 2D 变换应用于四边形的每个角以模拟深度,我只是不知道如何实现它。我猜它需要三角学或其他东西,我正在尝试计算数学但没有取得太大进展。

这就是我的意思:

替代文字

左上角是卡片,中间是 x 度旋转的卡片,最右边是 x 和 y 不同度数旋转的卡片。

4

1 回答 1

4

要计算角的 2D 坐标,只需选择 3D 坐标并应用 3D 透视方程:

原卡角 (x,y,z)

应用旋转(通过矩阵乘法)你得到(x',y',z')

应用透视投影(选择一些相机原点、方向和视野)对于最简单的情况是:

  • x'' = x' / z
  • y'' = y' / z

现在更大的问题是用于从像素坐标获取纹理坐标的纹理:

您的正确方法是使用形式的单应变换:

  • U(x,y) = ( ax + cy + e ) / (gx + hy + 1)
  • V(x,y) = ( bx + dy + f ) / (gx + hy + 1)

这是事实是应用于平面的透视方程的结果。

a,b,c,d,e,f,g,h 被计算为(在 [0..1] 中使用 U,V ):

  • U(上'',左'') = (0,0)
  • U(上'',右'') = (0,1)
  • U(下'',左'') = (1,0)
  • U(下'',右'') = (1,1)

但是您的 2D 渲染框架可能使用双线性插值代替:

  • U( x , y ) = a + b * x + c * y + d * ( x * y )
  • V( x , y ) = e + f * x + g * y + h * ( x * y )

在这种情况下,你会得到一个看起来很糟糕的结果。

如果渲染器将四边形分成两个三角形,那就更糟了!

所以我只看到两个选项:

  • 使用 3D 渲染器
  • 如果您只需要几张图像而不是实时动画,请自行计算纹理。
于 2010-04-07T11:37:29.873 回答