{"id":11717,"date":"2021-10-26T14:52:55","date_gmt":"2021-10-26T05:52:55","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=11717"},"modified":"2022-10-30T08:38:49","modified_gmt":"2022-10-29T23:38:49","slug":"3d-%eb%aa%a8%eb%8d%b8%ec%9d%84-%ed%99%94%eb%a9%b4%ec%97%90-%ea%b0%80%eb%93%9d-%ec%b1%84%ec%9a%b0%ea%b3%a0-%eb%b3%b4%eb%8a%94-%ec%8b%9c%ec%a0%90-%ec%a7%80%ec%a0%95%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=11717","title":{"rendered":"3D \ubaa8\ub378\uc744 \ud654\uba74\uc5d0 \uac00\ub4dd \ucc44\uc6b0\uace0 \ubcf4\ub294 \uc2dc\uc810 \uc9c0\uc815\ud558\uae30"},"content":{"rendered":"<p>three.js\ub97c \uc774\uc6a9\ud558\uc5ec 3D \ubaa8\ub378\uc744 \ubd88\ub7ec\uc640\uc11c \ud654\uba74\uc5d0 \ub80c\ub354\ub9c1 \ud560 \ub54c, \ud574\ub2f9 \ubaa8\ub378\uc758 \ud06c\uae30\uc640 \uc6d0\uc810\uc774 \ubaa8\ub450 \uc0c1\uc774\ud558\uc5ec \uc774\ub97c \uacf5\ud1b5\uc801\uc73c\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \ud568\uc218\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\n_zoomFit(object3D, camera, viewMode, bFront) {\r\n    const box = new THREE.Box3().setFromObject(object3D);\r\n    const sizeBox = box.getSize(new THREE.Vector3()).length();\r\n    const centerBox = box.getCenter(new THREE.Vector3());\r\n\r\n    let offsetX = 0, offsetY = 0, offsetZ = 0;\r\n    viewMode === \"X\" ? offsetX = 1 : (viewMode === \"Y\") ? offsetY = 1 : offsetZ = 1;\r\n    if(!bFront) {\r\n        offsetX *= -1;\r\n        offsetY *= -1;\r\n        offsetZ *= -1;\r\n    }\r\n    camera.position.set(centerBox.x + offsetX, centerBox.y + offsetY, centerBox.z + offsetZ);\r\n\r\n    const halfSizeModel = sizeBox * 0.5;\r\n    const halfFov = THREE.Math.degToRad(camera.fov * .5);\r\n    const distance = halfSizeModel \/ Math.tan(halfFov);\r\n\r\n    const direction = (new THREE.Vector3()).subVectors(camera.position, centerBox).normalize();\r\n\r\n    const position = direction.multiplyScalar(distance).add(centerBox);\r\n    camera.position.copy(position);\r\n\r\n    camera.near = sizeBox \/ 100;\r\n    camera.far = sizeBox * 100;\r\n\r\n    camera.updateProjectionMatrix();\r\n\r\n    camera.lookAt(centerBox.x, centerBox.y, centerBox.z);\r\n}\r\n<\/pre>\n<p>\uc2e4\uc81c \ud65c\uc6a9\uc740 \ub2e4\uc74c\ucc98\ub7fc fbx \ud615\uc2dd\uc758 \ubaa8\ub378 \ud30c\uc77c \ubd88\ub7ec\uc640 \ud654\uba74\uc0c1\uc5d0 \ub80c\ub354\ub9c1\ud558\ub294 \uc608\ub97c \ubcf4\uba74 \uc27d\uac8c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">\r\nloader.load('data\/Rumba Dancing.fbx', object => {\r\n    this._scene.add(object);\r\n    this._zoomFit(object, this._camera, \"X\", true);\r\n} );\r\n<\/pre>\n<p>\uc704\uc758 _zoomFit\uc758 \uc138\ubc88\uc9f8\uc640 \ub124\ubc88\uc9f8 \uc778\uc790\uc778 &#8220;X&#8221;, true\ub294 \uc591(plus)\uc758 X\ucd95 \ubc29\ud5a5\uc5d0\uc11c \ubc14\ub77c\ubcf8\ub2e4\ub294 \uc758\ubbf8\uc785\ub2c8\ub2e4. \uc704 \ucf54\ub4dc\uc758 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2021\/10\/zoomFit.png\" alt=\"\" width=\"1364\" height=\"871\" class=\"aligncenter size-full wp-image-11718\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>three.js\ub97c \uc774\uc6a9\ud558\uc5ec 3D \ubaa8\ub378\uc744 \ubd88\ub7ec\uc640\uc11c \ud654\uba74\uc5d0 \ub80c\ub354\ub9c1 \ud560 \ub54c, \ud574\ub2f9 \ubaa8\ub378\uc758 \ud06c\uae30\uc640 \uc6d0\uc810\uc774 \ubaa8\ub450 \uc0c1\uc774\ud558\uc5ec \uc774\ub97c \uacf5\ud1b5\uc801\uc73c\ub85c \ucc98\ub9ac\ud558\uae30 \uc704\ud55c \ud568\uc218\uc785\ub2c8\ub2e4. _zoomFit(object3D, camera, viewMode, bFront) { const box = new THREE.Box3().setFromObject(object3D); const sizeBox = box.getSize(new THREE.Vector3()).length(); const centerBox = box.getCenter(new THREE.Vector3()); let offsetX = 0, offsetY = 0, offsetZ = 0; viewMode === &#8220;X&#8221; ? offsetX &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=11717\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;3D \ubaa8\ub378\uc744 \ud654\uba74\uc5d0 \uac00\ub4dd \ucc44\uc6b0\uace0 \ubcf4\ub294 \uc2dc\uc810 \uc9c0\uc815\ud558\uae30&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[145,139],"tags":[],"class_list":["post-11717","post","type-post","status-publish","format-standard","hentry","category-three-js","category-webgl"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/11717","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11717"}],"version-history":[{"count":4,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/11717\/revisions"}],"predecessor-version":[{"id":13417,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/11717\/revisions\/13417"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11717"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11717"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11717"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}