2010-11-04 72 views
1

是否可以通过对ModelView或Projection矩阵的非标准操作来弯曲或扭曲OpenGL空间?例如,命令glScale(scaleFactor,scaleFactor,noScaleFactor)将沿着X和Y轴以统一的方式重新调整场景的所有元素的大小。可以通过ModelView或Projection矩阵弯曲或扭曲OpenGL空间吗?

但是,如果可以以非均匀的方式扭曲OpenGL空间,它将极大地扩展不同效果的潜力。特别是,我后面的效果是类似鱼缸般的缩放效果,因此元素会以线性或非线性的方式相对于它们与用户的接近程度(在我的情况下由Z轴表示)放大。

所以glScale命令的缩放上面会在沿Z轴的每个元素的位置或有:

glScale(功能1(Z距离),函数2(Z距离),noScaleFactor)

回答

4

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

以下是Fisheye Lens Vertex Shader的示例。

+0

用opengl做这样的效果有多困难? https://youtu.be/WeOBXmLeJWo?t=43s事实上,它甚至有可能使用顶点着色器创建[虫洞]效果(https://en.wikipedia.org/wiki/Wormhole)效果? – inf3rno 2016-08-20 22:24:58

+0

@ inf3rno这个问题和答案来自2010年。如果你没有直接在讨论中添加一些东西,请创建你自己的问题。 – daveydave400 2016-09-07 01:02:22

0

自从我玩过开放GL之后,我已经有一段时间了,但是我最初的反应是你应该看看使用OpenGL着色器来解决这个问题。看看这个类似的帖子: link text

0

如果开启角度(例如,通过gluPerspectiveglFrustum),你会得到线性缩放取决于从虚拟摄影机的距离 - 这将是沿Z轴默认。根据您为相机位置,近平面和远平面设置的距离,您可以/会得到类似于极广角镜头的夸张视角 - 但它仍然是一个完美的直线镜头,所以只适用于例如,矩形中的线将始终保持直线,而不会使用鱼眼镜头获得的曲率。

然而,最终,所有与矩阵有关的都是线性变换,所以你不会从它们弯曲或弯曲。如果你想要鱼眼镜头的桶形变形,你需要做不同的处理,可能在着色器中。

0

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