1

背景

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

我一直在设置小型实验,将学习分成小块,这样我就可以看到当我应用各种转换时会发生什么,而且总体上进展顺利。我看到了事情是如何工作的,我可以对转换矩阵进行相当抽象的描述,并将它们转化为实际发生的事情。

问题

但在这里,我已经被跺了跺脚:

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

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

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

所以我们有一个局部缩放变换:

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

我尝试并工作的内容:

  1. 将点转换为局部坐标系。
  2. 应用局部尺度变换。
  3. 将这些点转换回全局坐标系。

我已经尝试过了,它有效。但是,我对此并不满意。它需要我迭代和转换我的点集三次。似乎效率不高。请记住,我使用的是基于 Ruby 的 API——速度很慢,而且我正在处理包含数千个点的数据集。

这可以做到吗?

有没有一种方法可以只对每个点进行一次迭代和转换并获得正确的结果?

我试过了,但失败了:

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

我想也许这会起作用:

( local_coords_transformation.inverse * scaling ) * local_coords_transformation )

我认为这会将我的局部缩放转换转换为在全局坐标系中工作的转换。它没有——我预计你们中的一些人现在会摇头。

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

4

1 回答 1

0

啊! 得到它的工作!:D

local_coords_transformation * scaling * local_coords_transformation.inverse

我第一次弄错了,因为我没有意识到转换的顺序与你用英语描述的顺序相反。在阅读这篇维基百科文章时,我意识到出了什么问题:

http://en.wikipedia.org/wiki/Transformation_matrix#Composing_and_inverting_transformations

换句话说,组合变换 A 后跟 B 的矩阵只是各个矩阵的乘积。请注意,乘法是按照与英文句子相反的顺序进行的:“A 后接 B”的矩阵是 BA,而不是 AB

呸!

于 2012-10-05T20:52:32.117 回答