{"id":4717,"date":"2016-02-05T09:48:06","date_gmt":"2016-02-05T09:48:06","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=4717"},"modified":"2016-02-10T17:47:32","modified_gmt":"2016-02-10T17:47:32","slug":"generer-une-sphere","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=4717","title":{"rendered":"G\u00e9n\u00e9rer une sph\u00e8re MeshSceneNode"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Sphere.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-4720\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Sphere.png\" alt=\"Sphere\" width=\"562\" height=\"388\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Sphere.png 1214w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Sphere-300x207.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Sphere-1024x707.png 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/02\/Sphere-624x431.png 624w\" sizes=\"(max-width: 562px) 100vw, 562px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Il peut \u00eatre utile de savoir g\u00e9n\u00e9rer une <strong>sph\u00e8re<\/strong> \u00e0 la vol\u00e9e par la d\u00e9finition de ses vertices et de ses indices.<\/p>\n<p><strong>Pr\u00e9requis : <\/strong><\/p>\n<p>&#8211; Savoir lire du <em>C++<\/em><\/p>\n<p>&#8211; Savoir initialiser <em>DirectX 10<\/em><\/p>\n<p>&#8211; Savoir utiliser et comprendre un peu de <em>trigonom\u00e9trie<\/em><\/p>\n<p>&#8211; Savoir utiliser la classe <em>Renderable<\/em><\/p>\n<p>&#8211; Savoir utiliser la classe <em>MeshSceneNode<\/em><\/p>\n<p>&#8211; Savoir utiliser la classe <em>ShaderTechnique<\/em><\/p>\n<p><strong>Explications : <\/strong><\/p>\n<p>Voici l&rsquo;impl\u00e9mentation de la classe <strong>shader<\/strong> :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/------------------------------------------------------\r\n\/\/ Simple shader avec texturage\r\n\/\/------------------------------------------------------\r\nclass ShaderTechnique_BasicTexture : public ShaderTechnique\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0ShaderTechnique_BasicTexture(const std::string&amp; sTextureFileName);\r\n\u00a0\u00a0 \u00a0virtual ~ShaderTechnique_BasicTexture();\r\n\r\n\u00a0\u00a0 \u00a0virtual bool Initialize();\r\n\r\n\u00a0\u00a0 \u00a0virtual void SetupShaderVariables();\r\n\r\n\u00a0\u00a0 \u00a0virtual void Update(float fTimeSinceLastFrame);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0std::string m_sTextureFileName;\r\n};\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier ShaderTechnique_BasicTexture.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;ShaderTechnique_Declarations.h&quot;\r\n\r\nShaderTechnique_BasicTexture::ShaderTechnique_BasicTexture(const std::string&amp; sTextureFileName) :\r\nShaderTechnique(&quot;SimpleTextureEffect.fx&quot;, &quot;Render&quot;, VertexLayoutType::PTN_VERTEX),\r\nm_sTextureFileName(sTextureFileName)\r\n{\r\n}\r\n\r\nShaderTechnique_BasicTexture::~ShaderTechnique_BasicTexture()\r\n{\r\n}\r\n\r\nbool ShaderTechnique_BasicTexture::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0if (ShaderTechnique::Initialize() == false)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0SetupShaderVariables();\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid ShaderTechnique_BasicTexture::SetupShaderVariables()\r\n{\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;World&quot;, ShaderVariableType::WORLD);\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;View&quot;, ShaderVariableType::VIEW);\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;Projection&quot;, ShaderVariableType::PROJECTION);\r\n\r\n\u00a0\u00a0 \u00a0RegisterTextureVariable(&quot;txDiffuse&quot;);\r\n\r\n\u00a0\u00a0 \u00a0AddTexture(m_sTextureFileName.c_str());\r\n\r\n\u00a0\u00a0 \u00a0SetTexture(&quot;txDiffuse&quot;, 0);\r\n}\r\n\r\nvoid ShaderTechnique_BasicTexture::Update(float fTimeSinceLastFrame)\r\n{\r\n    \/\/ On fait tourner la sph\u00e8re \/ plan\u00e8te\r\n\u00a0\u00a0 \u00a0D3DXMATRIX mat;\r\n\u00a0\u00a0 \u00a0static float r = 0.0f;\r\n\r\n\u00a0\u00a0 \u00a0r += fTimeSinceLastFrame * 0.3f;\r\n\r\n\u00a0\u00a0 \u00a0D3DXMatrixRotationY(&amp;mat, r);\r\n\r\n\u00a0\u00a0 \u00a0SetMatrix(&quot;World&quot;, &amp;mat);\r\n\r\n\u00a0\u00a0 \u00a0SetAutoMatrix(ShaderVariableType::VIEW);\r\n\u00a0\u00a0 \u00a0SetAutoMatrix(ShaderVariableType::PROJECTION);\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier SphereMeshSceneNode.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef SPHERE_MESH_SCENE_NODE_H\r\n#define SPHERE_MESH_SCENE_NODE_H\r\n\r\n#include &quot;MeshSceneNode.h&quot;\r\n#include &quot;Types.h&quot;\r\n\r\nclass SphereMeshSceneNode : public MeshSceneNode\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0SphereMeshSceneNode();\r\n\u00a0\u00a0 \u00a0virtual ~SphereMeshSceneNode();\r\n\r\n\u00a0\u00a0 \u00a0void CreateSphere(uint16 iRings, uint16 iSectors, uint16 iRadius);\r\n\r\nprivate:\r\n\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier SphereMeshSceneNode.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;vector&gt;\r\n\r\n#include &quot;SphereMeshSceneNode.h&quot;\r\n#include &quot;Types.h&quot;\r\n#include &quot;ShaderTechnique_Declarations.h&quot;\r\n\r\nSphereMeshSceneNode::SphereMeshSceneNode()\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ Chercher sur Google Image d'autres textures sph\u00e9riques\r\n\u00a0\u00a0 \u00a0SetShaderTechnique( new ShaderTechnique_BasicTexture(&quot;earth.jpg&quot;) );\r\n\u00a0\u00a0 \u00a0CreateSphere(40, 40, 4);\r\n}\r\n\r\nSphereMeshSceneNode::~SphereMeshSceneNode()\r\n{\r\n}\r\n\r\n\/\/ Voil\u00e0 la m\u00e9thode qui cr\u00e9er la sph\u00e8re\r\nvoid SphereMeshSceneNode::CreateSphere(uint16 iRings, uint16 iSectors, uint16 iRadius)\r\n{\r\n\u00a0\u00a0\u00a0 std::vector&lt;PTNVertex&gt; vertices;\r\n\u00a0\u00a0\u00a0 std::vector&lt;uint16&gt; indices;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 float R = 1.f\/(float)(iRings-1);\r\n\u00a0\u00a0\u00a0 float S = 1.f\/(float)(iSectors-1);\r\n\r\n\u00a0\u00a0\u00a0 for (uint32 r = 0; r &lt; iRings; r++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (uint32 s = 0; s &lt; iSectors; s++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n#define MATH_PI 3.141592653589793f\r\n#define MATH_PI_2 MATH_PI \/ 2\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float const y = sin( -MATH_PI_2 + MATH_PI * r * R );\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float const x = cos(2*MATH_PI * s * S) * sin( MATH_PI * r * R );\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float const z = sin(2*MATH_PI * s * S) * sin( MATH_PI * r * R );\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PTNVertex v;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0v.position.x = x * iRadius;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0v.position.y = y * iRadius;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0v.position.z = z * iRadius;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0v.texture.x = 1 - s*S;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0v.texture.y = r*R;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0v.normal.x = -x;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0v.normal.y = -y;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0v.normal.z = -z;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertices.push_back(v);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 for (uint16 y = 0; y &lt; iRings - 1; y++)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (uint16 x = 0; x &lt; iSectors - 1; x++)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indices.push_back( ((y + 0) * iSectors + x) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indices.push_back( ((y + 1) * iSectors + x) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indices.push_back( ((y + 1) * iSectors + x + 1) );\r\n\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indices.push_back( ((y + 1) * iSectors + x + 1) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indices.push_back( ((y + 0) * iSectors + x + 1) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 indices.push_back( ((y + 0) * iSectors + x) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0Build(vertices, indices);\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons appris comment g\u00e9n\u00e9rer une sph\u00e8re en 3D avec ses coordonn\u00e9es de texture et normales.<\/p>\n<p><strong>R\u00e9f\u00e9r\u00e9nces :<\/strong><\/p>\n<p>&#8211; http:\/\/stackoverflow.com\/questions\/5988686\/creating-a-3d-sphere-in-opengl-using-visual-c<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Il peut \u00eatre utile de savoir g\u00e9n\u00e9rer une sph\u00e8re \u00e0 la vol\u00e9e par la d\u00e9finition de ses vertices et de ses indices. Pr\u00e9requis : &#8211; Savoir lire du C++ &#8211; Savoir initialiser DirectX 10 &#8211; Savoir utiliser et comprendre un peu de trigonom\u00e9trie &#8211; Savoir utiliser la classe Renderable &#8211; Savoir utiliser la [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[19],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4717"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4717"}],"version-history":[{"count":16,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4717\/revisions"}],"predecessor-version":[{"id":4941,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4717\/revisions\/4941"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4717"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4717"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4717"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}