FreeCADとクォータニオン。

FreeCADのViewではAxonometric(不等角投影)、Front/Rear、Top/Bottom、Right/Leftの7種類が標準で用意されていますが、それ以外の角度から見た図を用意したいという場合、けっこう困ります。

マウスでグリグリ動かしてうまいこといい感じの角度に持っていければいいんですが、なかなかこれが難しい。

となると、オブジェクトのPlacementプロパティのAxisとAngleを使って…という手もありますが、これもまた思うようにいきません。

ではFreeCADのPythonコンソールからやってみたらどうだろうと思ったのがこの記事の趣旨です。

Viewをツールバーのボタンアイコンやメニューから変更すると、Pythonコンソールにそのときに発行されたコマンドが出力されます。つまりこれは、FreeCADが内部でPythonを使ってモデルオブジェクトをいじっているということなんですが、たとえばTopボタンを押すと、
>>> Gui.activeDocument().activeView().viewTop()
というコマンドが発行されています。

また、たとえば先程のPlacementプロパティをいじると、それに対応した関数が呼ばれているのがわかります。

そんなことをしながらソースとドキュメントとコンソールをいじっていて、やっと見つけました。

まず、
Gui.ActiveDocument.ActiveView.setViewDirection([tuple])
です。これは視点方向を指定するコマンドになりますが、[tuple]のところにタプル形式で (X,Y,Z) を指定します。これがどうやら単位ベクトルになるようではあるんですが、今ひとつ挙動が思うようになりません。
ちなみに当然のように getViewDirection() もありますので、現在のViewの方向を知ることはできます。

この関数やviewTop()などをソースで追いかけていくと、Gui.ActiveDocument.ActiveView.getCameraOrientation() / setCameraOrientation() にたどり着きました。

このsetCameraOrientation()は、引数としてsbRotationオブジェクトを指定するようですが、ソースでは4つのパラメータを指定していました。それがおそらく SbRotation::SbRotation(const float q[4])だと思いますが、qが4つ。これがクォータニオンです。回転する3Dモデルを使うときには必ず出てくるもので、Direct3Dなんかをいじるときには避けては通れないものです。

それはともかく、Axo、Front/Rear、Top/Bottom、Right/LeftのそれぞれでgetCameraOrientation()のパラメータを確認した上で、マウスでできるだけ自分が参照したい角度に近づけて、再度パラメータを確認してみました。

自分が欲しかったのは、Axoと同じX-Yで、それを斜め上からではなくて真横から投影したものです。
それがちょっと傾いていたので、確認したパラメータをちょっといじって (0.65, 0.28, 0.28, 0.65)としてやったら、ちょうどよさそうな角度になりました。

本質的ではありませんが、実践的にはこういう方法もありかと思います。

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...