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 gefunden

    so 1. Porblem gelöst 😃



  • Warum hast du

    glEnable(GL_DEPTH_TEST);
    

    auskommentiert?



  • Weil als ichs eingeschaltet habe nix angezeigt wurde


Anmelden zum Antworten