On this page |
LinuxとMac OS Xの“named pipe”または“FIFO”(First In, First Out)を使用することができます(man -S 7 pipe
を参照)。
または、Windows, Linux, Mac OS Xのネットワーク接続(リモート接続用)を使用することができます。
入力デバイスから値を取得し、FilenameまたはNetworkポートで指定したファイルにそれらの値を出力するプログラムが必要です。 あなたが書いたプログラムは、書式化されたメッセージをそのファイルやポートに書き出し、Pipe In CHOPは、そのメッセージを読み込んで、 そのメッセージで指定されたチャンネルを作成します。
Houdiniへネットワークを繋げる ¶
他のサーバー(例えば、遠隔で実行中のHoudini Pipe Out CHOP)からネットワークデータを受信することができます。 データを送信する前に、サーバーとPipe In CHOP間で接続が確立されていなければなりません。 その接続は、SourceをPipeからNetworkへ変更することで行ないます。 チャンネルに渡す入力データを受信するためには、サーバーアドレスとポート番号を用意しなければなりません。 そのサーバーは、このCHOPが使用しているポートの接続をリスニングします。
2つのHoudiniプロセス間のリンクをセットアップするには、1つ目のプロセスのPipe Out CHOPが任意のポート(つまり、port #5010)に対して 有効(つまり接続をリスニングしている)になっている必要があります。 2つ目のHoudiniは、ネットワークアドレスを1つ目のHoudiniプロセスが動いているマシン名に設定されたPipe In CHOPを使用します。 そのネットワークポートは、サーバー(この場合、5010)と同じポートに設定してください。 ポート番号は、Pipe In CHOPとPipe OutCHOPで使用するポート番号が同じであれば、5000から10000までの任意の数値を設定することができます。 2つ以上の接続に関しては、別のポート番号を使用してください。 異なるマシン上でポート番号が同じPipe In/Out CHOPは、自動的にお互いを区別するはずです。
単にローカルプロセスからHoudiniへデータを送信したいのであれば、サーバーアドレスをlocalhost
に設定してください。
Pipe In CHOPのプログラミング ¶
Pipe In CHOPは、Houdini開発キットがなくてもCHOPのインターフェースをプログラミングできるように設計されています。
Pipe In CHOPを使えば、HoudiniはFIFO(First In, First Out)ファイルからここで記述した特別な書式の情報を読み込んで、CHOPチャンネルを作成することができます。 書式が正しい限り、Houdiniは、ジョイスティック、マイクロフォン、PuppetWorks社のハードウェアなどのデバイスを含んだソースからデータを取得することができます。
Pipe In CHOPは、2つのパラメータを持ち、3つのコマンドフォーマットを解読します。 1番目のパラメータには、読み込むファイルを指定し、2番目のパラメータは、アクティブモード(読み込み)と非アクティブモード(データの破棄)をトグルします。 サポートされているフォーマットは、以下の機能です:
-
最新のサンプルデータをアップロード
-
すべてのサンプルデータをアップロードして完全な波形を作成
-
チャンネル名をアップロード
Pipe In CHOPの使い方 ¶
このCHOPを使って情報を読み込むには、適切なフォーマットでFIFOへ書き込みする別のアプリケーションを開発しなければなりません。 以下のセクションでは、ファイルを開いてPipe In CHOPで受け取る値を書き出すためのサンプルコード(C言語)について説明しています。
FIFOファイルの開き方 ¶
Pipe In CHOPが読み込むファイルを作成するには、FIFO_NAME
という新しいFIFOを開く以下のコードを使います。
FIFO_NAME
には作成したいファイル名を設定します。
書き込みに使用する出力ストリームは、Readerがファイルに接続されるまでブロックします。
#include <sys/types.h> #include <sys/stat.h> #include <stdio.h> mode_t prev_mask; FILE *output = 0; /* 新しいFIFOを作成します */ prev_mask = umask(0); mkfifo (FIFO_NAME, 0666); umask(prev_mask); /* 書き込み用にファイルを開きます */ fprintf(stderr, "Awaiting reader of FIFO %s\n\r", FIFO_NAME); output = fopen(FIFO_NAME, "wb");
そのファイルへの書き込み方 ¶
Pipe In CHOPは、トークンと呼ばれる8バイトビッグエンディアンのデータ単位でFIFOから情報を読み込みます。 つまり、その情報はそれと同じフォーマットでファイルに書き込む必要があります。 また、コマンドの解読途中でリセットが必要な時にエスケープ文字を送信するのに適したメソッドもあります。
Note
Houdini12以前では、8バイトトークンではなく、4バイトトークンが使われていました。
リセット文字は、170
の整数値です。
このバイトを受信し、その後にゼロの値のバイトが続けば、現在の解読がリセットされます。
コマンドをリセットせずに170
の値を送信するには、Pipe In CHOPが1番目の値を無視するように
170の値の2バイトを連続で送信しなければなりません。
#define ESCAPE_CHARACTER 170 void write_byte(char b, FILE *output) { /* エスケープ文字を頭に追加する */ if (b == ESCAPE_CHARACTER) fputc(ESCAPE_CHARACTER, output); fputc(b, output); } void write_values(const char *p, int size, FILE *output) { int i; for(i=0; i<size; i++) write_byte(p[i], output); } void send_reset(FILE *output) { fputc(ESCAPE_CHARACTER, output); fputc(0, output); fputc(ESCAPE_CHARACTER, output); fputc(0, output); fputc(ESCAPE_CHARACTER, output); fputc(0, output); fputc(ESCAPE_CHARACTER, output); fputc(0, output); fflush(output); }
これらの関数を使えば、8バイトデータ(例えば、 00000001
, 3.141
,Chan
, …)をファイルに送信することができます。
リセット信号を送信するには、4つのエスケープシーケンスを8バイトに詰め込んで書き込みます。
コマンドの前にリセット信号を送信して、コマンドの終わりでFIFOをフラッシュ(書き出し)するのは、よい考えです。
int64 token; double sample; send_reset(output); /* ここでコマンドを送信する */ write_values((char *)&token, sizeof(token), output); write_values((char *)&sample, sizeof(sample), output); fflush(output);
Note
エスケープ文字(170
)の後に他の文字を送信することで、現在のコマンド解読を停止してから再度開始することができます。
170-170
シーケンスを送信すると、最初の文字が無視されて、その値が正常に送信されます。
Command Type #1: Current Values ¶
Pipe In CHOPが読み込む1番目のコマンドタイプは、最近のチャンネルデータの取得に使われます。
このチャンネルデータは、1秒あたり30サンプルのデフォルトサンプルレート、1のCHOP長さ、0
の開始位置を持ちます。
このコマンドは、いくつかのチャンネルを設定し、それらのチャンネルに関連したサンプルを読み込むことができます。
(int64) 1
コマンドタイプ。
(int64)
チャンネル数。
(double)
サンプルデータ。チャンネル毎に1サンプル。
Command Type #2: Upload ¶
解読される2番目のコマンドタイプは、フルセットのサンプルをアップロードして波形を作成するのに使われます。 トラック長を満たすために、 サンプルレート、開始位置、チャンネル数、チャンネル毎のサンプルを用意しなければなりません。 1インデックスに対するチャンネルすべてが次のインデックスに移る前に満たされるように、チャンネルサンプルをインターリーブ(交互配置)しなければなりません。
(int64) 2
コマンドタイプ。
(int64)
トラック長。
(double)
サンプルレート。
(double)
開始インデックス。
(int64)
チャンネル数。
(double)
サンプルデータ。インデックス毎のチャンネル毎の1サンプル。
Command Type #3: Channel Names ¶
このコマンドは、チャンネルを作成する前に名前を割り当てることができます。 名前は通常では文字列なので、それらの文字列が正しく解読されるように、それらの文字列を8バイトトークン(必要であれば、最後にゼロ埋め)として書き込むことが重要です。 このフォーマットでは、名前の数を設定する必要があり、その後に(8バイトトークンの数の範囲内で)名前の長さ、チャンネル毎の名前データを付けます。
(int64) 3
コマンドタイプ。
(int64)
名前の数。
名前毎に、以下のデータが読み込まれます:
(int64)
名前の長さ。名前毎に1つ。
(char*)
名前のかたまり(char[8] *
名前の長さ )
Command Type #4: Disconnect ¶
このコマンドは、Pipe In CHOPにネットワーク接続を解除させます。 このコマンドは、Pipe Out CHOPの Active パラメータがオフまたはノードがバイパスの時に、Pipe Out CHOPによって送信されます。
(int64) 4
コマンドタイプ。
追加コマンド ¶
delay refresh (int64) 5 - コマンドタイプ (int64) - 遅延させる秒数 script (int64) 6 - コマンドタイプ (int64) - スクリプト長 (char*) - スクリプトのかたまり(char[8] * スクリプト長)
コマンドの書き込み ¶
コマンドタイプ1のサンプルとして以下の関数を使えば、 Pipe In CHOPで読まれるFIFOへコマンドを送信することができます。
void send_current_values(FILE *output, int num, double *samples) { int64 token; int j; send_reset(output); /* 安全のため */ /* コマンドタイプ */ token = 1; write_values((char *)&token, sizeof(token), output); /* チャンネルの数 */ token = num; write_values((char *)&token, sizeof(token), output); /* サンプル値 */ for(j=0; j<num; j++) write_values((char *)&samples[j], sizeof(samples[j]), output); fflush(output); }
ソースコードサンプル ¶
Pipe Inアプリケーションのコンパイル可能なサンプルを以下で見つけることができます:
$HH/public/PPD.tar.Z
このプロトコルPuppetworksデバイスを使って実装されたあるデバイスと、そのドライバをproto_installアプリケーションによってインストールすることができます。
パラメータ ¶
PipeIn ¶
Source
UNIXパイプまたはネットワークポートを通じて、データをパイプインすることができます。
Filename
デバイスデータの読み込み先となるファイル。そのファイルは通常のファイルではなく、“named pipe”または“FIFO”でなければなりません。 UNIXでは、“mknod”を参照してください。
Server Address
サーバーコンピュータのネットワークアドレス。このアドレスは、'foo'や'foo.bar.com'などの標準のWWWWアドレスです。
Server Port
サーバーのネットワークポート。そのポート番号は、5000
から10000
の間で、サーバーとクライアントの接続で使用します。
Active
オンの時、CHOPは、パイプまたはサーバーから情報を受信します。 オフの時、アップデートが起こりません。 サーバーによって送信されたデータは消失しますが、パイプは、Activeが再度オンになるまでデータを記憶します。 Networkモードの場合、このパラメータをオンにすると接続が開始し、オフにすると接続が解除されます。
Reset Channels
すべてのチャンネルとデータをクリアします。
Common ¶
これらのパラメータのいくつかは、すべてのCHOPノードで利用できない場合があります。
Scope
影響を受けるチャンネルを決めるために、いくつかのCHOPにはスコープ文字列があります。
Scope 内では、パターン(例えば、*
(すべてに一致)、?
(1文字に一致))が使用可能です。
以下に可能なチャンネル名マッチングオプションの例を載せます:
chan2
単一チャンネル名に一致します。
chan3 tx ty tz
スペース区切りで4つのチャンネル名に一致します。
chan*
chan
で始まる各チャンネルに一致します。
*foot*
チャンネル名にfoot
が含まれる各チャンネルに一致します。
t?
?
は1文字に一致します。t?
はt
で始まる2文字のチャンネルに一致します。
blend[3-7:2]
指定した範囲の番号のチャンネルblend3
、blend5
、blend7
に一致します。
blend[2-3,5,13]
チャンネルblend2
、blend3
、blend5
、blend13
に一致します。
t[xyz]
[xyz]
はチャンネルtx
、ty
、tz
に一致します。
Sample Rate Match
Sample Rate Match オプションは、複数の入力CHOPのサンプルレートが異なる場合を処理します。
Resample At First Input’s Rate
1番目の入力のレートを使って他の入力を再サンプリングします。
Resample At Maximum Rate
一番高いサンプルレートに再サンプリングします。
Resample At Minimum Rate
一番低いサンプルレートに再サンプリングします。
Error if Rates Differ
異なるサンプルレートを受け入れません。
Units
Timeパラメータの単位。
例えば、秒(デフォルト)、フレーム(HoudiniのFPS)、サンプル(CHOPのサンプルレート)の単位で持続する遅延の時間の長さを指定することができます。
Note
Unitsパラメータを変更する時、既存のパラメータを新しい単位に変換しません。
Time Slice
Time Sliceはクッキングパフォーマンスを良くしメモリ使用量を少なくする機能です。慣例上、CHOPは全体のフレーム範囲のチャンネルを計算します。チャンネルをフレーム毎に評価する必要がないなら、全体のチャンネル範囲をクッキングするのは不必要です。必要なチャンネルの部分だけを計算するほうが効率的です。この部分のことを Time Slice と呼びます。
Unload
CHOPで使われるメモリをそのCHOPのクックが終わったあとにリリースして、次のCHOPにデータを渡します。
Export Prefix
Export Prefix をCHOPチャンネル名の頭に追加することで、エクスポートする場所を決めることができます。
例えば、CHOPチャンネル名がgeo1:tx
で、プリフィックスが/obj
なら、チャンネルは、/obj/geo1/tx
にエクスポートされます。
Note
Export Prefix を空白のままにすることができますが、CHOPトラック名をobj:geo1:tx
のように絶対パスの名前にする必要があります。
Graph Color
すべてのCHOPには、このオプションがあります。各CHOPにはグラフ表示用のデフォルトのカラーが割り当てられますが、 Graph Color を使ってそのカラーを上書きすることができます。Paletteには36個のRGBカラーの組み合わせがあります。
Graph Color Step
グラフがアニメーションカーブを表示し、CHOPに2つ以上のチャンネルがある時、これは、虹色のカラースペクトルを指定して、あるチャンネルから次のチャンネルへカラーを別のカラーに定義します。
See also |