4

最新の OpenGL で 3D フラクタル ツリーを描画する方法が必要です。助言がありますか?

必ずしも完全なソース コードを必要とするわけではありません。

私がやろうとしているのは、3D ツリーを作成することです。固定機能の OpenGL では、見栄えの良い現実的なツリーを描画することはそれほど難しくありませんが、最新の OpenGL でそれを行う方法がわかりません。

ブランチごとに円柱モデルを使用し、それを使用glmして適切な場所とサイズに変換することをお勧めします。この場合、モデルのテクスチャ座標と法線を使用できるためです。やり方がわからない。

これは、再帰を使用して固定関数 OpenGL で作成されたフラクタル 2D ツリーです。興味のある方は、ソース コード全体を送信できます。

void drawTree(int currentDepth, int maxDepth)
{
    if (currentDepth > maxDepth)
        return;

    if (currentDepth <= maxDepth - 2)
    {
        glColor3d(0.45, 0.2, 0.05);
        glLineWidth(10 * static_cast<GLfloat>(pow(TREE_FACTOR, currentDepth)));
    }
    else
    {
        glColor3d(0, 0.5, 0);
        glLineWidth(30 * static_cast<GLfloat>(pow(TREE_FACTOR, currentDepth)));
    }

    double lineLen = TREE_LINE_BASE_LEN * pow(TREE_FACTOR, currentDepth);
    glBegin(GL_LINES);
    glVertex2d(0, 0);
    glVertex2d(0, lineLen);
    glEnd();

    int angle1 = 10 + rand() % 40;
    int angle2 = 10 + rand() % 40;

    glTranslated(0, lineLen, 0);
    glRotated(-angle1, 0, 0, 1);
    drawTree(currentDepth + 1, maxDepth);
    glRotated(angle1 + angle2, 0, 0, 1);
    drawTree(currentDepth + 1, maxDepth);
    glRotated(-angle2, 0, 0, 1);
    glTranslated(0, -lineLen, 0);
}

VAO、VBO、およびシェーダーを使用して、最新の OpenGL でこのようなものを作成するにはどうすればよいですか?

ここに画像の説明を入力

4

1 に答える 1

2

クイックアイデア。

void SudoCreateChild(const mat4x4& m2w_noscale, const int depth)
{
    if(depth>=MAX_DEPTH){
        return;
    }
    /// Creates the M2W matrix
    mat4x4 m2w=m2w_noscale * mat4x4::identity*(1/depth);
    /// Draw the branch
    DrawCylinder(m2w);
    /// Create the children branches
    for(int i=0; i<CHILDREN_NUMBER; ++i){
        float angle=(2.0f*PI/CHILDREN_NUMBER)*i;
        /// Initial rotation of PI/4 plus equal rotation between siblins
        mat4x4 rotation=mat4x4::rotate(angle, vector3(0,1,0))*mat4x4::rotate(PI*0.25, vector3(1,0,0))
        /// Size of the branch is 1/depth
        mat4x4 translation=mat4x4::translate(vector3(vector3(0,1,0)*(1/(depth+1))));
        /// Recursively create the branches
        SudoCreateChild(m2w_noscale*translation*rotation, depth+1);
    }
}

int main(void)
{
    SudoCreateChild(mat4x4::identity, 1);
    return 0;
}
于 2016-03-30T14:58:43.967 に答える