2016-07-25 9 views
0

Ich habe versucht, Zahlen durch Revolution zu erzeugen, indem ich das Profil der Figur aus einer Lage lese. Ich folge den Schritten von here und anderen ähnlichen Aufgaben, aber mein Problem bleibt bestehen. Wenn ich versuche, einen Ply mit nur 2 Punkte zu drehen 36 stesps ich das, wenn ich die Röschen auf der Oberseite der cilinder Puth:Punkte drehen openGL

cilinder ply

Mein Code nach einer Änderung der Methode drehen ist:

void Figura::rotateY(int ngiros){ 
//Variables de rotacion. 
    //double alfa = 2*M_PI/ngiros; 
    int long_perfil = vertices.size(); 

    vector<_vertex3f> new_vertices; 

    cout << long_perfil << " vertices" << endl; 

    _vertex3f aux1, aux2; 
    for(int i=0; i < ngiros; i++){ 
    double alfa = (2*M_PI/ngiros)*i; 
    for(int j=0; j < long_perfil; j++){ 
     aux1 = vertices.at(j); 
     aux1._0 = (cos(alfa) * aux1._0) + (sin(alfa) * aux1._2); 
     aux1._2 = (cos(alfa) * aux1._2) - (sin(alfa) * aux1._0); 

     vertices.push_back(aux1); 
    } 
    } 

    //vertices.clear(); 
    //vertices = new_vertices; 

    //caras 
    for(int i=0; i < vertices.size(); i++){ 
    _vertex3i aux(i, i+1, i+long_perfil); 
    _vertex3i aux2(i, i+long_perfil+1, i+1); 
    caras.push_back(aux); 
    caras.push_back(aux2); 
    } 
    } 
} 

Ich kann meinen Fehler nicht finden. Etwas Hilfe ist willkommen.

Antwort

1

Es sieht so aus, als ob Sie nicht wissen, in welchem ​​Koordinatensystem Ihre ursprüngliche Kurve liegt und wie Sie eine Drehung darauf anwenden. Mit Ihrem aktuellen Code drehen Sie die Punkte nur um einen variablen Betrag, behalten sie aber alle innerhalb derselben Ebene. Das sieht man oberflächlich an: Man setzt nie einen Wert für die y-Koordinate eines der Punkte, also ist das ganze Ergebnis keine 3D-Form, sondern ganz in der y = 0-Ebene. Wie flach wie ein Pfannkuchen ...

Eine andere Sache, die Sie vorsichtig sein müssen, ist, dass Sie nicht ändern, Werte, während Sie noch den alten Wert mit sind:

 aux1._0 = (cos(alfa) * aux1._0) + (sin(alfa) * aux1._2); 
    aux1._2 = (cos(alfa) * aux1._2) - (sin(alfa) * aux1._0); 

Hier, du bist Ändern des Werts von aux1._0 in der ersten Anweisung, während die zweite Anweisung tatsächlich noch den alten Wert verwenden sollte.

Nehmen wir an, Ihre ursprüngliche Kurve befindet sich in der x/y-Ebene und Sie möchten um die y-Achse drehen. Dazu in einer schönen 3D-Form zu führen, alle x-Koordinaten der Kurve sollte positiv sein:

^y 
    | 
    |-- 
    | \ 
    | \_ 
    |  | x 
---------------> 
    |  | 
    | /
    | /
    | _/ 
    |/ 

Bild, um die z-Achse aus dem Bildschirm zeigt.

Nun dreht diese Kurve um einen gegebenen Winkel alpha um die y-Achse, verlassen wir die y-Koordinate unverändert und drehen, um den Punkt (x, 0) durch alpha innerhalb der XZ-Ebene Erhalte die neuen Werte für x und z. Die neuen Koordinaten (x 'y', z ') für Eingangspunkt (x, y) der Form sind, dann:

x' = x * cos(alpha) 
y' = y 
z' = x * sin(alpha) 

Als eine modifizierte Version des Codes:

for(int i=0; i < ngiros; i++){ 
    double alfa = (2*M_PI/ngiros)*i; 
    for(int j=0; j < long_perfil; j++){ 
     aux1 = vertices.at(j); 
     aux2._0 = cos(alfa) * aux1._0; 
     aux2._1 = aux1._1; 
     aux2._2 = sin(alfa) * aux1._0; 

     vertices.push_back(aux2); 
    } 
}