ANT+のサイクルコンピュータとQuartz composerを連携して、サイクルシミュレータっぽいものが出来ないかとチャレンジしてみました。
•概要
ANT+のセンサーの値をPC上でリアルタイムで読める、quarqd というユーティリティーがあります。
GoldenCheetah という自転車乗り向けのトレーニング管理のフリーソフトから生まれたものとのこと。
mac本体にANT+が受信できるUSBデバイスを指して、quarqd を介して自転車につけたセンサーとデータのやりとりをします。
このデータを Quartz composer…
https://twitter.com/chaosgroove/status/288633123271487489
QuartzComposerでLineが引けなくなった。というよりバージョン上げてから初めてLine使うかもしれないから最初から??パッチは置けるのに表示されない。うーん。。
https://twitter.com/noboko/status/289004099821793280
@chaosgroove…
忌々しいLion Quartz ComposerのAuto Saveにお嘆きの皆さん。朗報です。
optionを押しながらメニューのPreferencesをクリックして隠し項目を出します。
(Lionになってからこの項目が出ないことがありますのでその時はQC再起動)
項目(Editor)内の
disableSavelessDocumentsにチェックを入れてください。
誤って上書きしてしまった全てのqtzに黙祷。
Cube内にSphereを内包しといて他のcubeと重なった時にだけ見えるみたいなの
1.パッチライブラリーの検索窓に入る cmd+return
2.インクリメンタルサーチ後↑↓キーでパッチ選択 returnで挿入。
3.パッチ選択状態(回りが黄色い)で↑↓←→でパッチ移動。shift押しながらだと大きく動く。
4.マクロパッチ内に入る。cmd+↓
5.マクロパッチから出る。cmd+↑
6.Inspectorを開く。パラメ cmd+1 セッティング cmd+2 パブリッシュ cmd+3
7.settingsを別窓で開く cmd+shift+i
QCはマウス操作が多いんですけど、この辺のショートカットを使うと結構楽だと思います。
例えばIterator内にIterator Valablesパッチを置く操作を例にとると
cmd+returnでパッチライブラリに入る。
iteraくらいまで打つとIterator見えてくるので上下キーで選択returnで挿入。
ここで既にパッチ選択状態になっているので十字キー(+shiftキー)で場所移動。
cmd+↓で内部に入る。
cmd+returnでパッチライブラリに移動。
さっき打った検索結果が残ってるのでそのまま上下キーでIterator Variables選択
returnで挿入。
といった動作をマウス無しで行なえます。

1IterationあたりCylinderを直角に2つ使いってます。
ただそれだと隙間があくのでSphereを2つ使って埋めてます。
どういう実装が一番良いのか。
たぶんIterator VariablesからIndex とIteration引っ張ってきて、値に変化があった時だけ配列を入れかえるのが良いんじゃないかと思う。
Iteration数が変った時にゴミがのこるのだけ対処してる。
var arr =[];
function (__structure str) main (__virtual val, __index ind, __index itr)
{
if(itr<arr.length) arr=[];
if(arr[ind]!==val) arr[ind]=val;
return {str:arr};
}
returnを最後だけ返すようにするのも良いような無意味なような。
var arr =[];
function (__structure str) main (__virtual val, __index ind, __index itr)
{
if(itr<arr.length) arr=[];
if(arr[ind]!==val) arr[ind]=val;
if(ind + 1 ===itr)return {str:arr};
}
色々やってみたのだけれど、明確な弱点として毎フレーム更新されるってのがあります。
Queueパッチは元々フレーム(イベント?)毎に一個ずつ値を貯めこんでいくパッチなのですが、
これをIterator内で使うことで複数個をまとめて格納しています。
なので一見数値に変化が無い場合でも毎フレーム古い値を追い出して新たに値を貯めています。
数値が常に変化するような処理ではこうしないと値が更新できないですし、Iterationが小さい時はさして問題は無いのですが、
例えばOpenCLでパーティクルを作る際の初期値としてIterator+Queueで数百〜数千のStructureを作る場合、毎フレーム更新すると動作が非常に重くなってしまいます。
こんな場合に最初の1フレーム目でStructureを作って、あとは更新しない機構が欲しくなります。
どうすればいいかというと、QueueのStructure Countを計って規定数に逹っしたら、Fillingをオフにしてやればいいです。

こうすることで、パッチを立ち上げた最初のフレームは負荷がかかりますが、以降は同じStructureを使うのでQueueの更新による負荷は無くなります。