可以通过ModelView或Projection矩阵弯曲或扭曲OpenGL空间吗?

时间:2010-11-04 15:52:07

标签: opengl

是否可以通过ModelView或Projection矩阵的非标准操作来弯曲或扭曲OpenGL空间?

例如,命令glScale(scaleFactor,scaleFactor,noScaleFactor)将沿X轴和Y轴以统一的方式重新调整场景的所有元素。

但是如果一个人能够以非统一的方式扭曲OpenGL空间,那么它将极大地扩展不同效果的潜力。特别是,我所追求的效果是类似鱼缸的缩放效果,相对于它们与用户的接近程度(在我的情况下由Z轴表示),元素将以线性或非线性方式放大。

因此,上面的glScale命令的缩放将取决于每个元素沿Z轴的位置:

glScale(function1(Z距离),function2(Z距离),noScaleFactor)

4 个答案:

答案 0 :(得分:5)

Modelview&投影是矩阵。所以你只能进行线性变换。您可以使用顶点着色器尝试效果,但是您需要一个相对密集的网格,以使您的变换看起来很好。着色器将修改每个顶点位置,但由3个顶点组成的三角形仍未修改。

以下是Fisheye Lens Vertex Shader的示例。

答案 1 :(得分:0)

自从我使用open GL以来已经有一段时间了,但我对此的初步反应是你应该看一下使用openGL着色器来解决这个问题。看看这篇类似的帖子: link text

答案 2 :(得分:0)

如果您打开透视图(例如,通过gluPerspectiveglFrustum),您将获得线性缩放,具体取决于与虚拟摄像机的距离 - 默认情况下将沿z轴。根据您为摄像机位置,近平面和远平面设置的距离,您可以/将获得类似于极广角镜头的夸张视角 - 但它仍然是一个完美的直线镜头,所以只是为了例如,矩形中的线条将始终保持直线,没有鱼眼镜头的曲率。

然而,最终,对矩阵所做的一切都是线性变换,所以你不会因它们而变形或弯曲。如果你想要鱼眼镜头的桶形失真,你需要以不同的方式做到这一点,可能是在着色器中。

答案 3 :(得分:0)

OpenGL没有“空间”的概念。你不能说“我希望[0,0,0]和[10,10,0]之间的所有东西都是蓝色的”或类似的东西。 选择性缩放必须通过您的程序完成,通过根据需要转换您的顶点,然后才能到达GL管道。 (也就是说,获得距离,沿着你想要的轴移动顶点,然后沿着线向下推)。这意味着更多的工作,但如果我理解你想要实现的效果,你就不能用矩阵来做。