我正在尝试理解矩阵变换。 (使用它的Ruby API为SketchUp开发插件)
我一直在设置小型实验,以便将小块学习分开,这样我就可以看到当我应用各种变换时会发生什么,并且通常它一直很顺利。我正在看事情是如何运作的,我可以对转换矩阵进行相当抽象的描述,并将它们转化为实际发生的事情。
但是这里有些东西我被踩了:
(我们在这里使用4x4矩阵。)
我想沿着给定的矢量(或局部坐标系)缩放一组点。
假设我们有一个正方形,从全局原点偏移[20,10]
,旋转30度。我想将这个方块在X方向上缩放2倍。
所以我们进行了局部缩放转换:
local_scale = Geom::Transformation.scaling( 2, 1, 1 )
我试过这个,它有效。但是,我对它并不满意。它需要我迭代并转换我的设置点三次。看起来效率不高。记住我正在使用基于Ruby的API - 事情很慢,而且我正在处理数千个点的数据集。
有没有办法可以迭代并转换每个点一次并得到正确的结果?
我尝试将逆变换与局部坐标结合使用本地缩放,但失败了。 (这里显然有一些关于组合我需要阅读的转换的内容 - 再次。)
我认为这可能有用:
( local_coords_transformation.inverse * scaling ) * local_coords_transformation )
我认为这会将我的局部缩放变换转换为在全局坐标系中起作用的变换。它没有 - 我希望你们现在有几个摇头。
如果我的解释不清楚或者是否需要更多背景信息,请告诉我。
答案 0 :(得分:0)
啊!搞定了! :d
local_coords_transformation * scaling * local_coords_transformation.inverse
我第一次弄错了,因为我没有意识到转换的顺序与你用英语描述它的方式相反。阅读这篇Wikipeadia文章时,我意识到出了什么问题:
http://en.wikipedia.org/wiki/Transformation_matrix#Composing_and_inverting_transformations
换句话说,组合变换A后跟B的矩阵就是各个矩阵的乘积。 请注意,乘法是按照与英语句子相反的顺序进行的:“A后跟B”的矩阵是BA,而不是AB 。
咄!