{"id":3744,"date":"2015-11-16T17:06:34","date_gmt":"2015-11-16T17:06:34","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3744"},"modified":"2020-02-14T11:30:28","modified_gmt":"2020-02-14T11:30:28","slug":"une-simple-grille-en-3d","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3744","title":{"rendered":"Une simple grille en 3D"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/grid.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-3925\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/grid.png\" alt=\"grid\" width=\"530\" height=\"366\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/grid.png 1212w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/grid-300x207.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/grid-1024x708.png 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/11\/grid-624x431.png 624w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/a><\/p>\n<p><strong>Intro : <\/strong><\/p>\n<p>Savoir cr\u00e9er une grille en 3D peut \u00eatre utile pour :<\/p>\n<p>&#8211; un \u00e9diteur de <em>map<\/em><\/p>\n<p>&#8211; g\u00e9n\u00e9rer un terrain \u00e0 partir d&rsquo;une <em>height map<\/em><\/p>\n<p>&#8211; repr\u00e9senter la surface d&rsquo;une <em>eau<\/em> en mouvement<\/p>\n<p>&#8211; etc&#8230;<\/p>\n<p><strong>Pr\u00e9requis : <\/strong><\/p>\n<p>&#8211; Savoir initialiser DirectX 10.1<\/p>\n<p><strong>Explications : <\/strong><\/p>\n<p>Le fichier Grid.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef GRID_H\r\n#define GRID_H\r\n\r\n#include &lt;vector&gt;\r\n\r\n#include &lt;d3d10.h&gt;\r\n#include &lt;d3dx10.h&gt;\r\n\r\n#include &quot;Defines.h&quot;\r\n#include &quot;D3D10Renderer.h&quot;\r\n\r\nclass Grid\r\n{\r\npublic:\r\n\u00a0\u00a0\u00a0 Grid();\r\n\u00a0\u00a0\u00a0 virtual ~Grid();\r\n\u00a0\r\n\u00a0\u00a0\u00a0 bool Initialize();\r\n\u00a0\r\n\u00a0\u00a0\u00a0 void Render(float fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0void GenTriGrid(int iNumVertRows, int iNumVertCols,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float fDx, float fDz, const D3DXVECTOR3&amp; center,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::vector&lt;D3DXVECTOR3&gt;&amp; verts, std::vector&lt;uint32&gt;&amp; indices);\r\n\r\nprivate:\r\n\u00a0\u00a0\u00a0 ID3DX10Mesh* m_pMesh;\r\n\u00a0\r\n\u00a0\u00a0\u00a0 D3DXMATRIX m_worldMatrix;\r\n\u00a0\u00a0\u00a0 D3DXMATRIX m_viewMatrix;\r\n\u00a0\u00a0\u00a0 D3DXMATRIX m_projMatrix;\r\n\r\n\u00a0\u00a0\u00a0 ID3D10EffectMatrixVariable* m_pWorldVariable;\r\n\u00a0\u00a0\u00a0 ID3D10EffectMatrixVariable* m_pViewVariable;\r\n\u00a0\u00a0 \u00a0ID3D10EffectMatrixVariable* m_pProjVariable;\r\n\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 ID3D10Effect* m_pEffect;\r\n\u00a0\u00a0\u00a0 ID3D10EffectTechnique* m_pTechnique;\r\n\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 ID3D10InputLayout* m_pVertexLayout;\r\n};\r\n\u00a0\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Le fichier Grid.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;Grid.h&quot;\r\n\r\nGrid::Grid() :\r\nm_pMesh(nullptr),\r\nm_pWorldVariable(nullptr),\r\nm_pTechnique(nullptr),\r\nm_pEffect(nullptr),\r\nm_pVertexLayout(nullptr)\r\n{\r\n\u00a0\u00a0\u00a0 D3DXMatrixIdentity(&amp;m_worldMatrix);\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 Eye(0.0f, 22.0f, -46.0f);\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 At(0.0f, 0.0f, 0.0f);\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 Up(0.0f, 1.0f, 0.0f);\r\n\u00a0\r\n\u00a0\u00a0 \u00a0D3DXMatrixLookAtLH(&amp;m_viewMatrix, &amp;Eye, &amp;At, &amp;Up);\r\n\u00a0\r\n\u00a0\u00a0 \u00a0D3DXMatrixPerspectiveFovLH(&amp;m_projMatrix, D3DX_PI * 0.25f,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0(float) D3D10_RENDERER-&gt;GetViewportWidth() \/ (float)D3D10_RENDERER-&gt;GetViewportHeight(),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a00.1f, 100.0f);\r\n}\r\n\u00a0\r\nGrid::~Grid()\r\n{\r\n\u00a0\u00a0\u00a0 SAFE_RELEASE(m_pMesh);\r\n}\r\n\u00a0\r\nbool Grid::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0std::vector&lt;D3DXVECTOR3&gt; vertices;\r\n\u00a0\u00a0 \u00a0std::vector&lt;uint32&gt; indices;\r\n\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0GenTriGrid(12, 12, 5.0f, 5.0f, D3DXVECTOR3(0, 0, 0), vertices, indices);\r\n\r\n\u00a0\u00a0\u00a0 D3D10_INPUT_ELEMENT_DESC layout[] =\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n\u00a0\u00a0\u00a0 };\r\n\r\n\u00a0\u00a0\u00a0 HRESULT hr;\r\n\u00a0\u00a0\u00a0 hr = D3DX10CreateMesh(D3D10_RENDERER-&gt;GetDevice(), layout,\u00a0 1, &quot;POSITION&quot;, vertices.size(), indices.size()\/3, D3DX10_MESH_32_BIT, &amp;m_pMesh);\r\n\u00a0\r\n\u00a0\u00a0\u00a0 hr = m_pMesh-&gt;SetVertexData(0, vertices.front());\r\n\u00a0\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\r\n\u00a0\u00a0 \u00a0hr = m_pMesh-&gt;SetIndexData(indices.data(), indices.size());\r\n\u00a0\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\r\n\u00a0\u00a0\u00a0 hr = m_pMesh-&gt;CommitToDevice();\r\n\u00a0\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\r\n\u00a0\u00a0\u00a0 ID3D10Blob* pBlob = nullptr;\r\n\u00a0\r\n\u00a0\u00a0\u00a0 hr = D3DX10CreateEffectFromFile(L&quot;Grid.fx&quot;, nullptr, nullptr, &quot;fx_4_0&quot;,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_DEBUG, 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 D3D10_RENDERER-&gt;GetDevice(), nullptr, nullptr, &amp;m_pEffect, &amp;pBlob, nullptr);\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (pBlob)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Affiche l'erreur de compilation du shader\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MessageBoxA(nullptr, (PCSTR)pBlob-&gt;GetBufferPointer(), &quot;Erreur dans le fichier shader&quot;, MB_ICONHAND | MB_OK);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\r\n\u00a0\u00a0\u00a0 m_pTechnique = m_pEffect-&gt;GetTechniqueByName(&quot;Render&quot;);\r\n\u00a0\r\n\u00a0\u00a0\u00a0 m_pWorldVariable = m_pEffect-&gt;GetVariableByName(&quot;World&quot;)-&gt;AsMatrix();\r\n\u00a0\u00a0\u00a0 m_pViewVariable = m_pEffect-&gt;GetVariableByName(&quot;View&quot;)-&gt;AsMatrix();\r\n\u00a0\u00a0\u00a0 m_pProjVariable = m_pEffect-&gt;GetVariableByName(&quot;Projection&quot;)-&gt;AsMatrix();\r\n\u00a0\r\n\u00a0\u00a0\u00a0 D3D10_PASS_DESC PassDesc;\r\n\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetPassByIndex(0)-&gt;GetDesc(&amp;PassDesc);\r\n\u00a0\u00a0\u00a0 hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateInputLayout(layout, 1, PassDesc.pIAInputSignature,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PassDesc.IAInputSignatureSize, &amp;m_pVertexLayout);\r\n\u00a0\u00a0\u00a0 if (FAILED(hr))\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 return true;\r\n}\r\n\u00a0\r\nvoid Grid::Render(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetInputLayout(m_pVertexLayout);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Pour faire tourner la grille autour de l'axe Y\r\n\u00a0\u00a0 \u00a0static float r = 0;\r\n\u00a0\u00a0 \u00a0D3DXMatrixRotationY(&amp;m_worldMatrix, r);\r\n\u00a0\u00a0 \u00a0r += fTimeSinceLastFrame * 0.6f;\r\n\r\n\u00a0\u00a0 \u00a0m_pWorldVariable-&gt;SetMatrix((float*)&amp;m_worldMatrix);\r\n\u00a0\u00a0 \u00a0m_pViewVariable-&gt;SetMatrix((float*)&amp;m_viewMatrix);\r\n\u00a0\u00a0 \u00a0m_pProjVariable-&gt;SetMatrix((float*)&amp;m_projMatrix);\r\n\r\n\u00a0\u00a0\u00a0 D3D10_TECHNIQUE_DESC techDesc;\r\n\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetDesc(&amp;techDesc);\r\n\r\n\u00a0\u00a0\u00a0 for (uint32 p = 0; p &lt; techDesc.Passes; p++)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetPassByIndex(p)-&gt;Apply(0);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_pMesh-&gt;DrawSubset(0);\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nvoid Grid::GenTriGrid(int iNumVertRows, int iNumVertCols,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float fDx, float fDz, const D3DXVECTOR3&amp; center,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::vector&lt;D3DXVECTOR3&gt;&amp; verts, std::vector&lt;uint32&gt;&amp; indices)\r\n{\r\n\u00a0\u00a0 \u00a0int numVertices = iNumVertRows * iNumVertCols;\r\n\u00a0\u00a0 \u00a0int numCellRows = iNumVertRows - 1;\r\n\u00a0\u00a0 \u00a0int numCellCols = iNumVertCols - 1;\r\n\r\n\u00a0\u00a0 \u00a0int numTris = numCellRows*numCellCols*2;\r\n\r\n\u00a0\u00a0 \u00a0float width = (float) numCellCols * fDx;\r\n\u00a0\u00a0 \u00a0float depth = (float) numCellRows * fDz;\r\n\r\n\u00a0\u00a0 \u00a0\/* Construction des vertices *\/\r\n\r\n\u00a0\u00a0 \u00a0\/* On construit d'abord la grille centr\u00e9e\u00a0 \u00e0 l'origine *\/\r\n\r\n\u00a0\u00a0 \u00a0verts.resize( numVertices );\r\n\r\n\u00a0\u00a0 \u00a0\/* Valeurs de d\u00e9calage pour pour d\u00e9placer la grille\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 dans le centre du syst\u00e8me de coordonn\u00e9es *\/\r\n\u00a0\u00a0 \u00a0float xOffset = -width * 0.5f;\r\n\u00a0\u00a0 \u00a0float zOffset =\u00a0 depth * 0.5f;\r\n\r\n\u00a0\u00a0 \u00a0int k = 0;\r\n\u00a0\u00a0 \u00a0for (float i = 0; i &lt; iNumVertRows; ++i)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (float j = 0; j &lt; iNumVertCols; ++j)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0verts[k].x =\u00a0 j * fDx + xOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0verts[k].z = -i * fDz + zOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0verts[k].y =\u00a0 0.0f;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/* Op\u00e8re une translation afin que le centre de la grille\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 soit positionn\u00e9 en fonction du centre sp\u00e9cifi\u00e9 en param\u00e8tre *\/\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMATRIX T;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMatrixTranslation(&amp;T, center.x, center.y, center.z);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXVec3TransformCoord(&amp;verts[k], &amp;verts[k], &amp;T);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0++k;\u00a0 \/\/ Prochain vertex\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/* Construction des indices *\/ \r\n\r\n\u00a0\u00a0 \u00a0indices.resize(numTris * 3);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9 les indices pour chaque face\r\n\u00a0\u00a0 \u00a0k = 0;\r\n\u00a0\u00a0 \u00a0for (DWORD i = 0; i &lt; (DWORD)numCellRows; ++i)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (DWORD j = 0; j &lt; (DWORD)numCellCols; ++j)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indices[k]\u00a0\u00a0\u00a0\u00a0 =\u00a0\u00a0 i\u00a0\u00a0 * iNumVertCols + j;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indices[k + 1] =\u00a0\u00a0 i\u00a0\u00a0 * iNumVertCols + j + 1;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indices[k + 2] = (i+1) * iNumVertCols + j;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indices[k + 3] = (i+1) * iNumVertCols + j;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indices[k + 4] =\u00a0\u00a0 i\u00a0\u00a0 * iNumVertCols + j + 1;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indices[k + 5] = (i+1) * iNumVertCols + j + 1;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Prochaine face\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0k += 6;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons expliqu\u00e9 comment g\u00e9n\u00e9rer une grille en 3D avec le param\u00e9trage de sa longueur et de sa largeur puis la dimensions de ses faces.<\/p>\n<p>Voici les fichiers sources : <a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/data\/Simple%20Grille.zip\">Simple Grille.zip<\/a><\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; Introduction to DirectX 9.0c &#8211; Frank D. Luna<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Savoir cr\u00e9er une grille en 3D peut \u00eatre utile pour : &#8211; un \u00e9diteur de map &#8211; g\u00e9n\u00e9rer un terrain \u00e0 partir d&rsquo;une height map &#8211; repr\u00e9senter la surface d&rsquo;une eau en mouvement &#8211; etc&#8230; Pr\u00e9requis : &#8211; Savoir initialiser DirectX 10.1 Explications : Le fichier Grid.h : &nbsp; Le fichier Grid.cpp : [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3744"}],"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=3744"}],"version-history":[{"count":20,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3744\/revisions"}],"predecessor-version":[{"id":5949,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3744\/revisions\/5949"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}