単一Wrangle内での連続的なpointの追加とその参照方法について

   577   4   2
User Avatar
Member
5 posts
Joined: March 2017
Offline
お世話になっております。
初めて投稿させていただきます。

実現したいことを簡略化して表現しています。
Forループを用いて、「1ステップ前のpointの位置」を取得して相対的に位置を加算したpointを新たに作成し、
それらを繰り返し連結してlineを作成しようとしています。

For-Eachで挟んでpointによる点の取得、addpointによる新規pointの追加、addprimによる連結を実現することはできた(picture01)のですが、
これを単一Wrangle内でFor文を用い、setpointattribで明示的に位置アトリビュートを付与しているつもり(picture02)なのですが
point(geoself(), “P”, i) 部分がうまく機能していないようで。。

どうしてこうなってしまうのか、単一Wrangle内で同様のことを実現するにはどうすればよいか知りたいです。
どうぞよろしくお願いいたします。

Attachments:
picture01.PNG (217.0 KB)
picture02.PNG (170.7 KB)

User Avatar
Member
4 posts
Joined: Oct. 2017
Offline
この場合point()はうまく動作しないので,
前のポイントを参照せず
addpoint(geoself(), 0);
setpointattrib(geoself(), 'P', 0, {0, 0, 0}, 'set');

vector pos = {0, 0, 0};
for(int i = 1; i < 10; i++){
    pos += {0, 0, 1};
    addpoint(geoself(), i);
    setpointattrib(geoself(), 'P', i, pos, 'set');
    addprim(geoself(), 'polyline', i-1, i);
}


もしくはあまりキレイではないですが,位置の配列を作成して
vector pos_array[] = {{0, 0, 0}};
addpoint(geoself(), 0);
setpointattrib(geoself(), 'P', 0, pos_array[0], 'set');

vector pos;
for(int i = 1; i < 10; i++){
    pos = pos_array[i-1] + {0, 0, 1};
    addpoint(geoself(), i);
    setpointattrib(geoself(), 'P', i, pos, 'set');
    addprim(geoself(), 'polyline', i-1, i);
    append(pos_array, pos);
}
とかだとうまく行くかと思います.
User Avatar
Member
5 posts
Joined: March 2017
Offline
アドバイス頂いた方法でやりたいことも実現できました!

pointを使わずとも格納するvectorを更新すれば良かったのですね。
何に格納出来て何が呼びだせるのか混乱していたので助かりました、ありがとうございました。
Edited by shin_t_o_ - June 24, 2019 12:43:19
User Avatar
Member
35 posts
Joined: July 2005
Offline
何に格納出来て何が呼びだせるのか混乱されているとのことですが、shin_t_o_さんのコードが動かないのは単にpoint()関数の勘違いによるものかと思います。

point(geoself(), “P”, i) とされていますが、geoself()はジオメトリハンドルとしてのintを返しますが、point()の第1引数がintの場合はノードのインプット番号の意味になるので、setpointattrib(geoself(),,)でセットしたポイントとは全く別のジオメトリを参照していることになります。
インプットにポイントが無いので常にposに{0,0,0}が入っています。
そもそもpoint()をはじめほとんどの関数は、自身のWrangleノードのジオメトリを参照できません(インプットかファイルのみ)。

では、ジオメトリハンドルを使って現在変更中のポイントアトリビュートを参照できる関数があるのかというと、実は未だ実装されていません。

VEXではもともと新しくポイントやプリミティブを作ることは出来ず、インプットジオメトリの変更のみ可能だったのですが、Wrangle(CVEX)からジオメトリの作成が可能になりました。ただ、その場合、簡単に無限ループに陥ってしまうので、Wrangle開発時にgeohandleを介してポイントの作成&変更ができるようにしました。
geohandleはメモリ内に存在する仮想ジオメトリ(を示すポインタ)のようなもので実体はなく、Wrangleの最後に実体としてのジオメトリを作成します。

ただ、point cloudはgeohandleと同じようにhandeを介して、Wrangle・ループ内で自由に作成・変更・参照できるので将来的には可能になるかもしれませんね。
User Avatar
Member
5 posts
Joined: March 2017
Offline
すみません、反応が遅れました。。
ご指摘頂きありがとうございます!

引数が参照(int)か自身(geoself())か、という単純な話ではなかったのですね。
雑に解釈してしまっていました。

たしかにその経緯を考えれば変更中のアトリビュート参照は混乱のもとになりますね。。
これを機にもう一度pointのドキュメントを読み返してみます。
ありがとうございます。
  • Quick Links