Math 任意锚定点周围的OpenGL变换

Math 任意锚定点周围的OpenGL变换,math,opengl,3d,Math,Opengl,3d,我正在使用可编程管道(OpenGL 4)。问题如下。我有一个名为“平面”的默认原语,它有4个顶点-在剪辑空间坐标[-1,1]范围内定义。 我从不直接移动它们来缩放平面,而是将缩放应用于模型矩阵。 例如,要获得宽度为100、高度为50的平面,请缩放该平面: _modelMatrix.scale(100/2,50/2,1); 我还有一个定位点,它定义了平面的中心,可以移动它来偏移局部中心。 问题是: 在移动轴后开始缩放平面之前,一切都正常。因此,例如,如果平面宽度=100,高度=100,并且我希望

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

_modelMatrix.scale(100/2,50/2,1);
我还有一个定位点,它定义了平面的中心,可以移动它来偏移局部中心。 问题是: 在移动轴后开始缩放平面之前,一切都正常。因此,例如,如果平面宽度=100,高度=100,并且我希望将中心偏移到平面的左上角,我将模型矩阵平移到当前位置+添加x和y偏移值(50和-50)。我将中心设置在那里。但是,当我再次缩放平面时,轴心不会相对于新比例保持,而是会发生移动,因为它不会随对象一起缩放。如何确保定义的锚相对于新比例进行调整?我知道,在固定管道中,通过将锚偏移直接添加到顶点,可以轻松解决此问题通过API调用定义它们,但在我的例子中,我不会在每个渲染循环上重新创建顶点缓冲区,也不想这样做,因为我必须为在着色器中执行的某些操作保留默认的顶点数范围。

这是一个很好的例子。解决方案是以正确的顺序应用转换。如果您想缩放然后偏移,那么就这样做。如果要偏移然后相对于新偏移进行缩放,请按此方式进行。两者都不是“正确的”;这完全取决于你想要什么

对于您的情况,您需要在翻译之前首先应用刻度。假设与列主矩阵相乘是正确的,这意味着您最后提供了比例。

这是一个错误。解决方案是以正确的顺序应用转换。如果您想缩放然后偏移,那么就这样做。如果要偏移然后相对于新偏移进行缩放,请按此方式进行。两者都不是“正确的”;这完全取决于你想要什么

对于您的情况,您需要在翻译之前首先应用刻度。假设与列主矩阵相乘是正确的,这意味着您最后提供了比例