Die Berechnung der vertex-normalen OpenGL

Ich versuche zur Berechnung der vertex-normalen für eine Welle, aber ich bin immer ein kariertes Wirkung statt des gewünschten glatten Schattierung.

Die Berechnung der vertex-normalen OpenGL

Ich bin mir nicht sicher, ob ich die übergabe des richtigen Vektor in die calcNormal() - Funktion oder wenn etwas anderes falsch ist.

Hier ist mein wave-code

Vector3 wave1(Sea::seaGrid[i][j].x, Sea::sinVals[k], Sea::seaGrid[i][j].z);
Vector3 wave2(Sea::seaGrid[i][j+1].x, Sea::sinVals[k], Sea::seaGrid[i][j+1].z);
Vector3 wave3(Sea::seaGrid[i+1][j+1].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j+1].z);
Vector3 wave4(Sea::seaGrid[i+1][j].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j].z);

Vector3 waveNorm1 = wave1.calcNormal(wave2);
Vector3 waveNorm2 = wave2.calcNormal(wave3);
Vector3 waveNorm3 = wave3.calcNormal(wave4);
Vector3 waveNorm4 = wave4.calcNormal(wave1);

//rest of wave
glBegin(GL_POLYGON);    
glNormal3f(waveNorm1.x, waveNorm1.y, waveNorm1.z);glTexCoord2f(0.0, 1.0);glVertex3f(Sea::seaGrid[i][j].x, Sea::sinVals[k], Sea::seaGrid[i][j].z);
glNormal3f(waveNorm2.x, waveNorm2.y, waveNorm2.z);glTexCoord2f(0.0, 0.0);glVertex3f(Sea::seaGrid[i][j+1].x, Sea::sinVals[k], Sea::seaGrid[i][j+1].z);
glNormal3f(waveNorm3.x, waveNorm3.y, waveNorm3.z);glTexCoord2f(1.0, 0.0);glVertex3f(Sea::seaGrid[i+1][j+1].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j+1].z);
glNormal3f(waveNorm4.x, waveNorm4.y, waveNorm4.z);glTexCoord2f(1.0, 1.0);glVertex3f(Sea::seaGrid[i+1][j].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j].z);
glEnd();

Dies ist die calcNormal() Funktion

Vector3& Vector3::calcNormal(const Vector3 &other){

Vector3 normal = crossProduct(*this, other);

//normalises vector
float vecLength = sqrt(pow(normal.x,2)+pow(normal.y,2)+pow(normal.z,2));//length();

normal.x = normal.x / vecLength;
normal.y = normal.y / vecLength;
normal.z = normal.z / vecLength;

return normal;
}

- und dies ist die crossProduct() Funktion

Vector3 Vector3::crossProduct( const Vector3 &v1,  const Vector3 &v2 )
{
Vector3 vCrossProduct;

vCrossProduct.x = v1.y * v2.z - v1.z * v2.y;
vCrossProduct.y = v1.z * v2.x - v1.x * v2.z;
vCrossProduct.z = v1.x * v2.y - v1.y * v2.x;

return vCrossProduct;
}

irgendwelche Ideen?

  • Sicherlich das normale i,j nicht ausschließlich davon abhängen, die Punkte i,j und i+1,j, ähnlich bei den anderen wave-Punkte?.
  • werden Sie sagen, dass für waveNorm1 es sollte wave4.calcNormal(wave2) statt?
  • Nicht, dass das normale am Punkt (i,j) hängt wahrscheinlich davon ab, mehr und andere Variablen als die Punkte an (i,j) und (i+1,j) und wahrscheinlich auch andere Punkte als (i+1,j) und (i,j+1), die Sie auch haben. Mit der disclaimer, dass ich vielleicht falsch verstanden, deine Frage, ich denke, vielleicht möchten Sie sich an so etwas wie en.wikipedia.org/wiki/Finite_difference_method
  • Durch die Möglichkeit, nicht zeichnen Polygone! Ziehen Sie einfach quads (GL_QUADS), oder noch besser Dreiecke (GL_TRIANGLES). So können Sie sogar wickeln die ganze Welle mesh in einem einzigen glBegin/glEnd block und die Umstellung auf vertex arrays ist auch viel einfacher.
InformationsquelleAutor Chris | 2011-11-28
Schreibe einen Kommentar