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.
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 einzigenglBegin/glEnd
block und die Umstellung auf vertex arrays ist auch viel einfacher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diejenigen, die keinen Sinn machen:
Durch, dass Sie die Berechnung des Kreuzprodukt der position-Vektoren. Aber was Sie eigentlich wollen, sind die cross Produkte der lokalen Unterschiede, d.h. Unterschiede.
I. e. (wave2 - wave1) × (wave3 - wave1)
d/dx a sin(b x) = a cos(x) b
)