vertices einer Kugel berechnen



  • Ich habe jetzt schon Erfahrung mit 3D Prgrammierung gemacht und habe jetzt ein warscheinlich kleines Problem... 👎

    Das Problem ist, dass ich die Koordinatenpunkte einer Kugel mit einer Formel
    berechnen möchte, und da ich die besagte Formel nicht kenne ist das nicht so gut. 😃
    Ich möchte das ganze aber ohne memcpy() machen. Aber das ist ja kein problem.
    ⚠ Das Ganze sollte aber auch ohne memcpy laufen. ⚠

    hoffe auf schnelle Antwort
    FuM4nnSchU



  • guck dir mal den artikel hier an: http://de.wikipedia.org/wiki/Kugelkoordinaten

    interessant sind für dich die in kartesische koordianten rückstransformierten x, y und z (ende abschnitt "übliche konvention").

    r ist der radius deiner kugel. wenn du nun über theta und phi iterierst, bekommst du eine beliebig dichte menge von oberflächenpunkten. der mittelpunkt der kugel ist dann (0,0,0), kann also leicht an die entsprechende stelle translatiert werden.

    p.s.: wenn du kein memcpy benutzen willst (😕 warum?), dann pack dir die koordinaten halt in nen vector oder so 😉



  • Geht es dir nur um die Punkte oder brauchst du sie auch noch in der richtigen Reihenfolge (weil du gefüllte Flächen haben möchtest)?

    Ein recht einfacher Algo ist, dass du dir eine Funktion schreibst, die Punkte eines Kreises vom Radius r liefert.

    Diese Funktion rufst du dann ein paar mal auf wobei du den Radius passend änderst. (Sin/Cos Beziehung für x/y)
    So baust du deine Kugel schichtweise von unten nach oben auf.



  • Erstmal danke thordk. Hat mich schon weiter zum Ziel gebracht.

    @SeppSchrot: könntest du mir vllt. eine Funktion dazu schreiben?
    Wäre dir sehr dankbar.

    FuM4nnSchU



  • Nimm dir einen beliebigen Körper (ja, soll mir fast allem gehen imho)
    Teile jedes Dreieck des Körpers in 2 Dreiecke und projeziere sie auf den Rand der Kugel, das ganze machst du Rekursiv, ist super schnell und besser als ein sin/cos Verfahren.



  • ChaosAngel schrieb:

    Nimm dir einen beliebigen Körper (ja, soll mir fast allem gehen imho)
    Teile jedes Dreieck des Körpers in 2 Dreiecke und projeziere sie auf den Rand der Kugel, das ganze machst du Rekursiv, ist super schnell und besser als ein sin/cos Verfahren.

    Versteh ich nicht. Wieso kann ich da irgend einen Körper nehmen? Und wie komm ich auf die Dreiecke des Körpers? Wie projiziere ich (es gibt nicht DIE Projektion)?



  • @ChaosAngel: Verstehe ich auch nicht wirklich vllt. kannst du es nochmal erklären... 😕



  • So weit bin ich allein gekommen,
    ist der Ansatz wenigstens richtig?

    Wenn ja könntet ihr mir ja mal sagen wo der Fehler ist.

    //g_dwAnzahl ist die Menge der Dreiecke auf einer Achse
    //Ich arbeite mit TriangleStrips
    for( DWORD i=0; i<g_dwAnzahl; i++ ) {
    	FLOAT theta1 = (2*D3DX_PI*i)/FLOAT(g_dwAnzahl);	
    	FLOAT theta2 = (2*D3DX_PI*(i+1))/FLOAT(g_dwAnzahl);
    
    	for( DWORD j=0; j<g_dwAnzahl; j++ ) {
    		FLOAT theta3 = (2*D3DX_PI*j)/FLOAT(g_dwAnzahl);
    
    		pVertices[i*g_dwAnzahl*2+j*2].position		= D3DXVECTOR3( sinf(theta3)*2, cosf(theta1)*20	, cosf(theta3)*2 );
    		pVertices[i*g_dwAnzahl*2+j*2].normal		= D3DXVECTOR3( sinf(theta3)*2, cosf(theta1)*20	, cosf(theta3)*2 );
    		pVertices[i*g_dwAnzahl*2+j*2+1].position		= D3DXVECTOR3( sinf(theta3)*2, cosf(theta2)*20	, cosf(theta3)*2 );
    		pVertices[i*g_dwAnzahl*2+j*2+1].normal		= D3DXVECTOR3( sinf(theta3)*2, cosf(theta2)*20	, cosf(theta3)*2 );
    	}
    }
    


  • void Sphere::triangleTessellation()
    {
        assert(tessellation >= 0);
    
        // sonst ist die Tessellation zu fein, ggf. diese Zeilen entfernen
        // oder die Konstante erhoehen
        if (tessellation > 7)
        {
            cerr << "Zu feine Tessellation, zu hoher Rechenaufwand." << endl;
            return;
        }
    
        // alte Daten loeschen
        sphere.clear();
    
        // Tessellionsverfahren 2 (Tetraeder/rekursive Zerlegung)
        // Hinweis: Erzeugen Sie Dreiecke und speichern Sie diese im Array "sphere":
        //          sphere.push_back(Triangle(pointA,pointB,pointC));
    	if(tessellation == 0)
    		return;
    
        // Ecken des Tetraeders (da der Radius 1 ist, muss er nicht weiter beachtet werden)
        Vector pointA(-1,-1,-1); pointA.normalize();
    	Vector pointB(1,1,-1);   pointB.normalize();
        Vector pointC(-1,1,1);   pointC.normalize();
        Vector pointD(1,-1,1);   pointD.normalize();
    
        // mit den 4 Seiten des Tetraeders die Tessellation beginnen
    	recursiveSubdivision(Triangle(pointA,pointB,pointC), tessellation-1);
    	recursiveSubdivision(Triangle(pointA,pointB,pointD), tessellation-1);
    	recursiveSubdivision(Triangle(pointA,pointC,pointD), tessellation-1);
    	recursiveSubdivision(Triangle(pointC,pointB,pointD), tessellation-1);
    }
    
    /// Dreieck in vier Teildreiecke zerlegen bis recursions==0, dann Array sphere hinzufuegen
    void Sphere::recursiveSubdivision(const Triangle& triangle, unsigned int recursionsLeft)
    {
        assert(recursionsLeft >= 0);
    
    	// Ende der Rekursion
    	if(recursionsLeft == 0) {
    		sphere.push_back(triangle);
    		return;
    	}
    
        // Ein Dreieck in vier Dreiecke zerlegen und neue Ecken auf Kugel projizieren
    	Vector pointA = 0.5 * (triangle.a + triangle.b); pointA.normalize();
    	Vector pointB = 0.5 * (triangle.a + triangle.c); pointB.normalize();
    	Vector pointC = 0.5 * (triangle.c + triangle.b); pointC.normalize();
    
        // Rekursiv selbstaufrufen (Dreiecke erneut zerlegen)
        recursiveSubdivision(Triangle(pointA,pointB,pointC), recursionsLeft-1);
    	recursiveSubdivision(Triangle(pointA,pointB,triangle.a), recursionsLeft-1);
    	recursiveSubdivision(Triangle(pointA,pointC,triangle.b), recursionsLeft-1);
    	recursiveSubdivision(Triangle(pointC,pointB,triangle.c), recursionsLeft-1);
    }
    

    So, den Rest kann man sich selber zusammen reimen ... isn Ausschnitt aus na ComputerGrafik Hausaufgabe ...

    Ansonsten gabs dazu igrendwo n Wiki beitrag, vielleicht mal nach sphere tesselation oder so suchen ...


Anmelden zum Antworten