如何在一次转换中沿着矢量缩放?

时间:2012-10-05 20:06:23

标签: transformation

背景

我正在尝试理解矩阵变换。 (使用它的Ruby API为SketchUp开发插件)

我一直在设置小型实验,以便将小块学习分开,这样我就可以看到当我应用各种变换时会发生什么,并且通常它一直很顺利。我正在看事情是如何运作的,我可以对转换矩阵进行相当抽象的描述,并将它们转化为实际发生的事情。

问题

但是这里有些东西我被踩了:

(我们在这里使用4x4矩阵。)

我想沿着给定的矢量(或局部坐标系)缩放一组点。

假设我们有一个正方形,从全局原点偏移[20,10],旋转30度。我想将这个方块在X方向上缩放2倍。

所以我们进行了局部缩放转换:

local_scale = Geom::Transformation.scaling( 2, 1, 1 )

我尝试过并且工作过:

  1. 将点转换为本地坐标系。
  2. 应用本地规模转换。
  3. 将点转换回全局坐标系。
  4. 我试过这个,它有效。但是,我对它并不满意。它需要我迭代并转换我的设置点三次。看起来效率不高。记住我正在使用基于Ruby的API - 事情很慢,而且我正在处理数千个点的数据集。

    可以这样做吗?

    有没有办法可以迭代并转换每个点一次并得到正确的结果?

    我尝试过但失败了:

    我尝试将逆变换与局部坐标结合使用本地缩放,但失败了。 (这里显然有一些关于组合我需要阅读的转换的内容 - 再次。)

    我认为这可能有用:

    ( local_coords_transformation.inverse * scaling ) * local_coords_transformation )

    我认为这会将我的局部缩放变换转换为在全局坐标系中起作用的变换。它没有 - 我希望你们现在有几个摇头。

    如果我的解释不清楚或者是否需要更多背景信息,请告诉我。

1 个答案:

答案 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

咄!