1

バックグラウンド

行列変換を理解しようとしています。(Ruby APIを使用したSketchUp用のプラグインの開発)

私は、学習を小さなチャンクに分割するための小さな実験を設定してきました。これにより、さまざまな変換を適用したときに何が起こるかを確認でき、一般的にはうまくいっています。私は物事がどのように機能するかを見ています、そして私は変換行列のかなり抽象的な記述を取り、それらを実際に起こることに変換することができます。

質問

しかし、ここで私が踏みにじられた何か:

(ここでは4x4マトリックスを使用しています。)

与えられたベクトル(またはローカル座標系)に沿って点のセットをスケーリングしたいと思います。

[20,10]グローバル原点からオフセットされ、30度回転した正方形があるとします。この正方形をX方向に2倍に拡大縮小したいと思います。

したがって、ローカルスケーリング変換があります。

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

私が試し、働いたこと:

  1. ポイントをローカル座標系に変換します。
  2. ローカルスケール変換を適用します。
  3. ポイントをグローバル座標系に変換し直します。

私はこれを試しました、そしてそれは働きます。しかし、私はそれに満足していません。ポイントのセットを3回繰り返して変換する必要があります。効率的ではないようです。RubyベースのAPIを使用していることを忘れないでください。処理が遅く、何千ものポイントのデータセットを処理しています。

これはできますか?

各ポイントを1回だけ繰り返して変換し、正しい結果を得る方法はありますか?

私が試したものと失敗したもの:

ローカル座標への逆変換とローカルスケーリングを組み合わせてみましたが、失敗しました。(ここで、私が読む必要のある変換の組み合わせについて、明らかに何かがあります-もう一度。)

多分これはうまくいくと思いました:

( local_coords_transformation.inverse * scaling ) * local_coords_transformation )

これにより、ローカルスケーリング変換がグローバル座標系で機能する変換に変換されると思いました。そうではありませんでした-そして今、頭を振っている人が何人かいると思います。

説明が不明確な場合、またはより多くの背景情報が必要な場合はお知らせください。

4

1 に答える 1

0

ああ!動作しました!:D

local_coords_transformation * scaling * local_coords_transformation.inverse

変換の順序が英語での説明と逆になっていることに気づかなかったので、最初は間違っていました。このWikipeadiaの記事を読んだとき、私は何がうまくいかなかったかに気づきました。

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

言い換えると、結合された変換Aとそれに続くBの行列は、単に個々の行列の積です。乗算は英語の文とは逆の順序で行われることに注意してください。「Aの後にBが続く」の行列は、ABではなくBAです。

やった!

于 2012-10-05T20:52:32.117 に答える