使用正交渲染模拟3D'卡片'

时间:2010-04-07 10:42:39

标签: graphics rendering perspective orthographic

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

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

我可以改变四边形中的四个点中的任何一个(但是仅在2D空间中,它是正交投影,因此3D空间无关紧要)。所以基本上我试图在正交投影中模拟二维四边形的视角,任何想法?它在数学上是否可行/可行?

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

这就是我的意思:

alt text

左上角只是卡片,中心是y度旋转X度的卡片,最右边是不同程度x和y旋转的卡片。

1 个答案:

答案 0 :(得分: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,使得(U,V在[0..1]中):

  • U(top'',left'')=(0,0)
  • U(top'',right'')=(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渲染器
  • 如果您只需要一些图像而不是实时动画,则自己计算纹理。