【发布时间】:2020-04-19 06:12:41
【问题描述】:
我在处理矩阵变换时遇到了一些麻烦。对于测试,我有一个由 10 个方块组成的链,每个方块都是前一个方块的父级。然后我可以对每个正方形应用旋转并得到这个结果...
这是正确的,正是我想要的。现在这里是同样的事情,第 8 格均匀缩放。
再次,这是完美的。孩子们正在继承他们父母的转变。现在问题来了,当我对第 8 格应用不均匀的比例时。
这张图片是一个微妙的例子,但我希望你们明白这一点。最后一个方格不接触前一个方格角。它也可能不明显,但最后两个方块实际上不是正确的尺寸。如果我应用更多的旋转,这会变得更加明显。
这是我构造矩阵的代码。
maths::mat3 DisplayObject::getGlobalTransform() {
maths::mat3 output(1.0f);
output *= maths::mat3::Rotate(rotation);
output *= maths::mat3::Scale(scale);
output *= maths::mat3::Translate(position);
if(parent != nullptr){
output *= parent->getGlobalTransform();
}
return output;
}
任何帮助或想法将不胜感激!
编辑:这是我应用旋转和缩放的方式。
mat3 mat3::Rotate(float angle)
{
mat3 result(1.0f);
float r = toRadians(angle);
result.elements[0] = cos(r);
result.elements[1] = -sin(r);
result.elements[3] = sin(r);
result.elements[4] = cos(r);
return result;
}
mat3 mat3::Scale(const vec2& scale)
{
mat3 result(1.0f);
result.elements[0] = scale.x;
result.elements[4] = scale.y;
return result;
}
...这就是我如何将它们再次取出...
float mat3::GetRotation() const
{
return atan2(elements[1], elements[0]);
}
vec2 mat3::GetScale() const
{
return vec2(rows[0].Magnitude(), rows[1].Magnitude());
}
【问题讨论】:
-
@Rabbid76 不完全是,我只是想确认一下。不过还是谢谢。
-
@Rabbid76 然后我得到一个类似但同样错误的结果哈哈。但是,它并没有弄乱统一缩放版本,这很遗憾,因为现在我不知道哪个顺序是正确的!
-
你的目标结果是什么?只有一个 rectangle 还是多个 rectangles ?
-
@Rabbid76 谢谢你,奇怪的是它的工作方式都一样。但你是对的,我已经更新了那条线。 (我将编辑帖子以匹配)。但规模不均匀的问题仍然存在。
-
@Orace 目标结果,所有正方形的角都应该相互接触,并继承它们的父尺度。适用于统一缩放。
标签: c++ math opengl matrix rotational-matrices