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

InformationsquelleAutor dchhetri | 2012-10-30

Schreibe einen Kommentar