1

線で構成される再帰的なツリーを生成しようとしています。現在の抽選機能が予定どおりに機能していません。ここで問題を示す前に、描画コードを示します。

void _generateTreeBranches(const Point3f& startPoint,
                       const Point3f& endPoint,
                       float rotation,
                       const int depth)
{

 if(depth > MAX_DEPTH) return;
cout << "at depth = " << depth << endl;

if(depth == 0)glColor3f(0.0f,1.0f,0.0f);
else glColor3f(1.0f,1.0f,1.0f);

float distanceOfPoint = pointDistance(startPoint, endPoint);


glRotatef(rotation, 0.0f, 0.0f, 1.0f);
glTranslatef(-startPoint.x, 0.0f, 0.0f);
    drawLine(startPoint, endPoint);
glTranslatef(startPoint.x, 0.0f, 0.0f);
glRotatef(-rotation, 0.0f, 0.0f, 1.0f);

const float nextLength = distanceOfPoint;
Point3f nextBranchStart = endPoint;
Point3f nextBranchEnd = {endPoint.x + nextLength,endPoint.y,endPoint.z};
_generateTreeBranches(nextBranchStart, nextBranchEnd,45.0f,depth+1);

それはこのようなものを描きます

 /__

一方、私はそれをそのようなものに描こうとしています

__/

上記を達成するための助けはありますか?

4

1 に答える 1

1

呼び出しポイントでのモデルビュー マトリックスの状態がわからないので、MV と呼びましょう。

最初の呼び出し (行列演算の順序)

T = -x で移動
R = r で回転
TRANSFORMATION = MV(R(T(v)))
DRAW

2 回目の呼び出し (行列演算の順序)

T = -x2 で平行移動
R = r2 で回転

最初の呼び出しから開始
Rm1 = -r で回転
Tm1 = x で
移動 Tm2 = -x
で移動 Rm2 = r で回転
END FROM FIRST CALL

変換 = MV(Rm2(Tm2(Tm1(Rm1(R(T(v)))))))
DRAW

ご覧のとおり、変換された値と回転された値を回転させています。その後、元に戻すことができなくなったものを元に戻そうとしています。

したがって、MV と r の値に応じて、あらゆる種類のことが起こる可能性があります。

マトリックス操作を元に戻したい場合は、最良の場合と再帰的な場合に表示される浮動小数点エラーを生成する操作の逆ではなく、glPush/PopMatrix を使用します。

あなたがやろうとしていることは、最初の回転が0であるべきであり、モデルビューマトリックスがアイデンティティであることを確認し、glPush/PopMatrixを使用する必要があります

また、実際のコードで実際に再帰が必要でない限り、ループを使用してください。

于 2012-10-30T10:25:20.477 に答える