Mesh einer Kugel berechnen. Die Tangenten machen Schwierigkeiten.



  • Hi Leute!
    Ich versuche das Mesh einer Kugel (UV-Sphere) zu berechnen.
    Allerdings scheinen die Tangenten nicht richtig zu sein, denn die Beleuchtung sieht nicht in Ordnung aus.
    Mein Ansatz ist es, die Normalen und die Tangenten mit Polarkoordinaten zu berechnen.

    Hier der Code für die Geometrie:

    for(DWORD dwY= 0; dwY < dwYRes; dwY++)
    	{
    		for(DWORD dwX= 0; dwX < dwXRes; dwX++)
    		{
    			//Index berechnen
    			DWORD i= dwX + dwY * dwXRes;
    
    			//Position in Radiant berechnen
    			float fRadH= 2 * Pi * (float)(dwX) / (float)(dwXRes - 1);
    			float fRadV=     Pi * (float)(dwY) / (float)(dwYRes - 1);
    
    			//Mit Polarkoordination die Normale berechnen
    			afNorX[i]= cos(fRadH) * sin(fRadV);
    			afNorY[i]= cos(fRadV);
    			afNorZ[i]= sin(fRadH) * sin(fRadV);
    
    			//Tangente berechnen
    			afTanX[i]= -sin(fRadH);
    			afTanY[i]= 0.0F;
    			afTanZ[i]= cos(fRadH);
    
    			//Position berechnen
    			afPosX[i]= afNorX[i] * fRadius;
    			afPosY[i]= afNorY[i] * fRadius;
    			afPosZ[i]= afNorZ[i] * fRadius;
    
    			//Texturkoordinaten
    			afTexU[i]= (float)(dwX) / (float)(dwXRes - 1) * fUVScale;
    			afTexV[i]= (float)(dwY) / (float)(dwYRes - 1) * fUVScale;
    		}
    	}
    

    Könnte jemand bitte den Fehler finden?



  • Dachte man braucht nur die Normalen ... ?



  • Für Dot3 Bump Mapping braucht man auch die Tangenten. Die Binormalen/Bitangenten werden später per Kreuzprodukt berechnet.



  • Blaze schrieb:

    Hi Leute!
    Ich versuche das Mesh einer Kugel (UV-Sphere) zu berechnen.
    Allerdings scheinen die Tangenten nicht richtig zu sein, denn die Beleuchtung sieht nicht in Ordnung aus.
    Mein Ansatz ist es, die Normalen und die Tangenten mit Polarkoordinaten zu berechnen.

    Sagen wir mal du parametrisierst die Kugel so:

    s:(ϕ,θ)(rsin(θ)cos(ϕ)rsin(θ)sin(ϕ)rcos(θ))s : (\phi , \theta) \rightarrow \left( \begin{array}{c} r\sin(\theta)\cos(\phi) \\ r\sin(\theta)\sin(\phi) \\ r\cos(\theta) \end{array}\right)

    Dann sollte das dein Normalenvektor sein:

    n=sϕ×sθ=r2((sin(θ)sin(ϕ)sin(θ)cos(ϕ)0)×(cos(θ)cos(ϕ)cos(θ)sin(ϕ)sin(θ)))\vec{n}=\frac{\partial s}{\partial \phi} \times \frac{\partial s}{\partial \theta} = r^2 \left( \left( \begin{array}{c} -\sin(\theta)\sin(\phi) \\ \sin(\theta)\cos(\phi) \\ 0 \end{array}\right) \times \left( \begin{array}{c} \cos(\theta)\cos(\phi) \\ \cos(\theta)\sin(\phi) \\ -\sin(\theta) \end{array}\right)\right)

    Dabei ist θ = fRadV und φ = fRadH. Und jetzt einfach in die obige Formel einsetzten und du hast den Normalenvektor.


Log in to reply