# OpenGl Normalenvektor berechnung



## MiMi (21. März 2008)

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

```
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

```
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:

```
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:

```
glBegin(GL_LINES);
        glVertex3fv(  &points[ faces[ 0 ]*3 ] );
        glVertex3fv( n );
    glEnd();
```
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


----------



## MiMi (22. März 2008)

Hm, nen Tipp wäre auch schon hilfreich


----------



## Sokrates3D (1. April 2008)

Hast du aber glück gehabt letzte woche habe ich es in meinem code auch programmiert.

void MainWindow::normCrossProd(float u[3], float v[3], float out[3]) {

    ut[0] = u[1] * v[2] - u [2] * v[1];

    out[1] = u[0] * v[2] - u [2] * v[0];// Hier liegt der Fehler. richtig wäre u[2] * v[0] - u [0] * v[2];                                            // Es ist ganz tipisch für normalenvektoren. 

    out[2] = u[0] * v[1] - u [1] * v[0];



    normalize(out);

}
Ahhhhhh Lineare Algebra 
Programmierst du mit Open GL? Wenn ja, ist OpenGl Freeware oder liegt unter GPL? Kennst du irgend ein gutes Tutorial?
Kriege ich eine gute Bewertung wenn es stimmt?


----------



## Online-Skater (1. April 2008)

@Sokrates Hinweis: Hier gibt es so Code-Blöcke statt CODE schreibt man dann Cpp für c++ Formatierung 

Einsteiger OpenGL Tutorial hier


----------



## MiMi (6. April 2008)

Danke für wenigstens eine Antwort. Aber das bringt mich noch net wirklich weiter. Weil wie man sieht berechne ich nur die Normale eines Triangles. Ich weiss aber net wie ich die Normalen aller Triangles berechnen kann, bzw wie ich an die points komme ich schreib sie ja extra nochma in die Brechnung rein dabei könnt ich sie auch direkt vom model holen. Aber das klappt net wirklich 

Ja ich programmier in opengl ^^ es gibt haufenweise guter tutorials. Willst du was mit GLUT machen ist es sehr einfach was zu finden, wills tdu jedoch was mit FLTK machen, wirds schwieriger.

http://www.opengl.org/resources/code/samples/redbook/

http://www.codeworx.org/opengl_tuts.php

http://www.swiftless.com/tutorials/opengl/opengltuts.html

etc etc etc  einfach mal bei google suchen nach OpenGl tutorial


----------

