frage zu den opengl normalen



  • hallo,

    im buch, "jetzt lerne ich opengl" werden funktionen wie glNormal3dv verwendet. diese erwartet als parameter ein double wert, genauso wie die funktion glVertex3dv. im folgendem codeauschnitt beschreibe ich NUR durch den X-wert von den Vektoren v1, v2, v3 und v4 die eckpunkte udn dennoch zeigt opengl das gewünschte bild.
    1. kann mir bitte einer sagn, woher sich opengl die y und z werte bezieht ?
    2. was macht im hintergrund die funktion glVertex3dv ???
    ermittelt sich opengl zwei gesuchte informationen (y und z) anhand der vergeben und vorher berechneten normale der ebene ... ? wenn ja, dann kommt gleich die nächste frage, woher nimmt sich opengl die y und z komponenten der normale ??

    mir ist absolut unklar wie diese glVertex3dv arbeitet.

    glBegin(GL_QUADS);
    	dVector		v1 ={4,4,1};
    	dVector		v2 ={4,0,1};
    	dVector		v3 ={0,0,1};
    	dVector		v4 ={0,4,1};
    
    		CalcNormale(&v1,&v2,&v4);
    		glNormal3dv(&m_structOGLStatus.vLastNormale.x);
    
    		glVertex3dv(&v4.x);
    		glVertex3dv(&v3.x);
    		glVertex3dv(&v2.x);
    		glVertex3dv(&v1.x);
    	glEnd();
    

    so was is passiert ?
    * normale des quadrats berechnet
    * NUR die X komponente der flächennormale übergeben
    * beschreibung der 4 eckpunkten NUR durch X komponenten ...

    wieso das so ist, ist mir absolut schleierhaft

    bool CopenGL::CalcNormale(dVector *V1, dVector *V2, dVector *V3)
    {
    	dVector		V1V2;
    	dVector		V1V3;
    	dVector		KREUZ;
    	GLdouble	betrag;
    
    	V1V2.x	= V2->x		-		V1->x;
    	V1V2.y	= V2->y		-		V1->y;
    	V1V2.z	= V2->z		-		V1->z;
    	V1V3.x	= V3->x		-		V1->x;
    	V1V3.y	= V3->y		-		V1->y;
    	V1V3.z	= V3->z		-		V1->z;
    
    	KREUZ.x	=	+((V1V2.y	*	V1V3.z)		-	(V1V2.z		*		V1V3.y));
    	KREUZ.y	=	-((V1V2.x	*	V1V3.z)		-	(V1V2.z		*		V1V3.x));
    	KREUZ.z	=	+((V1V2.x	*	V1V3.y)		-	(V1V2.y		*		V1V3.x));
    
    	betrag	= sqrt(pow(KREUZ.x,2) + pow(KREUZ.y,2) + pow(KREUZ.z,2));
    
    	if(betrag==0)
    		return false;
    
    	m_structOGLStatus.vLastNormale.x	= KREUZ.x / betrag;
    	m_structOGLStatus.vLastNormale.y	= KREUZ.y / betrag;
    	m_structOGLStatus.vLastNormale.z	= KREUZ.z / betrag;
    
    	return true;
    }
    
    typedef struct dVectorTAG {
    	GLdouble	x;
    	GLdouble	y;
    	GLdouble	z;
    }dVector;
    

  • Mod

    doomcalyptica schrieb:

    wieso das so ist, ist mir absolut schleierhaft

    dein schleier wird gelueftet wenn du rausfindest was der unterschied von glVertex3dv und glVertex3d ist und was 3 d v bedeutet.



  • erstmal danke für deien hilfe rapso.
    so v steht für vektor, d wie double und die 3 bedeutet, das drei komponenten eines vektors ausgewertet werden. glVertex3dv erwartet ein glDouble array ... mein problem ist dadurch aber nicht gelöst ^^ ... ich verstehe dadurch immer noch nicht wieso opengl alles richtig ausgeibt, obwohl ich nur x komponenten übergebe.



  • Weil zufällig die Adresse der ganzen Vektorstruktur mit ihrem ersten Element, dem x, übereinstimmt.



  • achja richtrig ... man man daran hab ich garnicht gedacht. wenn man gleich geschreiben hätte:

    glVertex3dv((const double *)&v4);
    		glVertex3dv((const double *)&v3);
    		glVertex3dv((const double *)&v2);
    		glVertex3dv((const double *)&v1);
    

    währe alles klar gewesen 😉

    danke


  • Mod

    doomcalyptica schrieb:

    wenn man gleich geschreiben hätte:

    woher haette ich wissen sollen dass es am denken scheitert? ich dachte du weiss nicht was die funktion bedeutet
    dann zahlst du auf "sie bekommt einen vector" und gleich darauf "sie bekommt nur x"... sorry, das kann der denker nicht ahnen.


Anmelden zum Antworten