【问题标题】:How to translate, rotate and scale at a particular point?如何在特定点平移、旋转和缩放?
【发布时间】:2018-04-08 17:54:39
【问题描述】:

我想从指定点(原点)平移、旋转和缩放所有这些变换。这就是我现在使用的(我尝试了很多组合,但仍然无法弄清楚!看起来我又回到了学习线性代数)。

我正在使用 GLM。

看看我正在使用的代码:-

GLfloat rx = sprite->origin.x / width;
GLfloat ry = sprite->origin.y / height;

translate(model, vec3( -sprite->origin.x, -sprite->origin.y, 0.0f ));
translate(model, vec3( rx * scale[0], ry * scale[1], 0.0f ));
rotate(model, radians(rotation), vec3( 0.0f, 0.0f, 1.0f ));
translate(model, vec3( -(rx * scale[0]), -(ry * scale[1]), 0.0f ));
scale(model, vec3( width * scale[0], height * scale[1], 1.0f ));
translate(model, vec3( position[0], position[1], 0.0f ));

原点是物体的起点,然后将其平移到中心进行旋转,然后再平移回来。

缩放它并将对象平移到指定位置。

我的意思是,这段代码有什么问题?

【问题讨论】:

  • 为什么要按比例因子进行翻译,而不是按比例因子进行缩放?此外,更重要的是:你想做什么?这段代码没有告诉我们你的意图是什么,你的文字也没有充分解释它。为了防止XY Problem,您能否更新您的帖子以解释您正在编写此代码的目的是什么?
  • @Mike'Pomax'Kamermans 我希望它完成所有以对象中心为中心的转换(比如说精灵)。我在精灵渲染器中实现了一种起源。
  • 在这种情况下,您已经回答了自己的问题: translate(-cx,-cy) 所以您的中心是 (0,0),然后应用与 (0,0) 相关的其他变换),然后翻译(cx,cy)。
  • @Mike'Pomax'Kamermans 旋转是导致问题的原因。你能弄清楚为什么吗?这发生在我正在变换的大部分对象上,对象围绕点旋转,而不是从中心旋转。
  • 我刚刚告诉过你。通过对象的中心 x/y ((xmin+xmax)/2 by (ymin+ymax)/2) 进行转换,而不是像您的代码现在所做的那样通过偏移 x/y 进行转换。

标签: transform glm


【解决方案1】:

我找到了答案,

按这个顺序做:-

  1. 将对象平移到位置,例如vec3(position, 0.0f)

  2. 然后旋转对象

  3. 将点翻译回原点,例如vec3(-originx * scale, -originy * scale, 0.0f)

  4. 最后,缩放对象


说明:

取物体在二维坐标中的位置为0, 0取上面第一个点的例子中提到的变量position)。

您可以看到该对象将平移(移动)到该位置。

注意:不要忘记将它与您的比例相乘,否则如果您的比例大于 1,它会产生错误的结果。

现在是您旋转对象的时候了。

从左上角进行缩放,因此您无法从中心进行。

接下来,只需缩放对象。

就是这样。

【讨论】: