hi,
also ich hab einen Würfel gezeichnet, hiervon möchte ich gerne die Normalenvektoren berechnen, sodass der Lichteinfall etc richtig berechnet werden kann. Nun ist mein Problem das ich schon ein Model vorliegen hab von einem Würfel und auch die Normalenvektoren berechnet hab:
Cube.cpp
Jetzt möchte ich in meiner main natürlich dadrauf zugreifen:
mainwindow.cpp
Das zeichnen funktioniert auch wunderbar. Hab auch schon getestet was die einzelnen Sachen machen, setzte ich in der for-schleife das numFaces auf 3, dann zeichnet er nur 1 dreieck. Also verständlich. Das lass ich hier auch ma so nur zum testen des Vektors.
Hab auch ein Beispiel gefunden zum berechnen der normalenvektoren, konnte das jedoch noch net komplett für mein Problem umsetzten:
Um zu testen ob der Normalenvektor richtig berechnet wurde, hab ich versucht ihn zeichnen zu lassen. Mittels:
Dies ruf ich auf, nach dem zeichnen des Dreiecks. Jedoch steht der "Vektor" ziemlich schief ?! Hier mal nen Bild:
http://www.bilder-space.de/show.php?file=JMUvkCq6utFXyrB.JPG
Gibts ne elegantere/ einfachere Lösung um die Normalenvektoren zu berechnen? Oder sieht jemand nen Fehler in meinem Code? Ich checks echt net mehr![Frown :( :(](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f641.png)
also ich hab einen Würfel gezeichnet, hiervon möchte ich gerne die Normalenvektoren berechnen, sodass der Lichteinfall etc richtig berechnet werden kann. Nun ist mein Problem das ich schon ein Model vorliegen hab von einem Würfel und auch die Normalenvektoren berechnet hab:
Cube.cpp
C++:
const float Cube::points[][3] = { { 1.0f, -1.0f, 1.0f}, { -1.0f, -1.0f, 1.0f}, { -1.0f, -1.0f, -1.0f}, { 1.0f, -1.0f, -1.0f}, { 1.0f, 1.0f, 1.0f }, { -1.0f, 1.0f, 1.0f}, { -1.0f, 1.0f, -1.0f}, { 1.0f, 1.0f, -1.0f } };
const unsigned int Cube::faces[][3] = { {0,1,2}, {0,2,3}, {6,5,4}, {6,4,7}, {3,7,4}, {3,4,0}, {0,4,5}, {0,5,1}, {3,2,6}, {3,6,7}, {1,5,6}, {1,6,2} };
Jetzt möchte ich in meiner main natürlich dadrauf zugreifen:
mainwindow.cpp
C++:
void MainWindow::drawCube(Model* model, float angle, float x, float y, float z) {
const float* points = model->getPoints();
const unsigned int* faces = model->getFaces();
int numFaces = model->numFaces()*3; //cube = 12 faces *3 = 36 faces
glPushMatrix();
glBegin( GL_TRIANGLES );
for ( int f = 0; f < 3; f++ ) {
glVertex3fv( &points[ faces[ f ]*3 ] );
}
glEnd();
glPopMatrix();
}
Das zeichnen funktioniert auch wunderbar. Hab auch schon getestet was die einzelnen Sachen machen, setzte ich in der for-schleife das numFaces auf 3, dann zeichnet er nur 1 dreieck. Also verständlich. Das lass ich hier auch ma so nur zum testen des Vektors.
Hab auch ein Beispiel gefunden zum berechnen der normalenvektoren, konnte das jedoch noch net komplett für mein Problem umsetzten:
C++:
void MainWindow::normVec (Model* model, int fNr) {
const float* points = model->getPoints();
const unsigned int* faces = model->getFaces();
float points2[][3] = { { 1.0f, -1.0f, 1.0f}, { -1.0f, -1.0f, 1.0f}, { -1.0f, -1.0f, -1.0f}, { 1.0f, -1.0f, -1.0f}, { 1.0f, 1.0f, 1.0f }, { -1.0f, 1.0f, 1.0f}, { -1.0f, 1.0f, -1.0f}, { 1.0f, 1.0f, -1.0f } };
for (int k = 0; k < 3; k++) {
// p1 - p0
d1[k] = points2[ faces[ 1 ] *3 ] [k] - points2[ faces[ 0 ] *3 ] [k] ;
// p2 - p0
d2[k] = points2[ faces[ 2 ] *3 ] [k] - points2[ faces[ 0 ] *3 ] [k] ;
}
normCrossProd(d1, d2, n);
glNormal3fv(n);
}
void MainWindow::normCrossProd(float u[3], float v[3], float out[3]) {
out[0] = u[1] * v[2] - u [2] * v[1];
out[1] = u[0] * v[2] - u [2] * v[0];
out[2] = u[0] * v[1] - u [1] * v[0];
normalize(out);
}
void MainWindow::normalize(float v[3]) {
float d = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
v[0] /= d; v[1] /= d; v[2] /= d;
}
Um zu testen ob der Normalenvektor richtig berechnet wurde, hab ich versucht ihn zeichnen zu lassen. Mittels:
C++:
glBegin(GL_LINES);
glVertex3fv( &points[ faces[ 0 ]*3 ] );
glVertex3fv( n );
glEnd();
http://www.bilder-space.de/show.php?file=JMUvkCq6utFXyrB.JPG
Gibts ne elegantere/ einfachere Lösung um die Normalenvektoren zu berechnen? Oder sieht jemand nen Fehler in meinem Code? Ich checks echt net mehr
![Frown :( :(](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f641.png)