[opengl/glut]falsche schattierung



  • omg wird gemacht, komm heut aber nimmer dazu
    danke wenns hilft 😉



  • also jetzt hab ich das getan,
    jetzt sind die normalenvektoren offenbar unterschiedlich lang...

    aber falsch schattiert ist das ganze immernoch...

    hier wieder ein bild:

    http://www.manueldewald.de/fehler4.jpg

    der jetzige quelltext zum berechnen:

    ObjektVektor Objekt::normalisiere(ObjektVektor objV){
    	GLfloat laenge=sqrt(pow(objV.getX(),2)+pow(objV.getY(),2)+pow(objV.getZ(),2));
    
    	ObjektVektor normalisiertObjV(objV.getX()/laenge,objV.getY()/laenge,objV.getZ()/laenge);
    	return normalisiertObjV;
    }
    void Objekt::calcNormalVertices(){
    	normalVertices=new ObjektVektor[numNormalVertices];
    	for(int i=0;i<numNormalVertices;i++){
    	 ObjektVektor objV,vec1,vec2,vec3;
    		if(i%3!=0 && i!=0 && (i+1)%3!=0){
    			vec1=vertices[i];
    			vec2=vertices[i+1];
    			vec3=vertices[i-1];
    		}else if(i==0 || i%3==0){
    			vec1=vertices[i];
    			vec2=vertices[i+1];
    			vec3=vertices[i+2];
    		}else{ //(i+1)%3==0 um warnings zu vermeiden ohne else if();
    			vec1=vertices[i];
    			vec2=vertices[i-2];
    			vec3=vertices[i-1];
    		}
    		ObjektVektor vec4=normalisiere(substrahiereVektoren(vec1,vec2));
    		ObjektVektor vec5=normalisiere(substrahiereVektoren(vec1,vec3));
    		objV=kreuzProdukt(vec4,vec5);
    
    		//GLfloat laenge=sqrt(pow(objV.getX(),2)+pow(objV.getY(),2)+pow(objV.getZ(),2));
    
    		//ObjektVektor normalisiertObjV(objV.getX()/laenge,objV.getY()/laenge,objV.getZ()/laenge);
    		normalVertices[i]=objV;
    	}
    	int x=0;
    	cout << "Errechnen  der Vertices: " << endl;
    	cout << x << ": " << normalVertices[x].getX();
    	    	cout << ", " << normalVertices[x].getY();
    	    	cout << "," << normalVertices[x].getZ() ;
    	    	cout << endl;
    
    	gibAusNormalenvektor(0);
    }
    

    hier die koordinaten der errechneten Normalenvektoren, vllt fällt jemand da ein fehler auf:

    Normalenvektor Nr 0: 0, 0,0
    Normalenvektor Nr 1: 0, 0,-1
    Normalenvektor Nr 2: 0, 0,-0.5
    Normalenvektor Nr 3: -0, 0,-0.5
    Normalenvektor Nr 4: 0, 0,0
    Normalenvektor Nr 5: 0, 0,-1
    


  • ok, folgende neue erkenntnis:

    http://www.manueldewald.de/fehler5.jpg

    ich hab mal ein einzelnes Dreieck losgeschickt.

    Die schwarze ecke davon (schwer zu erkennen im bild)
    hat offenbar keinen normalenvektor.
    es wird zumindest keiner gezeichnet.

    Normalenvektor Nr 0: 0, 0,0
    Normalenvektor Nr 1: 0, 0,-1
    Normalenvektor Nr 2: 0, 0,-0.5
    

    kann ja eigentlich nur normalenvektor nr 0 sein oder?

    also berechne ich wohl was falsch... fällt jemand was auf?



  • keiner eine idee???



    1. Normalenvektoren sollten die Länge 1 haben! -> Normalisiere zum Schluss!(OBJV)
    2. Ein Nullvektor entsteht bei einem Kreuzprodukt zwischen zwei Vektoren die linear abhängig sind! Das sollte bei einem Dreieck, dass nicht zu einer Linie degeneriert ist, nie der Fall sein! -> Überprüfe deine Berechnung von Vec1-5 (Debugger)!!!

    Für dein(e) Dreieck(e) sollten alle Normalenvektoren identisch sein!!!!



  • wie alle identisch sein...
    hmm was mach ich denn dann falsch?

    die dreiecke (siehe oben) sind dreieckig und nicht zu geraden abgestiegen...



  • also ich hab gerade herausgefunden, dass mein kreuzprodukt nicht richtig funktioniert.

    hier der code

    ObjektVektor Objekt::kreuzProdukt(ObjektVektor vec1, ObjektVektor vec2){
    GLfloat normalenVektor[3];
    	normalenVektor[0]=(vec1.getY() * vec2.getZ())-(vec1.getZ() * vec2.getY());
    	normalenVektor[1]=(vec1.getZ() *vec1.getX())-(vec1.getX() * vec2.getZ());
    	normalenVektor[2]=(vec1.getX() * vec2.getY())-(vec1.getY() * vec1.getX());
    
    	ObjektVektor erg(normalenVektor[0],normalenVektor[1],normalenVektor[2]);
    	return erg;
    }
    

    meiner meinung nach absolut richtig...

    weiß da jemand nen fehler ?



  • DaHunger schrieb:

    also ich hab gerade herausgefunden, dass mein kreuzprodukt nicht richtig funktioniert.

    hier der code

    ObjektVektor Objekt::kreuzProdukt(ObjektVektor vec1, ObjektVektor vec2){
    GLfloat normalenVektor[3];
    	normalenVektor[0]=(vec1.getY() * vec2.getZ())-(vec1.getZ() * vec2.getY());
    	normalenVektor[1]=(vec1.getZ() *vec!!2!!.getX())-(vec1.getX() * vec2.getZ());
    	normalenVektor[2]=(vec1.getX() * vec2.getY())-(vec1.getY() * vec!!2!!.getX());
    	                                   
    	ObjektVektor erg(normalenVektor[0],normalenVektor[1],normalenVektor[2]);
    	return erg;
    }
    

    meiner meinung nach absolut richtig...

    weiß da jemand nen fehler ?

    Ich hab mal Ausrufezeichen um deinen C&P Fehler gemacht! 😉



  • ui wie doof

    da steht ein paar mal vec1 wo vec2 hingehört ^^

    richtig gehört die funktion also so:

    ObjektVektor Objekt::kreuzProdukt(ObjektVektor vec1, ObjektVektor vec2){
    	GLfloat normalenVektor[3];
    	normalenVektor[0]=vec1.getY() * vec2.getZ()-vec1.getZ() * vec2.getY();
    	normalenVektor[1]=vec1.getZ() * vec2.getX()-vec1.getX() * vec2.getZ();
    	normalenVektor[2]=vec1.getX() * vec2.getY()-vec1.getY() * vec2.getX();
    
    	ObjektVektor erg(normalenVektor[0],normalenVektor[1],normalenVektor[2]);
    	return erg;
    }
    

    falls es jemand interessiert 😉

    EDIT:
    oh hab die 3. seite nich entdeckt und auch den fehler gefunden danke ^^



  • jetzt is alles richtig schattiert

    Person ich;
    ich.swear("Ich werde nie wieder copy und paste benutzen.");
    

Anmelden zum Antworten