Erstellen Sie eine Fraktale Struktur in opengl
- Mit ein wenig Mühe schaffen eine Fraktale in opengl. Hier ist meine aktuelle code
void generateTree(){
Point3f startPoint({0.0f,0.0f,0.0f});
Point3f endPoint({1.0f,0.0f,0.0f});
float rotation = 90.0f;
glutWireSphere(0.05, 4, 4);
_generateTreeBranches(startPoint,1.0f,rotation,0);
}
void _generateTreeBranches(const Point3f& newPosition,
float length,
float rotation,
const int depth)
{
if(depth > MAX_DEPTH) return;
cout << "at depth = " << depth << endl;
if(depth == 0){
glColor3f(1.0f,1.0f,1.0f);
}else if(depth == 1){
glColor3f(1.0f,0.0f,0.0f);
}else{
glColor3f(0.0f,1.0f,0.0f);
}
glTranslatef(newPosition.x,newPosition.y,newPosition.z);
glRotatef(rotation, 0.0f, 0.0f, 1.0f);
drawLine(length);
glRotatef(-rotation, 0.0f, 0.0f, 1.0f);
glTranslatef(-newPosition.x,-newPosition.y,-newPosition.z);
const float newLength = length * BRANCH_LENGTH_DECREASE_FACTOR;
int nextDepth = depth + 1;
Point3f nextPosition = {newPosition.x+length, newPosition.y, newPosition.z};
float leftRotation = rotation + CHILD_BRANCH_ANGLE * nextDepth;
_generateTreeBranches(nextPosition,newLength,leftRotation,nextDepth);
float rightRotation = rotation - CHILD_BRANCH_ANGLE * nextDepth;
_generateTreeBranches(nextPosition,newLength,rightRotation,nextDepth);
}
Die Positionierung nicht korrekt ist, obwohl die rotation scheint richtig zu sein. Die neuen Filialen sind nicht " zeichnen Sie, beginnend am Endpunkt der übergeordneten Zweig. Kann mir jemand helfen, über die Festsetzung dieses problem. Schauen Sie sich die vollständige code hier
Ich kann sehen, dass Sie sich auf das stapeln von glTranslatef und glRotatef Funktionen durch rekursive Aufrufe, um Ihre Fraktale Struktur. Das ist schlecht, denn es ist nicht immer offensichtlich, was das endgültige Ergebnis sein würde, und sehr einfach, Fehler zu machen. Ich würde empfehlen, dass Sie die Berechnung für die rotation und translation der aktuelle Zweig mathematisch, und wenden Sie ein einzelnes paar von glRotatef+glTranslatef einmal auf jedem Zweig mit glPushMatrix/glPopMatrix zurücksetzen die nächste Filiale. Weniger Verwirrung und mehr mathematisch korrekt.
Hey danke für die Hilfe. Ich habe versucht zu vermeiden, die manuelle Berechnung, und lass opengl die Arbeit zu tun, aber für diesen Fall ist es wahrscheinlich besser und einfacher zu Lesen, wenn ich es manuell
Hey danke für die Hilfe. Ich habe versucht zu vermeiden, die manuelle Berechnung, und lass opengl die Arbeit zu tun, aber für diesen Fall ist es wahrscheinlich besser und einfacher zu Lesen, wenn ich es manuell
InformationsquelleAutor dchhetri | 2012-10-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Formel für nextPosition ist falsch, da hat es keine Rolle in welche Richtung der aktuelle Zweig vor
Es sollte so etwas wie dies (bitte genau prüfen):
Bitte auch verwenden glLoadIdentity() ein reset der matrix sofort wie diese:
Wird es viel klarer als das, was Sie zu tun versuchen.
InformationsquelleAutor ksming