【发布时间】: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 进行转换。