void pcsampleleaf(int handle, float sample)
この関数は、pcopenlod()関数と合わせて使うことしかできず、pciterate()ループ内でのみ使うことができます。 現在の繰り返しポイントを、そのポイントの重要な部分のリーフ子孫に置換します。 リーフポイントの選択に使われる重み付けは、pcopenlod()関数の“measure”パラメータで用意された“area”チャンネルが使われます。 もし、ポイントクラウドを開く時に“area”チャンネルを指定しなかった場合はウェイトは均一になります。 sampleパラメータは、0から1の間の均一な乱数になることが必要です。
現在の繰り返しポイントが既にリーフポイントになっていたり、ポイントクラウドがpcopenlod()で開かれなかった場合は、pcsampleleaf()は何の効果もありません。
この関数は、集合ポイント情報が意味のある方法で使うことができない時に役に立ち、そして、ポイントツリー内の子ノードに含まれた情報にアクセスする仕組みがあります。 例えば、平均的なポイントポジションからシャドウレイをトレースするのは合理的ではありませんが、子ポイントのどれかを選択してから、シャドウレイをそのポイントに送信するのに役に立ちます。
サンプル: シャドウレイ ¶
// ポイントクラウドを開き、全体のクラウドを表現した単一の集合ポイントを取得します。 string texturename = "points.pc"; int handle = pcopenlod(texturename, "P", P, 8, "measure", "solidangle", "area", "A", "samples", 1, "aggregate:A", "sum", "aggregate:P", "mean"); Cf = 0; // このループは一度だけ繰り返します。 while (pciterate(handle)) { // 平均的なポイントからAを検索します。 float ptarea; pcimport(handle, "A", ptarea); pcsampleleaf(handle, nrandom()); // サンプリングしたリーフポイントからPを検索します。 vector pos; pcimport(handle, "P", pos); if (trace(pos, P-pos, Time)) Cf += ptarea / length2(P-pos); }
See also | |
file | |
ptcloud |
|