Problem mit OpenGL 3.3 [freeGLUT] [Redbook] : Würfel malen (mit Projektionsmatrix)
-
Hallo,
ich habe schon wieder ein Problem:Ich möchte einen oder mehrere Würfel malen, ABER
1. Ich habe das erste Programm im Redbook erweitert und wollte jetzt für die
Vertexe eine dritte dimension angeben.GLfloat vertices[NumVertices] [3] = { { -1.00, 0.00, 0.00 }, { 0.00, 1.00, 0.00 }, { 1.00, 0.00, 0.00 }, { -1.00, 0.00, 0.00 }, { 1.00, 0.00, 0.00 }, { 0.00, -1.00, 0.00 } };
Aber das Programm nimmt immer zwei Zahlen und nimmt diese als X und Y eines Punktes. So ergeben sich die Punkte (-1,0), (0,0), (1,0), (1,0), (0,-1) usw..
Es sollen aber die Punkte (-1,0,0), (0,1,0), (1,0,0) sein.2. Ich habe mich gefragt, wie man 2 Objekte unabhängig voneinander bewegt.
Also das man 'a' drückt und Objekt 1 fährt nach oben und 'b' drückt und Objekt 2 fährt nach links, komplett unabhängig von Objekt 1.3. Ich krieg es nicht hin, eine Projektionsmatrix einzubauen. Dann wird nichts mehr angezeigt. Es könnte sein das das wegen dem Clipping ist, aber ich habe die beiden Dreiecke auch schon nach hinten verschoben (Es könnte aber sein, dass das nichts bewirkt hat, das evtl. noch garkeine Tiefe existiert. Ich wüsste aber auch nicht wie man eine Tiefe macht.)
Hier noch der (relevante) Code:
Hier die Initialisierung mit Vertexen, Projektionsmatrix und Vertex Buffer
glGenVertexArrays(NumVAOs, VAOs); glBindVertexArray(VAOs[Triangles]); GLfloat vertices[NumVertices] [3] = { { -1.00, 0.00, 0.00 }, { 0.00, 1.00, 0.00 }, { 1.00, 0.00, 0.00 }, { -1.00, 0.00, 0.00 }, { 1.00, 0.00, 0.00 }, { 0.00, -1.00, 0.00 } }; glGenBuffers( NumVAOs, Buffers ); glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] ); glBufferData( GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW ); ShaderInfo shaders = { GL_VERTEX_SHADER, "triangles.vert", GL_FRAGMENT_SHADER, "triangles.frag" }; program = LoadShaders(shaders); glUseProgram(program); glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(vPosition); glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); t = time(0); now = localtime(&t); lastSec = now->tm_sec; frames = 0; glViewport(0, 0, 512, 512); //glEnable( GL_DEPTH_TEST ); modelMat = glGetUniformLocation( program, "transScaleRotate" ); float nearPlane = 0.1f; float farPlane = 100.0f; float width = 512; float height = 512; float fovy = 45; float aspect = 1; proj = mat4( fovy/aspect, 0 , 0 , 0 , 0 , fovy, 0 , 0 , 0 , 0 , ((farPlane+nearPlane) / (nearPlane-farPlane)), (2*farPlane*nearPlane) / (nearPlane-farPlane), 0 , 0 , -1 , 0 ); glViewport( 0, 0, 512, 512 );
Hier nochmal der fragment shader (falls es wichtig ist)
#version 330 core layout(location = 0) in vec4 vPosition; uniform mat4 transScaleRotate; void main() { gl_Position = vPosition * transScaleRotate; }
Hier die Main
glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGBA /*| GLUT_DOUBLE*/ | GLUT_DEPTH ); glutInitWindowSize(512, 512); glutInitContextVersion(3, 3); glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow("Dreiecke"); if( glewInit()) { std::cerr << "Konnte GLEW nicht initialisieren ... beende" << std::endl; exit(EXIT_FAILURE); } init(); glutDisplayFunc(display); glutMouseFunc(mouse); glutKeyboardFunc(keyboard); glutKeyboardUpFunc(keyboardUp); glutIdleFunc(idle); glutMainLoop();
Und hier nochmal die Matrizen
trans = mat4( 1, 0, 0, v_transX, 0, 1, 0, v_transY, 0, 0, 1, v_transZ, 0, 0, 0, 1 ); scale = mat4( v_scaleX, 0 , 0, 0, 0 , v_scaleY, 0, 0, 0 , 0 , 1, 0, 0 , 0 , 0, 1 ); rotateX = mat4( 1, 0 , 0 , 0, 0, cos(v_rotateX*0.017453293), -sin(v_rotateX*0.017453293), 0, 0, sin(v_rotateX*0.017453293), cos(v_rotateX*0.017453293), 0, 0, 0 , 0 , 1 ); rotateY = mat4( cos(v_rotateY*0.017453293), 0, -sin(v_rotateY*0.017453293), 0, 0 , 1, 0 , 0, sin(v_rotateY*0.017453293), 0, cos(v_rotateY*0.017453293), 0, 0 , 0, 0 , 1 ); rotateZ = mat4( cos(v_rotateZ*0.017453293), -sin(v_rotateZ*0.017453293), 0, 0, sin(v_rotateZ*0.017453293), cos(v_rotateZ*0.017453293) , 0, 0, 0 , 0 , 1, 0, 0 , 0 , 0, 1 ); allMat = scale * rotateX * rotateY * rotateZ * trans; glUniformMatrix4fv( modelMat, 1, false, &allMat[0] [0] ); glutPostRedisplay();
Wenn ihr noch mehr Code sehen wollt sagt es.
MfG Skybuildhero
-
Skybuildhero schrieb:
Ich habe das erste Programm im Redbook erweitert und wollte jetzt für die Vertexe eine dritte dimension angeben.
Aber das Programm nimmt immer zwei Zahlen und nimmt diese als X und Y eines Punktes.Dann musst Du OpenGL auch mitteilen, dass es sich jetzt um dreidimensionale Koordinaten handelt indem Du in Zeile 26 aus der 2 eine 3 machst.
-
ah danke
das hätt ich im Leben nicht gefundenso 1. Porblem gelöst
-
Warum hast du
glEnable(GL_DEPTH_TEST);
auskommentiert?
-
Weil als ichs eingeschaltet habe nix angezeigt wurde