{"id":920,"date":"2022-08-05T15:50:28","date_gmt":"2022-08-05T07:50:28","guid":{"rendered":"https:\/\/www.acgloby.com\/?p=920"},"modified":"2022-08-05T15:50:28","modified_gmt":"2022-08-05T07:50:28","slug":"opengl-%e5%8a%a0%e8%bd%bd%e6%a8%a1%e5%9e%8b%e8%b5%84%e6%ba%90","status":"publish","type":"post","link":"https:\/\/www.acgloby.com\/index.php\/2022\/08\/05\/opengl-%e5%8a%a0%e8%bd%bd%e6%a8%a1%e5%9e%8b%e8%b5%84%e6%ba%90\/","title":{"rendered":"OpenGL-\u52a0\u8f7d\u6a21\u578b\u8d44\u6e90"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Mesh\u7c7b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u6570\u636e\u7ed3\u6784<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;glm\/glm.hpp&gt;\n#include &lt;glm\/gtc\/matrix_transform.hpp&gt;\n#include &lt;string&gt;\n#include &lt;vector&gt;\n#include \"Shader.h\"\n\nstruct Vertex\n{\n\tglm::vec3 Position;\t\/\/\u9876\u70b9\u5750\u6807\n\tglm::vec3 Normal;\t\/\/\u6cd5\u7ebf\u65b9\u5411\n\tglm::vec3 Tangent;\t\/\/\u5207\u7ebf\u65b9\u5411\n\tglm::vec3 Bitangent;\t\/\/\u526f\u5207\u7ebf\u65b9\u5411\n\tglm::vec2 TexCoords;\t\/\/\u7eb9\u7406\u5750\u6807\n};\n\nstruct Texture\n{\n\tunsigned int id;\t\/\/\u8d34\u56feId\n\tstd::string type;\t\/\/\u8d34\u56fe\u7c7b\u578b\uff08\u6f2b\u53cd\u5c04\u8d34\u56fe\u6216\u8005\u662f\u955c\u9762\u5149\u8d34\u56fe\uff09\n\tstd::string path;\t\/\/\u8d34\u56fe\u8def\u5f84\n};\n\n#pragma once\nclass Mesh\n{\npublic:\n\t#pragma region \u7f51\u683c\u6570\u636e\n\t\/\/\u9876\u70b9\u6570\u636e\n\tstd::vector&lt;Vertex&gt; vertices;\n\t\/\/\u9876\u70b9\u7d22\u5f15\u6570\u636e\n\tstd::vector&lt;unsigned int&gt; indices;\n\t\/\/\u8d34\u56fe\u6570\u636e\n\tstd::vector&lt;Texture&gt; textures;\n\t#pragma endregion\n\t\/\/\u6784\u9020\n\tMesh(std::vector&lt;Vertex&gt; vertices, std::vector&lt;unsigned int&gt; indices, std::vector&lt;Texture&gt; textures);\n\t\/\/DrawCall\n\tvoid Draw(Shader shader);\nprivate:\n\t#pragma region \u6e32\u67d3\u6570\u636e\n\tunsigned int VAO;\n\tunsigned int VBO;\n\tunsigned int EBO;\n\t#pragma endregion\n\t\/\/\u8bbe\u7f6eMesh\n\tvoid setupMesh();\n};\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u903b\u8f91\u4ee3\u7801<\/h4>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"wp-block-paragraph\">C++\u7ed3\u6784\u4f53\u6709\u4e00\u4e2a\u5f88\u68d2\u7684\u7279\u6027\uff0c\u5b83\u4eec\u7684\u5185\u5b58\u5e03\u5c40\u662f\u8fde\u7eed\u7684(Sequential)\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5982\u679c\u5c06\u7ed3\u6784\u4f53\u4f5c\u4e3a\u4e00\u4e2a\u6570\u636e\u6570\u7ec4\u4f7f\u7528\uff0c\u90a3\u4e48\u5b83\u5c06\u4f1a\u4ee5\u987a\u5e8f\u6392\u5217\u7ed3\u6784\u4f53\u7684\u53d8\u91cf\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Vertex vertex;\nvertex.Position  = glm::vec3(0.2f, 0.4f, 0.6f);\nvertex.Normal    = glm::vec3(0.0f, 1.0f, 0.0f);\nvertex.TexCoords = glm::vec2(1.0f, 0.0f);\n\/\/ = &#91;0.2f, 0.4f, 0.6f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f];<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"Mesh.h\"\n\nMesh::Mesh(std::vector&lt;Vertex&gt; vertices, std::vector&lt;unsigned int&gt; indices, std::vector&lt;Texture&gt; textures) \n{\n\tthis-&gt;vertices = vertices;\n\tthis-&gt;indices = indices;\n\tthis-&gt;textures = textures;\n\n\tsetupMesh();\n}\n\nvoid Mesh::Draw(Shader shader)\n{\n\tunsigned int diffuseNr = 1;\n\tunsigned int specularNr = 1;\n\tunsigned int normalNr = 1;\n\tunsigned int heightNr = 1;\n\t\/\/\u7ed1\u5b9a\u8d34\u56fe\n\tfor (unsigned int i = 0; i &lt; textures.size(); i++)\n\t{\n\t\tglActiveTexture(GL_TEXTURE0 + i);\n\t\tstd::string number;\n\t\tstd::string name = textures&#91;i].type;\n\t\tif (name == \"texture_diffuse\")\n\t\t\tnumber = std::to_string(diffuseNr++);\n\t\tif (name == \"texture_specular\")\n\t\t\tnumber == std::to_string(specularNr++);\n\t\tif (name == \"texture_normal\")\n\t\t\tnumber == std::to_string(normalNr++);\n\t\tif (name == \"texture_height\")\n\t\t\tnumber == std::to_string(heightNr++);\n\t\tshader.setInt((\"material.\" + name + number).c_str(), i);\n\t\tglBindTexture(GL_TEXTURE_2D, textures&#91;i].id);\n\t}\n\n\tglActiveTexture(GL_TEXTURE0);\n\t\/\/\u7ed8\u5236\u7f51\u683c\n\tglBindVertexArray(VAO);\n\tglDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);\n\tglBindVertexArray(0);\n}\n\n\/\/\u521d\u59cb\u5316Mesh\nvoid Mesh::setupMesh() \n{\n\tglGenVertexArrays(1, &amp;VAO);\n\tglBindVertexArray(VAO);\n\n\tglGenBuffers(1, &amp;VBO);\n\tglBindBuffer(GL_ARRAY_BUFFER, VBO);\n\tglBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &amp;vertices&#91;0], GL_STATIC_DRAW);\n\n\tglGenBuffers(1, &amp;EBO);\n\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);\n\tglBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &amp;indices&#91;0], GL_STATIC_DRAW);\n\n\t\n\t\/\/\u9876\u70b9\u4f4d\u7f6e\n\tglEnableVertexAttribArray(0);\n\tglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);\n\n\t\/\/\u9876\u70b9\u6cd5\u7ebf\n\tglEnableVertexAttribArray(1);\n\tglVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal));\n\n\t\/\/\u7eb9\u7406\u5750\u6807\n\tglEnableVertexAttribArray(2);\n\tglVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, TexCoords));\n\t\n\tglBindVertexArray(0);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Model\u7c7b<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">\u6570\u636e\u7ed3\u6784<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ assimp\u6a21\u578b\u52a0\u8f7d\u5e93\n#include &lt;assimp\/Importer.hpp&gt;\n#include &lt;assimp\/scene.h&gt;\n#include &lt;assimp\/postprocess.h&gt;\n\n#include &lt;vector&gt;\n#include &lt;iostream&gt;\n\n#include \"Shader.h\"\n#include \"Mesh.h\"\n\n\n#pragma once\nclass Model\n{\npublic:\n\tModel(const char* path);\n\tvoid Draw(Shader shader);\n\nprivate:\n\t\/\/ \u6a21\u578b\u6570\u636e\n\tstd::vector&lt;Mesh&gt; meshes;\n\t\/\/\u6a21\u578b\u8d44\u6e90\u6240\u5728\u6587\u4ef6\u5939\u8def\u5f84\n\tstd::string directory;\n\t\/\/\u5df2\u52a0\u8f7d\u7684\u8d34\u56fe\n\tstd::vector&lt;Texture&gt; textures_loaded;\n\t\/\/\u52a0\u8f7d\u6a21\u578b\n\tvoid loadModel(std::string path);\n\t\/\/\u5904\u7406\u8282\u70b9\u6570\u636e\n\tvoid processNode(aiNode* node, const aiScene* scene);\n\t\/\/\u5904\u7406Mesh\u6570\u636e\n\tMesh processMesh(aiMesh* mesh, const aiScene* scene);\n\t\/\/\u52a0\u8f7d\u6750\u8d28\u8d34\u56fe\n\tstd::vector&lt;Texture&gt; loadMaterialTextures(aiMaterial* mat, aiTextureType type, std::string typeName);\n\t\/\/\u4ece\u6587\u4ef6\u52a0\u8f7d\u8d34\u56fe\n\tunsigned int TextureFromFile(const char* path, const std::string&amp; directory, bool gamma = false);\n};\n\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u903b\u8f91\u4ee3\u7801<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"Model.h\"\n\n\/\/\u56fe\u7247\u52a0\u8f7d\u5e93\n#define STB_IMAGE_IMPLEMENTATION\n#include \"stb_image.h\"\n\nModel::Model(const char* path) \n{\n\tloadModel(path);\n}\n\n\/\/DrawCall\nvoid Model::Draw(Shader shader)\n{\n\tfor (unsigned int i = 0; i &lt; meshes.size(); i++)\n\t{\n\t\tmeshes&#91;i].Draw(shader);\n\t}\n}\n\n\/\/\u52a0\u8f7d\u6a21\u578b\nvoid Model::loadModel(std::string path)\n{\n\tAssimp::Importer importer;\n\tconst aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);\n\n\tif (!scene || scene-&gt;mFlags &amp; AI_SCENE_FLAGS_INCOMPLETE || !scene-&gt;mRootNode)\n\t{\n\t\tstd::cout &lt;&lt; \"ERROR::ASSIMP::\" &lt;&lt; importer.GetErrorString() &lt;&lt; std::endl;\n\t\treturn;\n\t}\n\tdirectory = path.substr(0, path.find_last_of('\/'));\n\tprocessNode(scene-&gt;mRootNode, scene);\n}\n\n\/\/\u5904\u7406\u8282\u70b9\u6570\u636e\nvoid Model::processNode(aiNode* node, const aiScene* scene)\n{\n\tfor (unsigned int i = 0; i &lt; node-&gt;mNumMeshes; i++)\n\t{\n\t\taiMesh* mesh = scene-&gt;mMeshes&#91;node-&gt;mMeshes&#91;i]];\n\t\tmeshes.push_back(processMesh(mesh, scene));\n\t}\n\tfor (unsigned int i = 0; i &lt; node-&gt;mNumChildren; i++)\n\t{\n\t\tprocessNode(node-&gt;mChildren&#91;i], scene);\n\t}\n}\n\n\/\/\u5904\u7406Mesh\u6570\u636e\nMesh Model::processMesh(aiMesh* mesh, const aiScene* scene)\n{\n\tstd::vector&lt;Vertex&gt; vertices;\n\tstd::vector&lt;unsigned int&gt; indices;\n\tstd::vector&lt;Texture&gt; textures;\n\n\t\/\/ \u5904\u7406\u9876\u70b9\u4f4d\u7f6e\u3001\u6cd5\u7ebf\u548c\u7eb9\u7406\u5750\u6807\n\tfor (unsigned int i = 0; i &lt; mesh-&gt;mNumVertices; i++)\n\t{\n\t\tVertex vertex;\n\t\tglm:: vec3 vector = glm::vec3(0);\n\t\t\/\/\u9876\u70b9\u4f4d\u7f6e\n\t\tvector.x = mesh-&gt;mVertices&#91;i].x;\n\t\tvector.y = mesh-&gt;mVertices&#91;i].y;\n\t\tvector.z = mesh-&gt;mVertices&#91;i].z;\n\t\tvertex.Position = vector;\n\n\t\t\/\/\u6cd5\u7ebf\n\t\tif (mesh-&gt;HasNormals()) \n\t\t{\n\t\t\tvector.x = mesh-&gt;mNormals&#91;i].x;\n\t\t\tvector.y = mesh-&gt;mNormals&#91;i].y;\n\t\t\tvector.z = mesh-&gt;mNormals&#91;i].z;\n\t\t\tvertex.Normal = vector;\n\t\t}\n\n\t\t\/\/\u5207\u7ebf\n\t\tif (mesh-&gt;HasTangentsAndBitangents())\n\t\t{\n\t\t\t\/\/ tangent\n\t\t\tvector.x = mesh-&gt;mTangents&#91;i].x;\n\t\t\tvector.y = mesh-&gt;mTangents&#91;i].y;\n\t\t\tvector.z = mesh-&gt;mTangents&#91;i].z;\n\t\t\tvertex.Tangent = vector;\n\t\t\t\/\/ bitangent\n\t\t\tvector.x = mesh-&gt;mBitangents&#91;i].x;\n\t\t\tvector.y = mesh-&gt;mBitangents&#91;i].y;\n\t\t\tvector.z = mesh-&gt;mBitangents&#91;i].z;\n\t\t\tvertex.Bitangent = vector;\n\t\t}\n\n\t\t\/\/\u7eb9\u7406\u5750\u6807\n\t\tglm::vec2 vec = glm::vec2(0);\n\t\tif (mesh-&gt;mTextureCoords&#91;0])\n\t\t{\n\t\t\tvec.x = mesh-&gt;mTextureCoords&#91;0]&#91;i].x;\n\t\t\tvec.y = mesh-&gt;mTextureCoords&#91;0]&#91;i].y;\n\t\t}\n\t\tvertex.TexCoords = vec;\n\n\t\tvertices.push_back(vertex);\n\t}\n\n\t\/\/\u5904\u7406\u7d22\u5f15\n\tfor (unsigned int i = 0; i &lt; mesh-&gt;mNumFaces; i++)\n\t{\n\t\taiFace face = mesh-&gt;mFaces&#91;i];\n\t\tfor (unsigned int j = 0; j &lt; face.mNumIndices; j++)\n\t\t{\n\t\t\tindices.push_back(face.mIndices&#91;j]);\n\t\t}\n\t}\n\n\t\/\/\u5904\u7406\u6750\u8d28\n\tif (mesh-&gt;mMaterialIndex &gt;= 0)\n\t{\n\t\taiMaterial* material = scene-&gt;mMaterials&#91;mesh-&gt;mMaterialIndex];\n\t\t\/\/ 1. diffuse maps\n\t\tstd::vector&lt;Texture&gt; diffuseMaps = loadMaterialTextures(material, aiTextureType_DIFFUSE, \"texture_diffuse\");\n\t\ttextures.insert(textures.end(), diffuseMaps.begin(), diffuseMaps.end());\n\t\t\/\/ 2. specular maps\n\t\tstd::vector&lt;Texture&gt; specularMaps = loadMaterialTextures(material, aiTextureType_SPECULAR, \"texture_specular\");\n\t\ttextures.insert(textures.end(), specularMaps.begin(), specularMaps.end());\n\t\t\/\/ 3. normal maps\n\t\tstd::vector&lt;Texture&gt; normalMaps = loadMaterialTextures(material, aiTextureType_HEIGHT, \"texture_normal\");\n\t\ttextures.insert(textures.end(), normalMaps.begin(), normalMaps.end());\n\t\t\/\/ 4. height maps\n\t\tstd::vector&lt;Texture&gt; heightMaps = loadMaterialTextures(material, aiTextureType_AMBIENT, \"texture_height\");\n\t\ttextures.insert(textures.end(), heightMaps.begin(), heightMaps.end());\n\t}\n\n\treturn Mesh(vertices, indices, textures);\n}\n\n\/\/\u52a0\u8f7d\u6750\u8d28\u8d34\u56fe\nstd::vector&lt;Texture&gt; Model::loadMaterialTextures(aiMaterial* mat, aiTextureType type, std::string typeName) \n{\n\tstd::vector&lt;Texture&gt; textures;\n\tfor (unsigned int i = 0; i &lt; mat-&gt;GetTextureCount(type); i++) \n\t{\n\t\taiString str;\n\t\tmat-&gt;GetTexture(type, i, &amp;str);\n\t\tbool skip = false;\n\t\tfor (unsigned int j = 0; j &lt; textures_loaded.size(); j++)\n\t\t{\n\t\t\tif (std::strcmp(textures_loaded&#91;j].path.data(), str.C_Str()) == 0)\n\t\t\t{\n\t\t\t\ttextures.push_back(textures_loaded&#91;j]);\n\t\t\t\tskip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!skip)\n\t\t{\n\t\t\tTexture texture;\n\t\t\ttexture.id = TextureFromFile(str.C_Str(), directory);\n\t\t\ttexture.type = typeName;\n\t\t\ttexture.path = str.C_Str();\n\t\t\ttextures.push_back(texture);\n\t\t\t\/\/\u6dfb\u52a0\u5230\u5df2\u52a0\u8f7d\u7684\u7eb9\u7406\u4e2d\n\t\t\ttextures_loaded.push_back(texture);\n\t\t}\n\t}\n\treturn textures;\n}\n\n\/\/\u4ece\u6587\u4ef6\u52a0\u8f7d\u8d34\u56fe\nunsigned int Model::TextureFromFile(const char* path, const std::string&amp; directory, bool gamma)\n{\n\tstd::string filename = std::string(path);\n\tfilename = directory + '\/' + filename;\n\n\tunsigned int textureID;\n\tglGenTextures(1, &amp;textureID);\n\n\tint width, height, nrComponents;\n\tunsigned char* data = stbi_load(filename.c_str(), &amp;width, &amp;height, &amp;nrComponents, 0);\n\tif (data)\n\t{\n\t\tGLenum format;\n\t\tif (nrComponents == 1)\n\t\t\tformat = GL_RED;\n\t\telse if (nrComponents == 3)\n\t\t\tformat = GL_RGB;\n\t\telse if (nrComponents == 4)\n\t\t\tformat = GL_RGBA;\n\n\t\tglBindTexture(GL_TEXTURE_2D, textureID);\n\t\tglTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);\n\t\tglGenerateMipmap(GL_TEXTURE_2D);\n\n\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n\t\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\n\t\tstbi_image_free(data);\n\t}\n\telse\n\t{\n\t\tstd::cout &lt;&lt; \"Texture failed to load at path: \" &lt;&lt; path &lt;&lt; std::endl;\n\t\tstbi_image_free(data);\n\t}\n\n\treturn textureID;\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.acgloby.com\/wp-content\/uploads\/2022\/08\/model.jpg\" alt=\"OpenGL-\u52a0\u8f7d\u6a21\u578b\u8d44\u6e90\" title=\"OpenGL-\u52a0\u8f7d\u6a21\u578b\u8d44\u6e90\"><img decoding=\"async\" src=\"https:\/\/www.acgloby.com\/wp-content\/uploads\/2022\/08\/model-553x1024.jpg\" alt=\"\" class=\"wp-image-926\"\/><\/a><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.acgloby.com\/wp-content\/uploads\/2022\/08\/image-14.png\" alt=\"\" class=\"wp-image-928\"\/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">\u5b8c\u6574\u5de5\u7a0b\u4ee3\u7801Github\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">[github repo=\"acgloby\/LearnOpenGL\"]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Mesh\u7c7b \u6570\u636e\u7ed3\u6784 \u903b\u8f91\u4ee3\u7801 C++\u7ed3\u6784\u4f53\u6709\u4e00\u4e2a\u5f88\u68d2\u7684\u7279\u6027\uff0c\u5b83\u4eec\u7684\u5185\u5b58\u5e03\u5c40\u662f\u8fde\u7eed\u7684(Sequential)\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5982\u679c\u5c06\u7ed3\u6784 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":928,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[3],"tags":[],"class_list":["post-920","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-graphics"],"_links":{"self":[{"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/posts\/920","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/comments?post=920"}],"version-history":[{"count":0,"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/posts\/920\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/media?parent=920"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/categories?post=920"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.acgloby.com\/index.php\/wp-json\/wp\/v2\/tags?post=920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}