とりあえず3次元のグラフを作る。
左の方がシーンのオブジェクト関連
- AxisGrid
- Teapot->PhongDirectional
- Groupで複数のオブジェクトを束にする
右側がカメラ行列。
vvvvで特徴的なのが一般的にはひとまとめの投影行列がProjectionとAspectRatioに分かれているところ。なのでRendererの幅・高さをAspectRatioに入力して結果をRendererのAspectRatioにもう一度投入するという感じになっている。2次元の使い勝手との兼ね合いですかね。
カメラ
CameraというノードはCamera(Transform Orbit)を使っている。
左横ドラッグでYaw、左縦ドラッグでPitch、右縦ドラッグで前進・更新という操作。他にもCamera(Transform Softimage)などが存在して独自のマウス操作とキーボードショートカットを実装している。
しかし、自分はメタセコ風の右ドラッグがYaw/Pitchかつホイールが前後進が好きなのでそういうノードを作ってみる。
既存のモジュールを改造して新しいモジュールを作る
Camera(Transform Orbit)が使えそうなのでこれをベースに改造することにする。
まず、Camera(Transform Orbit)を右クリックしてサブパッチを開きます。
思ったより複雑!
とりあえず改造版を違うモジュールとして認識させる準備をする。c-Mを押してモジュールの設定画面を開く。Authorを違う名前に変えます。他はお好みで。次に中ボタンクリックでメニューを出して右上のSave Asを選びます。
保存する場所はとりあえずvvvv/packs/custom/nodes/modulesにします。
customは変えてもOK。他は変えると検索パスから外れるっぽい?(完全に把握していない)。
vvvv/contributions等を設定済みの場合は、vvvv/contributions/modulesでもOK。
ファイル名は、Camera (Transform MyOrbit).v4pとでもしておきます。
保存するとダイアログが出てくるのでReloadを選んでおく。
このままだと新モジュールが認識されないのでウインドウをすべて閉じてquitします。
モジュールをリロードする方法はあると思うが知らない。
再起動して、左ダブルクリックのノードブラウザで"camera orbit"と入力すると
さっきのノードが現れます。
(ファイル名)[tag, author]
という表示になるっぽい。
命名規則はこちら。
どうやら決まった場所にパッチを保存するとそれはモジュールになるらしい。
パッチに入出力を作るにはIOBoxに名前を付ければよろしいらしい。
http://vvvv.org/documentation/subpatches#parameters
#改造
ちょっと違う(回転中心が違う)がなんとなくそういう感じのができた。
https://gist.github.com/ousttrue/ace2c2f653d2fc99dcb2
- 右ドラッグがDistanceに結びついていたのを切った
- ホイールがFovに結びついていたのを切った
- 左ドラッグがYaw, Pitchに結びついていたのを切った
- ホイールをDistanceに接続
- 右ドラッグをYaw, Pitchに接続
#初期値積算パターン
Camera(Transform Orbit)はわりと複雑なのだが中心となるロジックは下記のようなものだった。
毎フレーム左側から供給される現在値と右側から供給されるマウスの状態による値(正もしくは負の差分値)を中央で加算して結果として使う。左側は、OnOpen(1フレーム目だけ1)とSwitch(左が使用する値のindex。0のとき左の値を使い、1の時右の値を使う)の組み合わせで1フレーム目だけ初期値を使い、以降FrameDelayに入れた足し算の結果を使う。
右側はFrameDifferenceで前のフレームとのDeltaを得て"*"で係数をかけた(とりあえず0.5とWindowの高さをかけてPixel単位にしてみた)
値を供給する。
意外とLINQとか関数型っぽいかつパワポっぽい感じ。
リンクがからまないように綺麗にレイアウトする技が必要ですな。
ということで次回はPMDローダーを作ってみるかもしれない。