2010-04-07 103 views
2

我从正交渲染渲染纹理四边形,并且想通过修改四边形的UV和顶点位置来模拟“深度”(左上角,右上角,左下角,右下)。用正交渲染模拟3D'卡片'

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

我可以改变紫外线,四个点上的任何四点(但只在二维空间,它是正射投影,所以三维空间无关紧要)。所以基本上我试图在正交投影的二维四边形上模拟透视,任何想法?它甚至在数学上可行/可行吗?

理想情况是我可以通过一个函数设置x/y旋转以及虚拟z'位置'(它模拟z深度)并在内部看到它将位置/ uvs计算为创建3D效果。这似乎应该都是数学的,一组二维变换可以应用到四边形的每个角来模拟深度,我只是不知道如何使它发生。我猜想这需要三角函数或其他什么东西,我正在努力研究数学,但没有取得太大进展。

这里就是我的意思:

alt text

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

+0

你想要达到的目标和实际得到的结果的一些图像将会使问题变得更加清晰。使用imgur.com/免费和快速的图像存储。 – shoosh 2010-04-07 10:47:23

+0

我刚刚添加了一张图片 – tweetypi 2010-04-07 10:55:03

+2

您的图片显示的是透视投影,而不是正投影。你想要哪一个? – Thomas 2010-04-07 11:11:09

回答

4

要计算角落的二维坐标,只需选择在三维坐标和应用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)

事实上,这是应用于飞机的有关方程的结果。 (其中U,V in [0 ..,0,0,...,0,0,...,0,0,...,1]):

  • 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渲染
  • 计算纹理自己,如果你只需要一些图片,而不是实时动画。
+0

简而言之,问题是你不能只计算角的位置,你必须分别计算每个像素在纹理中的位置。这是因为更远的纹理看起来更小,但是如果您只是计算角落位置并假定纹理在它们之间被均等拉伸,则三角形的较远部分将具有太大的纹理,并且接近的部分纹理太小。 – tloflin 2010-04-07 15:44:20