围绕任意锚点的OpenGL变换

时间:2012-10-25 11:36:50

标签: math opengl 3d

我正在使用可编程管道(OpenGL 4)。问题如下。我有一个名为“plane”的默认原语,它有4个顶点 - 在剪辑空间coordnates [-1,1]范围内定义。 我从不直接移动它们来缩放平面,而是将比例应用于模型矩阵。 因此,例如,要获得宽度= 100,高度= 50的平面,我会缩放平面:

_modelMatrix.scale(100/2,50/2,1);

此外,我还有一个定位飞机中心的定位点,它可以移动以抵消当地中心。 问题: 一切正常,直到我在移动枢轴后开始缩放平面。例如,如果平面宽度= 100且高度= 100,并且我想将中心偏移到平面的左上角我翻译模型矩阵到当前位置+添加x和y偏移值(50和-50)。我得到中心可以在那里。但是,当我再次缩放平面时,枢轴中心不会相对于新的比例保持但是得到移位,因为它不与对象一起缩放。确保定义的锚相对于新比例调整的正确方法是什么?我知道在固定管道中,通过向顶点添加锚偏移可以很容易地解决它直接在通过API调用定义它们时,但在我的情况下,我不会在每个渲染循环上重新创建顶点缓冲区而不想,因为我必须保留默认的顶点数范围,以便我在Shaders中执行某些操作。

1 个答案:

答案 0 :(得分:2)

这是standard order-of-transforms problem。解决方案是以正确的顺序应用转换。如果你想缩放然后偏移,那就这样做。如果你想相对于新的偏移量进行偏移然后缩放,那就这样做。两者都不“正确”;这一切都取决于你想要的东西。

对于您的情况,您需要在翻译之前首先应用比例。假设您正确地乘以列主矩阵,这意味着您提供了 last 的比例。