OCS と任意の軸のアルゴリズム
幾何学的に平面を特定するには原点と【押し出し方向】すなわち平面の法線だけでは情報が不足しています。これだけでは、法線を同一としながらも X 軸 Y 軸が異なる平面が無限に存在します。しかしながら、AutoCAD では【任意の軸のアルゴリズム】を用いることによってX 軸 Y軸を「強引に」決定します。
Arbitrary Axis Algorithm
【任意の軸のアルゴリズム】は Arbitrary Axis Algorithm の翻訳ですが、「任意」といえば「あなたの都合の良いように」というやわらかいイメージもありますが、Arbitrary を辞書で調べると「任意」以外に「勝手な、独断的な、専横な」という言葉が並んでいます。
AutoCAD のヘルプから【任意の軸のアルゴリズム】のポイントを箇条書きに書き下すと、以下の通りです。
- 単位ベクトルである【押し出し方向】から、以下の方法でX軸を決定する。
A)【押し出し方向】ベクトルの X と Y の絶対値が共に 1/64 未満ならば、WCS の Y 軸と【押し出し方向】ベクトルの外積を X 軸とする。
B)【押し出し方向】ベクトルの X と Y の絶対値がいずれか 1/64 以上ならば、WCS の Z 軸と【押し出し方向】ベクトルの外積を X 軸とする。 - 【押し出し方向】ベクトルと上で求まった X 軸と合わせて、さらに外積とることによって Y 軸を求める。
多くの場合 OCS に基づく座標変換では【押し出し方向】を指定して trans 関数を使えますので、直接 OCS の変換マトリックスを使用することは少ないかと思いますが、【押し出し方向】から OCS を表す変換マトリックスを計算する OCS-Matrix 関数は次のようになります。
(defun OCS-Matrix (normalVector / threshold axisX axisY) (setq normalVector (vector:Unit normalVector) threshold (/ 1.0 64) axisX (vector:Unit (if (and (< (abs (car normalVector)) threshold) (< (abs (cadr normalVector)) threshold) ) ;; WCS AXIS-Y x normal (3DVector:CrossProduct '(0.0 1.0 0.0) normalVector) ;; WCS AXIS-Z x normal (3DVector:CrossProduct '(0.0 0.0 1.0) normalVector) ) ) axisY (3DVector:CrossProduct normalVector axisX) ) (make-transformation-matrix '(0.0 0.0 0.0) axisX axisY) )
関数の使用例は以下の通りです。引数には【押し出し方向】ベクトルを指定します。
_$ (OCS-Matrix '(0.0 0.0 1.0)) ⏎
((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
_$ (OCS-Matrix '(1.0 1.0 0.0)) ⏎
((-0.707107 0.0 0.707107 0.0) (0.707107 0.0 0.707107 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 0.0 1.0))
【押し出し方向】から OCS の変換マトリックスを作成することができるようになりました。この変換マトリックスを使って座標変換をすれば trans 関数と同じことができます。しかし、OCS は配置したい図形の位置とは関係なく原点は WCS の原点ですし X 軸 Y 軸の方向も図形を配置したい方向とは関係なく決まっているので、その間を埋める計算を行わなければなりません。