我不知道正确的术语来描述它,这就是为什么我在谷歌中找不到它。我想要的只是缩放对象,特别是 2D 矩形,但将其保持在 XY 坐标上。
我目前的解决方案是这样的:
glTranslatef(x, y, 0);
glScalef(scaleX, scaleY, 0);
glTranslatef(-x, -y, 0);
drawRect(x, y, width, height, texture);
Run Code Online (Sandbox Code Playgroud)
我只是假装 glScale 作为 glRotate 在其中心旋转,它有点工作,但我可以看到缩放到其他值时其坐标的微小调整。
另外,最好使用 glTranslate 或仅在顶点上应用 x,y 等变量。从这两个切换时我看不出有什么区别,但我担心添加“推入和弹出矩阵”会影响场景中其他对象的行为和程序的性能,因为我将使用大量此类矩形。
更新:
所以你可以想象我想要实现的目标是多么简单
我认为 < x
, y
, 0
> 是矩形左下角在“规范”坐标系(我的意思是我们开始的坐标系)中的位置。
有了这些假设,您可以通过将模型视图堆栈重置为恒等来实现您的目标,然后在进行缩放之前移动到对象空间。因此,您确实非常接近,但根据您之前对模型视图矩阵所做的操作,您可能会遇到结果的变化。
以下代码应该可以完成您想要的操作:
glPushMatrix();
glLoadIdentity();
glTranslatef(x, y, 0);
// now in "object space"
glScalef(scaleX, scaleY, 0);
drawRect(0, 0, width, height, texture);
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)
我不知道这个draw
函数是做什么的,但我想它只是发出一堆glVertex
andglTexCoord
调用,即。它不会干扰模型视图矩阵,否则我的代码很可能会破坏它。
glPushMatrix
请注意,如果使用和调用包装所有对象渲染glPopMatrix
,则不需要该glLoadIdentity
调用,甚至可能会适得其反。例如,如果您将对象数据组织为层次结构,每个子对象相对于其容器定位,那么您将需要在递归渲染对象层次结构时完全删除该调用。
另一个问题是效率。保存和恢复矩阵是相当昂贵的操作。鉴于您的问题代码使用立即模式,我认为这不是您主要关心的问题。手动应用对象转换(即通过使用您自己的矩阵库计算它们)并将它们提交给 opengl 而不需要调用 opengl modelview 操作例程肯定会更快。然而,这应该由另一个(更面向数学的)问题和答案来涵盖。
归档时间: |
|
查看次数: |
4835 次 |
最近记录: |