Android在使用Ortho时在OpengL纹理中创建假透视变形

时间:2014-08-10 16:06:41

标签: android opengl-es 2d textures

我正在使用Ortho投影来完成我的大部分工作,我很高兴,现在我需要创建一个简单的翻转卡"对类似于View.rotateX在Android视图中所做的对象的影响。

我知道如果没有切换到GLU视角,这在真正的3D中是不可能的,但是我想知道是否有可能"假"这通过在绘制之前创建一种Quad的梯形缩放,即使不完美的结果也可以。我不想使用透视投影。

这是我的预测

gl.glViewport(0, 0, w, h);
gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, w, h, 0, -1f, 100f);
gl.glEnable(GL_TEXTURE_2D);

这是我的纹理绘图调用

gl.glTranslatef(mXOffset, mYOffset, 0f);
gl.glEnableClientState(GL_VERTEX_ARRAY);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glVertexPointer(2, GL_FLOAT, 0, sVertexBuffer);
gl.glEnableClientState(GL_TEXTURE_COORD_ARRAY);
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
gl.glTexCoordPointer(2, GL_FLOAT, 0, mTextureBuffer);
gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
gl.glDisableClientState(GL_VERTEX_ARRAY);
gl.glDisableClientState(GL_TEXTURE_COORD_ARRAY);

我假设Android View实现如果使用硬件加速实际上做了类似的事情,但我找不到实现细节。

1 个答案:

答案 0 :(得分:1)

透视投影的特征部分是与眼点的距离的划分。这就是使几何体更接近它们看起来更大的原因。

您可以在不切换到完整透视矩阵的情况下应用其他转换。但特别是在使用固定管道时,在绘制之前修改坐标可能更容易。

对于相对于矩形中心的坐标为(x0, y0, 0.0f)的给定矩形角,xax周围的角度简单旋转' alpha`将角落放在:

(x0, y0, 0.0f) --> (x0, y0 * cos(alpha), y0 * sin(alpha))

要对此应用假视角,请选择一个眼距d,它控制生成的透视量,使用较小的d值,从而产生更强的视角。除以旋转点的相对距离,然后产生:

s = d / (d - y0 * sin(alpha))
(x0, y0, 0.0f) -->  s * (x0, y0 * cos(alpha), y0 * sin(alpha))

如果在渲染之前将其应用于矩形的所有4个角,则应获得透视效果。要完全翻转矩形,您可以逐步将alpha从0.0增加到pi。

只要y0远小于ds的计算也可以近似为:

s = d / (d - y0 * sin(alpha))
  = 1.0f / (1.0f - (y0 / d) * sin(alpha))
  ~ 1.0f + (y0 / d) * sin(alpha)

c的控制参数替换为1.0 / d,其中c的较大值现在产生更强的视角,整个事情变为:

s = 1.0f + c * y0 * sin(alpha))
(x0, y0, 0.0f) -->  s * (x0, y0 * cos(alpha), y0 * sin(alpha))

这两个选项都应该产生非常相似的结果。您可能想尝试两者,看看哪一个看起来更好。