{"id":215,"date":"2009-07-28T09:48:52","date_gmt":"2009-07-28T08:48:52","guid":{"rendered":"http:\/\/www.ozone3d.net\/blogs\/lab\/?p=215"},"modified":"2009-07-28T09:48:52","modified_gmt":"2009-07-28T08:48:52","slug":"howto-matrice-de-projection-perspective-en-opengl","status":"publish","type":"post","link":"https:\/\/www.ozone3d.net\/blogs\/lab\/20090728\/howto-matrice-de-projection-perspective-en-opengl\/","title":{"rendered":"HowTo: Matrice de Projection Perspective en OpenGL"},"content":{"rendered":"<p><center><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.ozone3d.net\/blogs\/lab\/public\/common\/maths.jpg\" alt=\"Maths...\"\/><\/p>\n<p><\/center><br \/>\n<!--more--><br \/>\nJe viens de tomber sur <a href=\"http:\/\/www.xgouchet.fr\/blog\/index.php\/post\/2009\/07\/27\/Definir-le-zoom-du-Camera-sous-OpenGL-ES\">ce post<\/a> de Xavier Gouchet qui avait besoin d&#8217;une routine pour initialiser la matrice de projection de la cam\u00e9ra en OpenGL. Vu qu&#8217;il ne pouvait pas utiliser les fonctions de la glu\/glut car non support\u00e9es sous Android, il a du trouver une routine avec juste deux fonctions de base d&#8217;OpenGL: glMatrixMode et glFrustum. C&#8217;est bien! Mais on peut mieux faire: rendre le calcul de la matrice totalement ind\u00e9pendant d&#8217;OpenGL. En gros, recoder la fonction glFrustum. <\/p>\n<p><b>Gros int\u00e9ret de la m\u00e9thode<\/b>: la routine peut \u00eatre utilis\u00e9e aussi bien avec <b>Direct3D<\/b> qu&#8217;avec avec le futur <b>Larrabee<\/b>&#8230;<\/p>\n<p>Okay mes amis, voici le code extrait de mes routines 3D (et l\u00e9g\u00e8rement modifi\u00e9 pour les besoins de ce post):<\/p>\n<pre>\r\nvoid BuildPerspProjMat(float *m, float fov, float aspect, \r\nfloat znear, float zfar)\r\n{\r\n  float xymax = znear * tan(fov * PI_OVER_360);\r\n  float ymin = -ymax;\r\n  float xmin = -xmax;\r\n\r\n  float width = xymax - xmin;\r\n  float height = xymax - ymin;\r\n\r\n  float depth = zfar - znear;\r\n  float q = -(zfar + znear) \/ depth;\r\n  float qn = -2 * (zfar * znear) \/ depth;\r\n\r\n  float w = 2 * znear \/ width;\r\n  w = w \/ aspect;\r\n  float h = 2 * znear \/ height;\r\n\r\n  m[0]  = w;\r\n  m[1]  = 0;\r\n  m[2]  = 0;\r\n  m[3]  = 0;\r\n\r\n  m[4]  = 0;\r\n  m[5]  = h;\r\n  m[6]  = 0;\r\n  m[7]  = 0;\r\n\r\n  m[8]  = 0;\r\n  m[9]  = 0;\r\n  m[10] = q;\r\n  m[11] = -1;\r\n\r\n  m[12] = 0;\r\n  m[13] = 0;\r\n  m[14] = qn;\r\n  m[15] = 0;\r\n}\r\n<\/pre>\n<p>et voici son utilisation:<\/p>\n<pre>\r\nfloat m[16] = {0};\r\nfloat fov=60.0f; \/\/ en degr\u00e9s\r\nfloat aspect=1.3333f;\r\nfloat znear=1.0f;\r\nfloat zfar=1000.0f;\r\nBuildPerspProjMat(m, fov, aspect, znear, zfar);\r\nglMatrixMode(GL_PROJECTION);\r\nglLoadMatrixf(m);\r\n\r\n\/\/ et hop on repasse en modelview pour le reste des matrices\r\nglMatrixMode(GL_MODELVIEW);\r\n...\r\n<\/pre>\n<p>Pour finir et juste pour optimiser un peu, la fonction glLoadIdentity dans le code de Xavier n&#8217;est pas n\u00e9cessaire car la fonction glFrustum remplace compl\u00e9tement la matrice&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,8],"tags":[364,359,362,363,360,638,366,365,361],"class_list":["post-215","post","type-post","status-publish","format-standard","hentry","category-opengl","category-programming","tag-android","tag-camera","tag-direct3d","tag-larrabee","tag-matrice","tag-opengl","tag-perspective","tag-programmation","tag-projection"],"aioseo_notices":[],"views":4434,"_links":{"self":[{"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/posts\/215","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/comments?post=215"}],"version-history":[{"count":0,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/posts\/215\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/media?parent=215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/categories?post=215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ozone3d.net\/blogs\/lab\/wp-json\/wp\/v2\/tags?post=215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}