{"id":5483,"date":"2016-08-27T15:12:38","date_gmt":"2016-08-27T15:12:38","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=5483"},"modified":"2020-02-07T11:27:04","modified_gmt":"2020-02-07T11:27:04","slug":"5483","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=5483","title":{"rendered":"Une classe SceneNode pour repr\u00e9senter vos objets et entit\u00e9s dans la sc\u00e8ne"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/08\/graphe.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-5484\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/08\/graphe.gif\" alt=\"graphe\" width=\"259\" height=\"194\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Dans tout moteur 3D il est repr\u00e9sent\u00e9 un objet <em>SceneNode<\/em> (<strong>noeud de sc\u00e8ne<\/strong>).<br \/>\nCet objet sert \u00e0 identifier une entit\u00e9 sur la sc\u00e8ne avec les composantes suivantes : <strong>position<\/strong>, <strong>rotation<\/strong>, et<strong> mise \u00e0 l&rsquo;\u00e9chelle<\/strong>.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir initialiser <em>DirectX 10.1<\/em><\/p>\n<p>&#8211; Savoir qu&rsquo;il existe une autre classe li\u00e9e : <em>SceneManager<\/em><\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici le fichier SceneNode.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef SCENE_NODE_H\r\n#define SCENE_NODE_H\r\n\r\nstruct AlphaSceneNode\r\n{\r\n\u00a0\u00a0 \u00a0MeshSceneNode* m_pNode;\r\n\u00a0\u00a0 \u00a0D3DXMATRIX m_concat;\r\n\u00a0\u00a0 \u00a0float m_ScreenZ;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Pour le tri de liste de la STL\r\n\u00a0\u00a0 \u00a0bool const operator &lt;(AlphaSceneNode const &amp;other)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return m_ScreenZ &lt; other.m_ScreenZ;\r\n\u00a0\u00a0 \u00a0}\r\n};\r\n\r\nclass SceneNode\r\n{\r\n\u00a0\u00a0 \u00a0friend class SceneManager;\r\n\r\npublic:\r\n\u00a0\u00a0 \u00a0SceneNode(SceneNode* pParent, const D3DXVECTOR3&amp; position, const D3DXVECTOR3&amp; rotation, const D3DXVECTOR3&amp; scale);\r\n\r\n\u00a0\u00a0 \u00a0virtual ~SceneNode();\r\n\r\n\u00a0\u00a0 \u00a0std::string&amp; GetName();\r\n\u00a0\u00a0 \u00a0void SetName(const std::string&amp; sName);\r\n\r\n\u00a0\u00a0 \u00a0bool IsVisible();\r\n\u00a0\u00a0 \u00a0void SetVisible(bool bVisible);\r\n\r\n\u00a0\u00a0 \u00a0unsigned int GetID();\r\n\u00a0\u00a0 \u00a0void SetID(unsigned int iID);\r\n\r\n\u00a0\u00a0 \u00a0void AddChild(SceneNode* pChild);\r\n\u00a0\u00a0 \u00a0void RemoveChild(SceneNode* pChild);\r\n\r\n\u00a0\u00a0 \u00a0void RemoveAll();\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3&amp; GetScale();\r\n\u00a0\u00a0 \u00a0void SetScale(float x, float y, float z);\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3&amp; GetRotation();\r\n\u00a0\u00a0 \u00a0void SetRotation(float x, float y, float z);\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3&amp; GetPosition();\r\n\r\n\u00a0\u00a0 \u00a0void SetPosition(const D3DXVECTOR3&amp; position);\r\n\u00a0\u00a0 \u00a0void SetPosition(float x, float y, float z);\r\n\r\n\u00a0\u00a0 \u00a0std::vector&lt;SceneNode*&gt; GetChildren();\r\n\r\n\u00a0\u00a0 \u00a0void SetParent(SceneNode* pSceneNode);\r\n\u00a0\u00a0 \u00a0SceneNode* GetParent();\r\n\u00a0\u00a0 \u00a0void RemoveParent();\r\n\r\n\u00a0\u00a0 \u00a0void Remove();\r\n\r\n\u00a0\u00a0 \u00a0D3DMATRIX&amp; GetAbsoluteTransformation();\r\n\u00a0\u00a0 \u00a0D3DXMATRIX&amp; GetRelativeTransformation();\r\n\r\n\u00a0\u00a0 \u00a0bool IsReallyVisible() { return true; }\r\n\r\n\u00a0\u00a0 \u00a0bool IsTransparent();\r\n\u00a0\u00a0 \u00a0void SetTransparent(bool bTransparent);\r\n\r\n\u00a0\u00a0 \u00a0void UpdateRelativeTransformation();\r\n\u00a0\u00a0 \u00a0void UpdateAbsoluteTransformation();\r\n\r\n\u00a0\u00a0 \u00a0virtual void OnRegisterSceneNode() {}\r\n\u00a0\u00a0 \u00a0virtual void OnAnimate(float fTimeSinceLastFrame) {}\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 GetAbsolutePosition();\r\n\r\n\u00a0\u00a0 \u00a0virtual bool OnUpdate(float fTimeSinceLastFrame) { return true; }\r\n\r\nprotected:\r\n\u00a0\u00a0 \u00a0virtual bool OnPreRender(float fTimeSinceLastFrame);\r\n\u00a0\u00a0 \u00a0virtual bool OnRender(float fTimeSinceLastFrame) { return true; }\r\n\u00a0\u00a0 \u00a0virtual bool OnPostRender(float fTimeSinceLastFrame);\r\n\r\nprotected:\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 m_RelativeTranslation;\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 m_RelativeRotation;\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 m_RelativeScale;\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0std::string m_sName;\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX m_AbsoluteTransformation;\r\n\u00a0\u00a0 \u00a0D3DXMATRIX m_RelativeTransformation;\r\n\r\n\u00a0\u00a0 \u00a0uint32 m_iID;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bVisible;\r\n\r\n\u00a0\u00a0 \u00a0SceneNode* m_pParent;\r\n\u00a0\u00a0 \u00a0std::vector&lt;SceneNode*&gt; m_children;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bTransparent;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier SceneNode.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nSceneNode::SceneNode(SceneNode* pParent,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 const D3DXVECTOR3&amp; position,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 const D3DXVECTOR3&amp; rotation,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 const D3DXVECTOR3&amp; scale) :\r\nm_bTransparent(false),\r\nm_bVisible(true),\r\nm_pParent(nullptr),\r\nm_iID(0)\r\n{\r\n\u00a0\u00a0 \u00a0m_RelativeTranslation = D3DXVECTOR3(0.0f, 0.0f, 0.0f);\r\n\u00a0\u00a0 \u00a0m_RelativeRotation = D3DXVECTOR3(0.0f, 0.0f, 0.0f);\r\n\u00a0\u00a0 \u00a0m_RelativeScale = D3DXVECTOR3(1.0f, 1.0f, 1.0f);\r\n\r\n\u00a0\u00a0 \u00a0D3DXMatrixIdentity(&amp;m_AbsoluteTransformation);\r\n\u00a0\u00a0 \u00a0D3DXMatrixIdentity(&amp;m_RelativeTransformation);\r\n\r\n\u00a0\u00a0 \u00a0UpdateAbsoluteTransformation();\r\n}\r\n\r\nSceneNode::~SceneNode()\r\n{\r\n\u00a0\u00a0 \u00a0RemoveAll();\r\n}\r\n\r\nunsigned int SceneNode::GetID()\r\n{\r\n\u00a0\u00a0 \u00a0return m_iID;\r\n}\r\n\r\nvoid SceneNode::SetID(unsigned int iID)\r\n{\r\n\u00a0\u00a0 \u00a0m_iID = iID;\r\n}\r\n\r\nbool SceneNode::IsVisible()\r\n{\r\n\u00a0\u00a0 \u00a0return m_bVisible;\r\n}\r\n\r\nvoid SceneNode::SetVisible(bool bVisible)\r\n{\r\n\u00a0\u00a0 \u00a0m_bVisible = bVisible;\r\n}\r\n\r\nbool SceneNode::OnPreRender(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0UpdateAbsoluteTransformation();\r\n\r\n\u00a0\u00a0 \u00a0SCENE_MANAGER-&gt;PushAndSetMatrix(m_AbsoluteTransformation);\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nbool SceneNode::OnPostRender(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0SCENE_MANAGER-&gt;PopMatrix();\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nD3DXVECTOR3&amp; SceneNode::GetPosition()\r\n{\r\n\u00a0\u00a0 \u00a0return m_RelativeTranslation;\r\n}\r\n\r\nvoid SceneNode::SetPosition(const D3DXVECTOR3&amp; position)\r\n{\r\n\u00a0\u00a0 \u00a0m_RelativeTranslation = position;\r\n\r\n\u00a0\u00a0 \u00a0UpdateRelativeTransformation();\r\n}\r\n\r\nvoid SceneNode::SetPosition(float x, float y, float z)\r\n{\r\n\u00a0\u00a0 \u00a0m_RelativeTranslation = D3DXVECTOR3(x, y, z);\r\n\r\n\u00a0\u00a0 \u00a0UpdateRelativeTransformation();\r\n}\r\n\r\nbool SceneNode::IsTransparent()\r\n{\r\n\u00a0\u00a0 \u00a0return m_bTransparent;\r\n}\r\n\r\nvoid SceneNode::SetTransparent(bool bTransparent)\r\n{\r\n\u00a0\u00a0 \u00a0m_bTransparent = bTransparent;\r\n}\r\n\r\nvoid SceneNode::UpdateRelativeTransformation()\r\n{\r\n\u00a0\u00a0 \u00a0D3DXMATRIX matTrans;\r\n\u00a0\u00a0 \u00a0D3DXMatrixTranslation(&amp;matTrans, m_RelativeTranslation.x, m_RelativeTranslation.y, m_RelativeTranslation.z);\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX matRotX;\r\n\u00a0\u00a0 \u00a0D3DXMatrixRotationX(&amp;matRotX, m_RelativeRotation.x);\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX matRotY;\r\n\u00a0\u00a0 \u00a0D3DXMatrixRotationY(&amp;matRotY, m_RelativeRotation.y);\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX matRotZ;\r\n\u00a0\u00a0 \u00a0D3DXMatrixRotationZ(&amp;matRotZ, m_RelativeRotation.z);\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX matRotation = matRotX * matRotY * matRotZ;\r\n\r\n\u00a0\u00a0 \u00a0D3DXMATRIX matScale;\r\n\u00a0\u00a0 \u00a0D3DXMatrixScaling(&amp;matScale, m_RelativeScale.x, m_RelativeScale.y, m_RelativeScale.z);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Ordre de la multiplication : S*R*T\r\n\u00a0\u00a0 \u00a0m_RelativeTransformation = matScale * matRotation * matTrans;\r\n}\r\n\r\nvoid SceneNode::UpdateAbsoluteTransformation()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_pParent)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMATRIX AbsoluteTrans = m_pParent-&gt;GetAbsoluteTransformation();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMATRIX RelativeTrans = GetRelativeTransformation();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXMatrixMultiply(&amp;m_AbsoluteTransformation, &amp;AbsoluteTrans, &amp;RelativeTrans);\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_AbsoluteTransformation = GetRelativeTransformation();\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nD3DMATRIX&amp; SceneNode::GetAbsoluteTransformation()\r\n{\r\n\u00a0\u00a0 \u00a0UpdateAbsoluteTransformation();\r\n\r\n\u00a0\u00a0 \u00a0return m_AbsoluteTransformation;\r\n}\r\n\r\nD3DXMATRIX&amp; SceneNode::GetRelativeTransformation()\r\n{\r\n\u00a0\u00a0 \u00a0UpdateRelativeTransformation();\r\n\r\n\u00a0\u00a0 \u00a0return m_RelativeTransformation;\r\n}\r\n\r\nstd::string&amp; SceneNode::GetName()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sName;\r\n}\r\n\r\nvoid SceneNode::SetName(const std::string&amp; sName)\r\n{\r\n\u00a0\u00a0 \u00a0m_sName = sName;\r\n}\r\n\r\nD3DXVECTOR3&amp; SceneNode::GetScale()\r\n{\r\n\u00a0\u00a0 \u00a0return m_RelativeScale;\r\n}\r\n\r\nvoid SceneNode::SetScale(float x, float y, float z)\r\n{\r\n\u00a0\u00a0 \u00a0m_RelativeScale = D3DXVECTOR3(x, y, z);\r\n\r\n\u00a0\u00a0 \u00a0UpdateRelativeTransformation();\r\n}\r\n\r\nD3DXVECTOR3&amp; SceneNode::GetRotation()\r\n{\r\n\u00a0\u00a0 \u00a0return m_RelativeRotation;\r\n}\r\n\r\nvoid SceneNode::SetRotation(float x, float y, float z)\r\n{\r\n\u00a0\u00a0 \u00a0m_RelativeRotation = D3DXVECTOR3(x, y, z);\r\n\r\n\u00a0\u00a0 \u00a0UpdateRelativeTransformation();\r\n}\r\n\r\nvoid SceneNode::AddChild(SceneNode* pChild)\r\n{\r\n\u00a0\u00a0 \u00a0if (pChild &amp;&amp; (pChild != this))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pChild-&gt;RemoveParent();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_children.push_back(pChild);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pChild-&gt;SetParent(this);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MeshSceneNode* pChildSceneNode = dynamic_cast&lt;MeshSceneNode*&gt;(pChild);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (typeid(pChildSceneNode) == typeid(MeshSceneNode*))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SCENE_MANAGER-&gt;AddSceneNode(pChildSceneNode);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid SceneNode::RemoveChild(SceneNode* pChild)\r\n{\r\n\u00a0\u00a0 \u00a0for (auto it = m_children.begin(); it != m_children.end(); it++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SceneNode* pCurrentChild = *it;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (pCurrentChild == pChild)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pCurrentChild-&gt;RemoveParent();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_children.erase(it);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid SceneNode::RemoveAll()\r\n{\r\n\u00a0\u00a0 \u00a0for (auto it = m_children.begin(); it != m_children.end(); it++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SceneNode* pCurrentChild = *it;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_children.erase(it);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0m_children.clear();\r\n}\r\n\r\nvoid SceneNode::SetParent(SceneNode* pSceneNode)\r\n{\r\n\u00a0\u00a0 \u00a0Remove();\r\n\u00a0\u00a0 \u00a0m_pParent = pSceneNode;\r\n}\r\n\r\nSceneNode* SceneNode::GetParent()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pParent;\r\n}\r\n\r\nvoid SceneNode::RemoveParent()\r\n{\r\n\u00a0\u00a0 \u00a0m_pParent = nullptr;\r\n}\r\n\r\nvoid SceneNode::Remove()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_pParent)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pParent-&gt;RemoveChild(this);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nstd::vector&lt;SceneNode*&gt; SceneNode::GetChildren()\r\n{\r\n\u00a0\u00a0 \u00a0return m_children;\r\n}\r\n\r\nD3DXVECTOR3 SceneNode::GetAbsolutePosition()\r\n{\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 absolutePosition;\r\n\r\n\u00a0\u00a0 \u00a0absolutePosition.x = m_AbsoluteTransformation._12;\r\n\u00a0\u00a0 \u00a0absolutePosition.y = m_AbsoluteTransformation._13;\r\n\u00a0\u00a0 \u00a0absolutePosition.z = m_AbsoluteTransformation._14;\r\n\r\n\u00a0\u00a0 \u00a0return absolutePosition;\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons pr\u00e9sent\u00e9 une classe pour g\u00e9rer les positions, rotations et d&rsquo;agrandissement de vos entit\u00e9s.<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; Code source d&rsquo;Irrlicht 3D<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Dans tout moteur 3D il est repr\u00e9sent\u00e9 un objet SceneNode (noeud de sc\u00e8ne). Cet objet sert \u00e0 identifier une entit\u00e9 sur la sc\u00e8ne avec les composantes suivantes : position, rotation, et mise \u00e0 l&rsquo;\u00e9chelle. Pr\u00e9requis : &#8211; Savoir initialiser DirectX 10.1 &#8211; Savoir qu&rsquo;il existe une autre classe li\u00e9e : SceneManager Explications : [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[25],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5483"}],"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=5483"}],"version-history":[{"count":12,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5483\/revisions"}],"predecessor-version":[{"id":5923,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5483\/revisions\/5923"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}