{"id":2164,"date":"2020-09-17T10:26:28","date_gmt":"2020-09-17T02:26:28","guid":{"rendered":"https:\/\/sforest.in\/?p=2164"},"modified":"2020-09-17T10:26:28","modified_gmt":"2020-09-17T02:26:28","slug":"first-time-of-three-js","status":"publish","type":"post","link":"https:\/\/sforest.in\/ja\/first-time-of-three-js\/","title":{"rendered":"\u5e74\u8f7b\u4eba\u7684\u7b2c\u4e00\u6b21Three.js"},"content":{"rendered":"<p>\u5728\u534e\u5de5\u7684\u8f6f\u4ef6\u5b66\u9662\uff0c\u5230\u4e86\u5927\u4e09\u662f\u8981\u4e13\u4e1a\u5206\u6d41\u7684 \u2014\u2014 \u6570\u5b57\u5a92\u4f53\u3001\u4eba\u5de5\u667a\u80fd\u3001\u79fb\u52a8\u5f00\u53d1\u3001\u5d4c\u5165\u5f0f\u3002<\/p>\n\n\n\n<p>\u4e00\u5e74\u7684\u4e13\u4e1a\u8bfe\uff0c\u80fd\u5b66\u7684\u4e1c\u897f\u5176\u5b9e\u4e5f\u6709\u9650\u3002\u4e0d\u5982\u8bf4\u4e3b\u8981\u8fd8\u662f\u9760\u81ea\u5df1\u6298\u817e\uff0c\u5c31\u8c61\u4ee5\u524d\u90a3\u6837\u3002<\/p>\n\n\n\n<p>\u4e8e\u662f\u6700\u540e\u6211\u9009\u4e86\u6570\u5b57\u5a92\u4f53\uff0c\u505a\u70b9\u56fe\u5f62\u5b66\u7684\u5b9e\u9a8c\uff0c\u5e94\u8be5\u6bd4\u8f83\u6709\u610f\u601d\u5427<s>\uff08\u867d\u7136\u4ed6\u4eec\u90fd\u8bf4\u662f\u706b\u5751<\/s><\/p>\n\n\n\n<!--more-->\n\n\n\n<h1 class=\"wp-block-heading\">\u7b2c\u4e00\u8282\u8bfe<\/h1>\n\n\n\n<p>\u8001\u5e08\u4e0a\u8bfe\u6253\u54c8\u54c8\uff0c\u6211\u5728\u4e0b\u9762\u6253\u54c8\u6b20\u3002\u54d7\u5566\u54d7\u5566\u5730\uff08\u2190\u6839\u672c\u6ca1\u4e70\u4e66\uff09\u7ffb\u8bfe\u672c\uff0c\u770b\u5230\u4e00\u4e2a<a href=\"https:\/\/en.wikipedia.org\/wiki\/Sierpi%C5%84ski_triangle\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Sierpi%C5%84ski_triangle\">Sierpi\u0144ski triangle<\/a>\u7684\u751f\u6210\u7b97\u6cd5\uff0c\u968f\u624b\u7528Love2D\u5b9e\u73b0\u4e86\u4e00\u4e2a\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"lua\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">tri = {{110, 100}, {10, 500}, {700, 300}}\n\npoints = {}\n\np = {200, 300}\n\nfunction love.update()\n    for i = 1, 1000 do\n        local t = tri[math.random(1, 3)]\n        local q = {(t[1] + p[1]) \/ 2, (t[2] + p[2]) \/ 2, 1, 0, 255, 255}\n        table.insert(points, q)\n        p = q\n    end\nend\n\nfunction love.draw()\n    love.graphics.polygon('fill', tri[1][1], tri[1][2], tri[2][1], tri[2][2], tri[3][1], tri[3][2])\n    love.graphics.points(points)\nend<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/sforest.in\/wp-content\/uploads\/2020\/09\/image-1024x807.png\" alt=\"\" class=\"wp-image-2165\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u7b2c\u4e8c\u8282\u8bfe<\/h1>\n\n\n\n<p><s>\u96e8\u5b9e\u5728\u592a\u5927\u4e86\uff08\u4e0b\u7565<\/s><\/p>\n\n\n\n<p>\u6ca1\u60f3\u5230\u4e0a\u8282\u8bfe\u4e0a\u7cca\u7684\u5206\u5f62\u5c31\u662f\u8fd9\u8282\u8bfe\u7684\u4f5c\u4e1a\uff0c\u53ea\u662f\u8fd9\u56de\u8981\u6c42\u300c<strong>program with OpenGL Shader or WebGL with JavaScript three.js<\/strong>\u300d\u3002<\/p>\n\n\n\n<p>OpenGL\u4e5f\u4e0d\u662f\u7b2c\u4e00\u6b21\u6253\u4ea4\u9053\u4e86\uff0c\u753b\u4e2a\u4e09\u89d2\u5f62\u518d\u753b\u4e9b\u70b9\uff0c\u60f3\u5fc5\u4e00\u4e24\u4e0b\u5c31\u5f04\u5b8c\u4e86\u5427\uff08\u867d\u7136\u770b\u65c1\u8fb9\u7684Bobby\u7528OpenGL\u505a\uff0c\u597d\u50cf\u4e5f\u4e0d\u662f\u60f3\u8c61\u4e2d\u7684\u90a3\u4e48\u767d\u7ed9\uff09\u3002<\/p>\n\n\n\n<p>\u56e0\u4e3a\u4e0d\u60f3\u518d\u914d\u7f6e\u73af\u5883\u4e86\uff0c\u5e72\u8106\u5c31\u7528WebGL\u505a\u5427\uff0c\u51fd\u6570\u5927\u6982\u4e5f\u5dee\u4e2a\u516b\u4e5d\u4e0d\u79bb\u5341\u2026\u2026\uff1f<\/p>\n\n\n\n<p>\u4e00\u770b<a href=\"https:\/\/threejs.org\/docs\/index.html#manual\/en\/introduction\/Creating-a-scene\" data-type=\"URL\" data-id=\"https:\/\/threejs.org\/docs\/index.html#manual\/en\/introduction\/Creating-a-scene\">Three.js\u7684\u6587\u6863<\/a>\uff0c\u8fd9\u957f\u5f97\u5b8c\u5168\u4e0d\u4e00\u6837\u561b\u3002\u867d\u8bf4Three.js\u662fWebGL\u7684\u5c01\u88c5\uff0cWebGL\u7531OpenGL ES\u6d3e\u751f\uff0cOpenGL ES\u662fOpenGL\u7684\u5b50\u96c6\uff0c\u4f46\u662f\u4e4d\u4e00\u770b\u4e5f\u6ca1\u770b\u52302D\u7ed8\u56fe\u51fd\u6570\uff0c\u5c31\u6709\u70b9\u8111\u58f3\u75bc\u4e86\u3002\u662f\u4e0d\u662f\u8fd8\u6709\u4e2aTwo.js\u554a\uff08<\/p>\n\n\n\n<p>\u4e0d\u8fc7\u90fd\u6253\u5f00\u4e86VS Code\uff0c\u88c5\u597d\u4e86Power Mode\u63d2\u4ef6\uff0c\u751a\u81f3\u65b0\u5efa\u4e86html\u6587\u4ef6<s>\uff08\u5b8c\u5168\u4e0d\u5145\u5206\u7684\u7406\u7531\uff09<\/s>\uff0c\u90a3\u5c31\u8fd9\u4e48\u5f80\u4e0b\u5199\u5427\u3002\u534a\u4e2a\u5c0f\u65f6\u5e94\u8be5\u5c31\u80fd\u5199\u5b8c\u4e86\u5427\u3002\uff08\u2190\u6700\u540e\u5199\u4e86\u56db\u4e2a\u5c0f\u65f6\uff09<\/p>\n\n\n\n<p>\u5728\u91cd\u590d\u4e86\u82e5\u5e72\u6b21\uff1c\u9605\u8bfb\u6587\u6863\u2192\u6284\u6587\u6863\u4ee3\u7801\u2192\u628a\u4e0d\u80fd\u8dd1\u7684\u90e8\u5206\u62d6\u51fa\u6765\u6362\u6210StackOverflow\u4e0a\u7684\u4ee3\u7801\u518d\u8bd5\u8bd5\u2192\u641e\u6e05\u695a\u4e3a\u4ec0\u4e48\u4ee3\u7801\u4e0d\u80fd\u8dd1\uff1e\u7684\u8fc7\u7a0b\u4e4b\u540e\uff0c\u6211\u7ec8\u4e8e\u5f97\u5230\u4e86<a href=\"https:\/\/sjoshua.github.io\/Computer-Graphics-Learning\/chapt-2\/sierpinski_gasket.html\" data-type=\"URL\" data-id=\"https:\/\/sjoshua.github.io\/Computer-Graphics-Learning\/chapt-2\/sierpinski_gasket.html\">\u4e00\u4e2a\u80fd\u8dd1\u7684\u7248\u672c<\/a>\u3002\u603b\u4f53\u4e0a\u6765\u8bb2\uff0cJS\u7684\u5f00\u53d1\/\u8c03\u8bd5\u8fd8\u662f\u6bd4\u8f83\u8f7b\u677e\u7684\uff08\u6bd5\u7adf\u6709F12\uff09\u3002\u4e0d\u8fc7\u76f8\u6bd4C++\uff0c\u5b83\u5c31\u6ca1\u80fd\u5f88\u597d\u7684\u63d0\u793a\u51fd\u6570\u7684\u53c2\u6570\u548c\u63cf\u8ff0\uff08\u4e5f\u6709\u53ef\u80fd\u662f\u914d\u7f6e\u4e0d\u5408\u7406\uff09\uff1b\u5728DevTools\u91cc\u7684Console\u5199\u4ee3\u7801\u5012\u4e5f\u662f\u6ee1\u6109\u5feb\u7684\uff08x<\/p>\n\n\n\n<p>\u7528Three.js\uff0c\u9996\u5148\u8981\u521d\u59cb\u5316\u573a\u666f\u3001\u6e32\u67d3\u5668\u548c\u6444\u50cf\u673a\uff0c\u6709\u4e86\u8fd9\u4ee8\u5c31\u80fd\u5f00\u59cb\u753b\u4e1c\u897f\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">renderer.render(scene, camera);<\/pre>\n\n\n\n<p>\u63a5\u7740\u521b\u5efa\u6211\u4eec\u9700\u8981\u7684Geometry\u5bf9\u8c61\uff0c\u7136\u540e\u5f80\u91cc\u9762\u586b\u5145\u5c5e\u6027\u3002\u9664\u6b64\u4e4b\u5916\uff0c\u8fd8\u9700\u8981Material\uff0c\u4e4b\u540e\u5c31\u53ef\u4ee5\u7528Geometry\u548cMaterial\u6765\u521b\u5efa\u5bf9\u8c61\u3002\u628a\u521b\u5efa\u51fa\u6765\u7684\u4e1c\u897f\u585e\u8fdbscene\u91cc\u9762\uff0c\u5c31\u53ef\u4ee5\u6e32\u67d3\u4e86\u3002<\/p>\n\n\n\n<p>\u4e3b\u8981\u9047\u5230\u7684\u5751\u662fGeometry\u4e0d\u80fd\u52a8\u6001\u52a0\u70b9\uff0c\u8981\u5b9e\u73b0\u52a8\u753b\u6548\u679c\u9700\u8981\u7528BufferGeometry\u3002\u867d\u7136\u4f5c\u4e1a\u4e5f\u6ca1\u8981\u6c42\u52a8\u753b\u5c31\u662f\u4e86\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u8ffd\u8bb0<\/h1>\n\n\n\n<p>\u56de\u53bb\u53c8\u5ba1\u4e86\u4e00\u904d\u9898\uff0cOpenGL\u8981shader\uff0cWebGL\u5c31\u4e0d\u8981shader\u611f\u89c9\u597d\u50cf\u4e5f\u4e0d\u662f\u5f88\u5bf9\uff08<s>\u4e07\u4e00\u5b83\u5199\u6f0f\u4e86\u5462<\/s><\/p>\n\n\n\n<p>\u8981\u7528\u4e0ashader\u5e76\u4e0d\u662f\u4ec0\u4e48\u96be\u4e8b\uff0c\u5927\u4f53\u4e0a\u53ea\u9700\u8981\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>\u628a\u5bf9\u5e94\u7684material\u6362\u6210ShaderMaterial\u6216\u8005RawShaderMaterial\uff08\u533a\u522b\u5728\u4e8e\u524d\u8005\u4f1a\u5f15\u5165\u4e00\u4e9bThree.js\u7684\u79c1\u8d27\uff0c\u6bd4\u5982position\u4e4b\u7c7b\u7684\uff0c\u53ef\u4ee5\u8ba9Shader\u7a0b\u5e8f\u7b80\u5355\u4e00\u4e9b\uff09\uff1b<\/li><li>\u7528BufferGeometry\u66ff\u6362Geometry\u3002<\/li><\/ol>\n\n\n\n<p>\u5728\u5b9a\u4e49ShaderMaterial\u65f6\u9700\u8981\u4f20\u5165shader\u7684\u4ee3\u7801\uff0c\u4f8b\u5982\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;script id=\"vertexShader\" type=\"x-shader\/x-vertex\">\n\tvoid main()\t{\n\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n\t}\n&lt;\/script>\n\n&lt;script id=\"fragmentShader\" type=\"x-shader\/x-fragment\">\n\tvoid main()\t{\n\t\tgl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n\t}\n&lt;\/script><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var material = new THREE.ShaderMaterial({\n\tvertexShader: document.getElementById('vertexShader').textContent,\n\tfragmentShader: document.getElementById('fragmentShader').textContent,\n\tuniforms: uniforms\n});\n<\/pre>\n\n\n\n<p>\u5176\u4e2d\uff0cuniforms\u662f\u5916\u90e8\u4f20\u5165\u7ed9shader\u7684\u53c2\u6570\uff0c\u901a\u8fc7\u5b83\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0<a href=\"https:\/\/sjoshua.github.io\/Computer-Graphics-Learning\/chapt-2\/sierpinski_gasket_with_shader.html\" data-type=\"URL\" data-id=\"https:\/\/sjoshua.github.io\/Computer-Graphics-Learning\/chapt-2\/sierpinski_gasket_with_shader.html\">\u968f\u65f6\u95f4\u53d8\u5316\u7684\u52a8\u753b\u6548\u679c<\/a>\u3002<\/p>\n\n\n\n<p>\u518d\u5f80\u4e0b\u4e00\u6b21\u7684\u4f5c\u4e1a\u662f\u7ebf\u6027\u4ee3\u6570\u9898\uff0c\u7b49\u4e0b\u4e00\u4e2aexperiment\u51fa\u4e86\u518d\u7eed\u5427\uff08\u771f\u7684\u4f1a\u6709\u7eed\u7bc7\u5417<\/p>","protected":false},"excerpt":{"rendered":"<p>\u5728\u534e\u5de5\u7684\u8f6f\u4ef6\u5b66\u9662\uff0c\u5230\u4e86\u5927\u4e09\u662f\u8981\u4e13\u4e1a\u5206\u6d41\u7684 \u2014\u2014 \u6570\u5b57\u5a92\u4f53\u3001\u4eba\u5de5\u667a\u80fd\u3001\u79fb\u52a8\u5f00\u53d1\u3001\u5d4c\u5165\u5f0f\u3002 \u4e00\u5e74\u7684\u4e13\u4e1a\u8bfe\uff0c\u80fd\u5b66\u7684\u4e1c\u897f\u5176\u5b9e\u4e5f\u6709\u9650\u3002\u4e0d\u5982\u8bf4\u4e3b\u8981\u8fd8\u662f\u9760\u81ea\u5df1\u6298\u817e\uff0c\u5c31\u8c61\u4ee5\u524d\u90a3\u6837\u3002 \u4e8e\u662f\u6700\u540e\u6211\u9009\u4e86\u6570\u5b57\u5a92\u4f53\uff0c\u505a\u70b9\u56fe\u5f62\u5b66\u7684\u5b9e\u9a8c\uff0c\u5e94\u8be5\u6bd4\u8f83\u6709\u610f &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/sforest.in\/ja\/first-time-of-three-js\/\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;\u5e74\u8f7b\u4eba\u7684\u7b2c\u4e00\u6b21Three.js&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[18,23,44],"class_list":["post-2164","post","type-post","status-publish","format-standard","hentry","category-coding","tag-cg","tag-javascript","tag-three-js"],"_links":{"self":[{"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/posts\/2164","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/comments?post=2164"}],"version-history":[{"count":0,"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/posts\/2164\/revisions"}],"wp:attachment":[{"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/media?parent=2164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/categories?post=2164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sforest.in\/ja\/wp-json\/wp\/v2\/tags?post=2164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}