回転行列の導出に使用される標準的な回転式はすべて、原点を中心とした回転用です。代わりに特定の点を中心にその回転を適用したい場合は、最初に原点をオフセットする必要があります-または、同等に、オブジェクトを移動して、回転させたい点が原点に来るようにします。
最初に2Dのケースを検討してください。これは、2Dのケースがより単純であり、技術が拡張されるためです。原点を中心とする幅2の立方体があり、その中心を中心に45度回転させたい場合、2D回転行列の簡単な適用になります。
ただし、代わりに右上隅(にある1,1
)を中心に回転させたい場合は、最初にその角が原点になるように移動する必要があります。これは、の翻訳で達成できます-1,-1
。その後、以前と同じようにオブジェクトを回転できますが、(byで1,1
)平行移動してこれをフォローアップする必要があります。したがって、一般に、約点のR
回転の回転行列を実現するには、次のようにします。r
P
R = translate(-P) * rotate(r) * translate(P)
ここでtranslate
およびrotate
は、それぞれ標準的な平行移動/回転行列です。偶然にも、これは3Dに簡単にスケーリングしますが、回転にも軸を指定する必要があることを除いて、標準のX、Y、またはZ軸回転行列を常に選択できますが、それは鈍いでしょう。任意の軸角度回転行列を使用する必要があります。R
したがって、最終的な3Dは次のとおりです。
R = translate(-P) * rotate(a,r) * translate(P)
ここa
で、回転軸を表す単位ベクトルでありP
、回転点を表すモデル空間の3D点になります。
たまたま四元数をマトリックス表現に変換したり、マトリックス表現から変換したりできるので、必要に応じて連結をその方法で行うことができます。または、すべてを行列のままにしておくこともできます(クォータニオンには、適切な方法で補間するのが簡単になるなどの素晴らしい利点がありますが、必要かどうかはあなた次第です)。
また:
そのため、尾がローカルの原点にないベクトルを中心に回転するように視覚化しています。
厳密に言えば、ベクトルは原点からの変位と見なして位置を表すために使用できますが、ベクトルには位置自体がないため、そのように視覚化することは少し珍しいです。