c++ - How to create one or more spheres using OpenGL? -
we have create ball game. however, before implementing our code graphics, given 3 codes 3 types of graphics. code cubes, code random spheres don't move, , code moving cube, if i'm not mistaken (maybe am).
first code cube follows:
#include "vue_opengl.h" #include "vertex_shader.h" #include "contenu.h" // ====================================================================== void vueopengl::dessine(contenu const& a_dessiner) { q_unused(a_dessiner); draw first cube (at origin) dessinecube(); qmatrix4x4 matrice; // dessine le 2e cube matrice.translate(0.0, 1.5, 0.0); matrice.scale(0.25); dessinecube(matrice); // dessine le 3e cube matrice.settoidentity(); matrice.translate(0.0, 0.0, 1.5); matrice.scale(0.25); matrice.rotate(45.0, 0.0, 1.0, 0.0); dessinecube(matrice); } // ====================================================================== void vueopengl::init() { prog.addshaderfromsourcefile(qglshader::vertex, ":/vertex_shader.glsl"); prog.addshaderfromsourcefile(qglshader::fragment, ":/fragment_shader.glsl"); prog.bindattributelocation("sommet", sommetid); prog.bindattributelocation("couleur", couleurid); // compilation of shader opengl prog.link(); // activation of shader prog.bind(); glenable(gl_depth_test); glenable(gl_cull_face); initializeposition(); } // ====================================================================== void vueopengl::initializeposition() { // position initiale matrice_vue.settoidentity(); matrice_vue.translate(0.0, 0.0, -4.0); matrice_vue.rotate(60.0, 0.0, 1.0, 0.0); matrice_vue.rotate(45.0, 0.0, 0.0, 1.0); } // ====================================================================== void vueopengl::translate(double x, double y, double z) { qmatrix4x4 translation_supplementaire; translation_supplementaire.translate(x, y, z); matrice_vue = translation_supplementaire * matrice_vue; } // ====================================================================== void vueopengl::rotate(double angle, double dir_x, double dir_y, double dir_z) {// multiplie la matrice de vue par la gauche qmatrix4x4 rotation_supplementaire; rotation_supplementaire.rotate(angle, dir_x, dir_y, dir_z); matrice_vue = rotation_supplementaire * matrice_vue; } // ====================================================================== void vueopengl::dessinecube (qmatrix4x4 const& point_de_vue) { prog.setuniformvalue("vue_modele", matrice_vue * point_de_vue); glbegin(gl_quads); // side x = +1 prog.setattributevalue(couleurid, 1.0, 0.0, 0.0); // red prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); // sides x = -1 prog.setattributevalue(couleurid, 0.0, 1.0, 0.0); // green prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); // side y = +1 prog.setattributevalue(couleurid, 0.0, 0.0, 1.0); // blue prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); //side y = -1 prog.setattributevalue(couleurid, 0.0, 1.0, 1.0); // cyan prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); // side z = +1 prog.setattributevalue(couleurid, 1.0, 1.0, 0.0); // yellow prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); // side z = -1 prog.setattributevalue(couleurid, 1.0, 0.0, 1.0); // magenta prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); glend(); }
now give code sphere:
#include "vue_opengl.h" #include "vertex_shader.h" #include "contenu.h" // ====================================================================== void vueopengl::dessine(contenu const& a_dessiner) { q_unused(a_dessiner); // glclear(gl_color_buffer_bit | gl_depth_buffer_bit); qmatrix4x4 matrice; matrice.translate(-0.5, 0.0, -2.0); glpolygonmode(gl_front_and_back, gl_line); // passe en mode "fil de fer" dessinesphere(matrice, 0.0, 0.0); // bleu matrice.scale(1.5); // taille des axes (1.5 pour qu'ils dépassent un peu) glpolygonmode(gl_front_and_back, gl_fill); // repasse en mode "plein" } // ====================================================================== void vueopengl::init() { prog.addshaderfromsourcefile(qglshader::vertex, ":/vertex_shader.glsl"); prog.addshaderfromsourcefile(qglshader::fragment, ":/fragment_shader.glsl"); prog.bindattributelocation("sommet", sommetid); prog.bindattributelocation("couleur", couleurid); prog.link(); // activation du shader prog.bind(); glenable(gl_depth_test); glenable(gl_cull_face); sphere.initialize(); // initialise la sphère initializeposition(); } // ====================================================================== void vueopengl::initializeposition() { // position initial matrice_vue.settoidentity(); matrice_vue.translate(0.0, 0.0, -4.0); matrice_vue.rotate(60.0, 0.0, 1.0, 0.0); matrice_vue.rotate(45.0, 0.0, 0.0, 1.0); } // ====================================================================== void vueopengl::translate(double x, double y, double z) { qmatrix4x4 translation_supplementaire; translation_supplementaire.translate(x, y, z); matrice_vue = translation_supplementaire * matrice_vue; } // ====================================================================== void vueopengl::rotate(double angle, double dir_x, double dir_y, double dir_z) { // qmatrix4x4 rotation_supplementaire; rotation_supplementaire.rotate(angle, dir_x, dir_y, dir_z); matrice_vue = rotation_supplementaire * matrice_vue; } // ====================================================================== void vueopengl::dessinecube (qmatrix4x4 const& point_de_vue) { prog.setuniformvalue("vue_modele", matrice_vue * point_de_vue); glbegin(gl_quads); // side x = +1 prog.setattributevalue(couleurid, 1.0, 0.0, 0.0); // rouge prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); // side x = -1 prog.setattributevalue(couleurid, 0.0, 1.0, 0.0); // vert prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); // face coté y = +1 prog.setattributevalue(couleurid, 0.0, 0.0, 1.0); // bleu prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); // side y = -1 prog.setattributevalue(couleurid, 0.0, 1.0, 1.0); // cyan prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); // side z = +1 prog.setattributevalue(couleurid, 1.0, 1.0, 0.0); // jaune prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); //side z = -1 prog.setattributevalue(couleurid, 1.0, 0.0, 1.0); // magenta prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); glend(); } // ====================================================================== void vueopengl::dessinesphere (qmatrix4x4 const& point_de_vue, double rouge, double vert, double bleu) { prog.setuniformvalue("vue_modele", matrice_vue * point_de_vue); prog.setattributevalue(couleurid, rouge, vert, bleu); // met la couleur sphere.draw(prog, sommetid); // dessine la sphère } // ====================================================================== void vueopengl::dessineaxes (qmatrix4x4 const& point_de_vue, bool en_couleur) { prog.setuniformvalue("vue_modele", matrice_vue * point_de_vue); glbegin(gl_lines); // axe x if (en_couleur) { prog.setattributevalue(couleurid, 1.0, 0.0, 0.0); // rouge } else { prog.setattributevalue(couleurid, 1.0, 1.0, 1.0); // blanc } prog.setattributevalue(sommetid, 0.0, 0.0, 0.0); prog.setattributevalue(sommetid, 1.0, 0.0, 0.0); // axe y if (en_couleur) prog.setattributevalue(couleurid, 0.0, 1.0, 0.0); // green prog.setattributevalue(sommetid, 0.0, 0.0, 0.0); prog.setattributevalue(sommetid, 0.0, 1.0, 0.0); // axe z if (en_couleur) prog.setattributevalue(couleurid, 0.0, 0.0, 1.0); // blue prog.setattributevalue(sommetid, 0.0, 0.0, 0.0); prog.setattributevalue(sommetid, 0.0, 0.0, 1.0); glend(); }
last code: moving cube: - assume have put sphere in code moves:
#include "vue_opengl.h" #include "vertex_shader.h" // identifiants qt de nos différents attributs #include "contenu.h" // ====================================================================== void vueopengl::dessine(contenu const& a_dessiner) { // dessine le 1er cube (à l'origine) dessinecube(); qmatrix4x4 matrice; // dessine le 4e cube matrice.settoidentity(); matrice.rotate(a_dessiner.infos(), 1.0, 0.0, 0.0); matrice.translate(0.0, 2.3, 0.0); matrice.scale(0.2); dessinecube(matrice); } // ====================================================================== void vueopengl::init() { prog.addshaderfromsourcefile(qglshader::vertex, ":/vertex_shader.glsl"); prog.addshaderfromsourcefile(qglshader::fragment, ":/fragment_shader.glsl"); prog.bindattributelocation("sommet", sommetid); prog.bindattributelocation("couleur", couleurid); // compilation du shader opengl prog.link(); // activation du shader prog.bind(); glenable(gl_depth_test); glenable(gl_cull_face); initializeposition(); } // ====================================================================== void vueopengl::initializeposition() { // position initiale matrice_vue.settoidentity(); matrice_vue.translate(0.0, 0.0, -4.0); matrice_vue.rotate(60.0, 0.0, 1.0, 0.0); matrice_vue.rotate(45.0, 0.0, 0.0, 1.0); } // ====================================================================== void vueopengl::translate(double x, double y, double z) { qmatrix4x4 translation_supplementaire; translation_supplementaire.translate(x, y, z); matrice_vue = translation_supplementaire * matrice_vue; } // ====================================================================== void vueopengl::rotate(double angle, double dir_x, double dir_y, double dir_z) { qmatrix4x4 rotation_supplementaire; rotation_supplementaire.rotate(angle, dir_x, dir_y, dir_z); matrice_vue = rotation_supplementaire * matrice_vue; } // ====================================================================== void vueopengl::dessinecube (qmatrix4x4 const& point_de_vue) { prog.setuniformvalue("vue_modele", matrice_vue * point_de_vue); glbegin(gl_quads); // face coté x = +1 prog.setattributevalue(couleurid, 1.0, 0.0, 0.0); // rouge prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); // face coté x = -1 prog.setattributevalue(couleurid, 0.0, 1.0, 0.0); // vert prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); // face coté y = +1 prog.setattributevalue(couleurid, 0.0, 0.0, 1.0); // bleu prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); // face coté y = -1 prog.setattributevalue(couleurid, 0.0, 1.0, 1.0); // cyan prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); // face coté z = +1 prog.setattributevalue(couleurid, 1.0, 1.0, 0.0); // jaune prog.setattributevalue(sommetid, -1.0, -1.0, +1.0); prog.setattributevalue(sommetid, +1.0, -1.0, +1.0); prog.setattributevalue(sommetid, +1.0, +1.0, +1.0); prog.setattributevalue(sommetid, -1.0, +1.0, +1.0); // face coté z = -1 prog.setattributevalue(couleurid, 1.0, 0.0, 1.0); // magenta prog.setattributevalue(sommetid, -1.0, -1.0, -1.0); prog.setattributevalue(sommetid, -1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, +1.0, -1.0); prog.setattributevalue(sommetid, +1.0, -1.0, -1.0); glend(); }
how implement 3 of these codes display sphere moving , 1 solid colour?
are allowed use glu library? glu has primitive type sphere. here documentation
example of usage:
quadratic initialization:
quadratic = glunewquadric(); gluquadricnormals(quadratic, glu_smooth);
draw function:
glpushmatrix(); gltranslatef("translatex here","translatey here","translatez here"); glusphere(quadratic,"sphere radius here", 32, 32); glpopmatrix();
Comments
Post a Comment