1

私は C++ で、任意のポイントと任意の方向に木を「成長」させることができる 3D シーンをプログラミングしています。L-systems の木/惑星は非常に見栄えが良いと思いますが、ポイント座標、方向ベクトル、およびその他のパラメーターを渡して、その「成長した」木のポイント セットの配列を返すことができる関数またはライブラリをグーグルで検索することはできません。

開始するのに十分な情報をグーグルで検索することさえできません。したがって、このタスクを完了するために参照したり、再利用したり、調整したりできるアイデアやリンクはすべてあります。いくつかの L-sys パーサーを見つけましたが、成長する方向を制御せずにその場で描画しているように見え、全体のポイント座標も得られませんでした。

4

2 に答える 2

4

これはおそらく、いくつかのサードパーティライブラリを検索して統合しようとするよりも、自分で最初から実装する方が速い問題です。

Lシステムの実装はかなり簡単です。2つの部分を実装する必要があります。

最初の部分は文字列書き換えシステムです。簡単です。書き換えルール(charキー、文字列値)の辞書があれば、それらのルールを最初の文字列i回(iは反復回数)に適用する必要があります。

擬似コード:

map<char, string> rewriteRules = {{'L', "L+R+"}, {'R',"-L+R"}};

string rewrite(string str) {
    string result = "";
    for each (char c in str) {
        if (rewriteRules contains key c) {
            result += rewriteRules[c];
        }
        else {
            result += c; // identity
        }
    }
}

2番目の難しい部分は、シンボルの結果文字列の解釈です。カメのようなグラフィックを3Dで解釈する最も簡単な方法は、クォータニオンを使用することです。これらを組み合わせるのは簡単です。

上記の書き換えルールはドラゴン曲線を説明しており、記号の意味は次のとおりです。

  • L、R:前方に線を引く
  • +:左に90度回転します
  • -:右に90度曲がる

次のコードスニペットは、クォータニオンを使用した3Dでの移動と回転の実装を示しています。それはC#で書かれた私のLシステムインタプリタからのものです(あなたが私を許してくれることを願っています:)。

Quaternion rotationQuat = Quaternion.Indentity;
Vector3D position;

Vector3D forwardVector = new Vector3D(1, 0, 0);
Vector3D upVector = new Vector3D(0, 1, 0);
Vector3D rightVector = forwardVector.Cross(upVector);

public void Forward(double distance, bool draw) {
    Vector3D moveVector = rotationQuat.Transform(forwardVector * distance);
    Vector3D oldPosition = position;
    position += moveVector;

    if (draw) {
        // draw cylinder/box from oldPosition to (new) position
    }
}

public void Yaw(double angle) {
    rotationQuat *= new Quaternion(upVector, angle);
}

public void Pitch(double angle) {
    rotationQuat *= new Quaternion(rightVector, angle);
}

public void Roll(double angle) {
    rotationQuat *= new Quaternion(forwardVector, angle);
}

したがって、文字列を解釈するには、文字列を調べて各記号を解釈する必要があります。最も簡単な方法は、切り替えるだけです。

for each (char c in string) {
    switch(c) {
    case 'L':
    case 'R':
        Forward(10, true);
        break;
    case '+':
        Yaw(90);
        break;
    case '-':
        Yaw(-90);
        break;
    default:
        break; // do nothing
    }
}

L-システムを(3Dでも)実験したい場合は、それができる素晴らしいWebサイトhttp://malsys.czがあります(これらのC#スニペットはそこからのものです:)

Lシステムで頑張ってください!

于 2013-03-09T09:01:09.163 に答える
0

3D L-system アルゴリズムを提供するオープン ソース ライブラリを私は知りません。独自に作成する必要があると思います。

2 次元の実装から始めます。これは非常に簡単です。ウィキペディアのページは簡単な例を見るのに適した場所です。2 次元の実装が完了したら、3 番目に拡張する必要があります。

于 2013-03-07T15:40:21.480 に答える