お世話になっております。
初めて投稿させていただきます。
実現したいことを簡略化して表現しています。
Forループを用いて、「1ステップ前のpointの位置」を取得して相対的に位置を加算したpointを新たに作成し、
それらを繰り返し連結してlineを作成しようとしています。
For-Eachで挟んでpointによる点の取得、addpointによる新規pointの追加、addprimによる連結を実現することはできた(picture01)のですが、
これを単一Wrangle内でFor文を用い、setpointattribで明示的に位置アトリビュートを付与しているつもり(picture02)なのですが
point(geoself(), “P”, i) 部分がうまく機能していないようで。。
どうしてこうなってしまうのか、単一Wrangle内で同様のことを実現するにはどうすればよいか知りたいです。
どうぞよろしくお願いいたします。
単一Wrangle内での連続的なpointの追加とその参照方法について
4080 4 2- shin_t_o_
- Member
- 10 posts
- Joined: March 2017
- Offline
- Ran Sato
- 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); }
- shin_t_o_
- Member
- 10 posts
- Joined: March 2017
- Offline
- sho
- Member
- 45 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・ループ内で自由に作成・変更・参照できるので将来的には可能になるかもしれませんね。
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・ループ内で自由に作成・変更・参照できるので将来的には可能になるかもしれませんね。
- shin_t_o_
- Member
- 10 posts
- Joined: March 2017
- Offline
-
- Quick Links