再帰関数(VEX)

   2971   5   1
User Avatar
Member
3 posts
Joined: May 2018
Offline
VEXでの再帰関数についての質問です。

Attribute Wrangleノードのなかで、ある配列を間引いて新たな配列を得るために再帰関数を使う必要があります。
しかし、公式のVEX言語リファレンスによると

>関数は、コンパイラで自動的にインラインされます。そのため、再帰関数は動作しません。再帰アルゴリズムを書くには、代わりにシェーダコールを使います。
https://www.sidefx.com/ja/docs/houdini/vex/lang.html [www.sidefx.com]

とあります。
そこで、シェーダコールのサンプル
https://www.sidefx.com/ja/docs/houdini/vex/shadercalls.html [www.sidefx.com]

>再帰シェーダ:

cvex fib(int i = 0; export int rval = 0)
{
    if (i >= 2)
    {
        int v1, v2;
        fib("i", i-1, "rval", v1);
        fib("i", i-2, "rval", v2);
        rval = v1 + v2;
    }
    else
        rval = i;
    printf("%d: %d\n", i, rval);
}

をコピペしてみても、Invalid return type(cvex) for function fibとなってしまいます。

VEXで再帰関数を使う方法をご教授願います。
User Avatar
Staff
337 posts
Joined: April 2015
Offline
シーンファイルをアップロードしていただくことは可能でしょうか?
User Avatar
Member
3 posts
Joined: May 2018
Offline
簡易的なシーンファイルを作ったので、そちらを添付します。

cvex DouglasPeucker(vector list[] = {}; float epsilon = 0; export vector rList[] = {})

では、listに元のポイントリストを、epsilonに閾値を入れ、間引きしたポイントリストrListを返すというものを想定しています。

Attachments:
recursion.hipnc (54.7 KB)

User Avatar
Staff
337 posts
Joined: April 2015
Offline
Wrangle は wrapper ですので、cvex のようなカーネルレベルの関数を使う事は出来ません。
cvex を使った例は
https://www.sidefx.com/docs/houdini/nodes/dop/popcolor.html
[www.sidefx.com] などをご覧ください。
Edited by Ken Taki - Nov. 28, 2019 09:50:41
User Avatar
Member
3 posts
Joined: May 2018
Offline
上記リンク先とcvexの関連、および再帰関数との関連がわかりませんでした。


今回解決したい課題は、あるポイントリストの配列を間引きして新たなポイントリストの配列を得るために再帰関数を使いたいというものです。


>Wrangleはwrapperですので、cvexのようなカーネルレベルの関数を使う事は出来ません。

>再帰アルゴリズムを書くには、代わりにシェーダコールを使います。

Attribute Wrangleでcvexは使えないので、シェーダコールは別のところで行うという事でしょうか?
User Avatar
Member
45 posts
Joined: July 2005
Offline
imo54さん、シェーダーコールで呼び出したい関数は、*.vflファイルに保存して、$HOUDINI_PATH内のvex/CVexフォルダに入れれば、AttributeWrangleで使うことが出来ます。

例えば、$HOME/houdini17.5/vex/CVex/DouglasPeucker.vfl
というファイルにcvex DouglasPeucker()を定義しておくと、Wrangle内で

import DouglasPeucker;

DouglasPeucker(“list”, pointList, “epsilon”, @threshold, “rList”, @DPpointList);


みたいに呼び出すことが出来ます。

サンプルを作ってみましたのでチェックしてみて下さい。
Image Not Found



一応動いているみたいですが、epsilonの値によっては挙動が変になってる気がします。。。多分僕の使い方が間違っているのかも知れません。。。

Attachments:
shader_calls.tar.gz (18.6 KB)

  • Quick Links