GIS ๊ฐ์ 1๊ฐ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ & 2๊ฐ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์์ ์ฝ๋
three.js์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์
Renderer
Scene์ ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๋ ๋ ๋๋ฌ
Scene
3์ฐจ์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ ์ฅ๋ฉด. Light์ Mesh๋ก ๊ตฌ์ฑ๋จ
Light
3์ฐจ์ ํ์์ด ํ๋ฉด ์์ ํ์๋๊ธฐ ์ํ ๊ด์
Mesh
Object3D์ ํ์ ํด๋์ค. Geometry์ Material๋ก ๊ตฌ์ฑ
- Geometry: ํ์์ ์ ์
- Material: ์์ ๋ฐ ํฌ๋ช ๋ ๋ฑ์ ์ ์
Camera
Scene์ ๋ฐ๋ผ๋ณด๋ ์์ .
3์ฐจ์์ Scene์ ์ด๋ ์์ ์์ ๋ฐ๋ผ๋ณด๋๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ณด์. Camera๋ก ์ด ์์ ์ ์ ์ํ ์ ์๋ค.
PRACTICE: ํ์ ํ๋ ํ๋์ ์ ์ก๋ฉด์ฒด ๋ ๋๋งํ๊ธฐ
id๊ฐ webgl-container
์ธ div element ์์ 3์ฐจ์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๋ค.
1. WebGL ๋ ๋๋ฌ ์์ฑ THREE.WebGLRenderer
- antialias ์ต์ ์ true๋ก ์ฃผ๋ฉด 3์ฐจ์ ์ฅ๋ฉด์ด ๋ ๋๋ง๋ ๋ ์ค๋ธ์ ํธ๋ค์ ๊ฒฝ๊ณ์ ์ด ๊ณ๋จ ํ์ ์์ด ๋ถ๋๋ฝ๊ฒ ํํ๋๋ค.
setPixelRatio
๋ฉ์๋๋ก ํฝ์ ๋น์จ์window.devicePixelRatio
๋ก ์ค์ ํ๋ค. ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ๋ง๋ ํฝ์ ๋น์จ์ ์ฌ์ฉํ ์ ์๋ค.renderer.domElement
: canvas ํ์ ์ DOM ๊ฐ์ฒด๋ก,webgl-container
์ ์์์ผ๋ก ์ถ๊ฐํ๋ค. ์ฌ๊ธฐ์ ๋ด๊ฐ ๋ง๋ Scene์ด ๋ ๋๋ง ๋ ๊ฒ์ด๋ค.
2. Scene ๊ฐ์ฒด ์์ฑ THREE.Scene()
3. Camera ์
์
THREE.PerspectiveCamera
- Camera ๊ฐ์ฒด ์์ฑ ์ fov, aspect, near, far๋ฅผ ์ง์ ํ ์ ์๋ค. (๋ค์ ๊ฐ์์์ ์์ธํ ์ค๋ช )
- aspect๋ฅผ
webgl-container
(๋ ๋๋ฌ DOM ์๋ฆฌ๋จผํธ์ ๋ถ๋ชจ ์๋ฆฌ๋จผํธ)์ aspect์ ๊ฐ๊ฒ ์ค์ ํ๋ค. - Camera ๊ฐ์ฒด์ position ํ๋๋ก ์์น๋ฅผ ์ง์ ํ ์ ์๋ค.
4. Light ์
์
THREE.DirectionalLight
- ๊ด์ ์์ฑ ์ ๊ด์์ ์์, ์ธ๊ธฐ, ์์น ๊ฐ์ ์ง์ ํ๋ค.
- ์์ฑ๋ Light ๊ฐ์ฒด๋ฅผ Scene์ ์ถ๊ฐํ๋ค.
5. Mesh(Model) ์
์
THREE.Mesh
- Mesh๋ Geometry(
THREE.BoxGeometry
) ๊ฐ์ฒด์ Material(THREE.MeshPhongMaterial
) ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ค. - BoxGeometry: ์ ์ก๋ฉด์ฒด ํ์์ ์ ์ํ๋ค. ๊ฐ๋ก, ์ธ๋ก, ๊น์ด๋ฅผ ์ง์ ํ ์ ์๋ค.
- MeshPhongMaterial: ์ ์ก๋ฉด์ฒด์ ์์์ ์ ์ํ๋ค.
- ์์ฑ๋ Mesh ๊ฐ์ฒด(
cube
)๋ Scene์ ์ถ๊ฐํ๋ค.
6. resize ์ด๋ฒคํธ ํธ๋ค๋ฌ
- resize ์ด๋ฒคํธ๊ฐ ํ์ํ ์ด์ : Renderer๋ Camera๋ ์ฐฝ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค ๊ทธ ํฌ๊ธฐ์ ๋ง๊ฒ ์์ฑ ๊ฐ์ ์ฌ์ค์ ํด์ค์ผ ํจ.
- resize ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด
- Camera์ aspect๋ฅผ
webgl-container
์ aspect๋ก ๋ค์ ์ง์ ํ๋ค. aspect ์ง์ ํ Camera์updateProjectionMatrix
๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ๋ค. - Renderer์ ์ฌ์ด์ฆ๋ฅผ
webgl-container
ํฌ๊ธฐ๋ก ๋ณ๊ฒฝํ๋ค. Renderer์setSize
๋ฉ์๋ ์ฌ์ฉ
- Camera์ aspect๋ฅผ
- resize ๋ฉ์๋์ this binding ํ์ (this๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ์ฒด๊ฐ ์ด๋ฒคํธ ๊ฐ์ฒด๊ฐ ์๋๋ผ ์ด App ํด๋์ค์ ๊ฐ์ฒด๊ฐ ๋์ด์ผ ํ๋ฏ๋ก)
7. Renderer๋ก 3์ฐจ์ ๊ทธ๋ํฝ Scene์ ๋ ๋๋ง
- Renderer์ render ๋ฉ์๋๋ก ํ๋ฉด์ ๊ทธ๋ ค์ค๋ค.
- ํ๋ฉด์ ๊ทธ๋ฆด Scene๊ณผ Camera๋ฅผ ์ง์ ํ๋ค.
time
ํ๋ผ๋ฏธํฐ๋ก ๋ ๋๋ง์ด ์ฒ์ ์์๋ ์ดํ ๊ฒฝ๊ณผ๋ ์๊ฐ๊ฐ์ ms๋ก ๋ฐ๋๋ค.- ์ด
time
์ ์ด์ฉํด ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ๊ตฌํํ๋ค.- ํ๋ธ์
rotation
ํ๋๊ฐ์time
์ ๋ฐ๋ผ ๋ณํ์ํค๋ฉด์ ํ๋ธ๋ฅผ ํ์ ์ํจ๋ค.
- ํ๋ธ์
requestAnimationFrame
๋ฉ์๋๋ฅผ ํตํดrender
ํจ์๋ฅผ ํธ์ถํ๋ค. -> ์ ๋นํ ์์ ์, ๋๋ ์ต๋ํ ๋น ๋ฅด๊ฒrender
๊ฐ ํธ์ถ๋จ.
๋ง๋ฌด๋ฆฌ
๊ฐ๋ฐ ํ๊ฒฝ์ ์ฐ๋ฆฌ ํ์ด ํธํ ๋ฐฉ์๋๋ก ๊ณ์ ๋ณ๊ฒฝํ ๊ฒ ๊ฐ๋ค.
์ฐ๋ฆฌ๋ Webpack ์ค์ ๊ณผ yarn์ ์ด์ฉํด ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ์๋ค. ๊ฐ์์์๋ VScode์ Live Server ํ์ฅํฉ์ ์ด์ฉํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ๋ฐฉ์์ด์ง๋ง ์ฐ๋ฆฌ๋ webpack-server-dev ์คํฌ๋ฆฝํธ๋ก ์คํํ๋ค. (ํ๊ฒฝ ๊ตฌ์ถ์ ๋์์ฃผ์ ํ์๋ถ๊ป ๋ฌดํํ ๊ฐ์ฌ๋ฅผ)
three.js๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋ ์ง ๋ฐฐ์ธ ์ ์์๊ณ , ๊ฐ๋จํ ๋ ๋๋ง ์ค์ต์ ํตํด ํ ์ธต ๋ ์ด์๊ฐ ๋ถํ์ฌ๋๋ค. ํ์ ํ๋ ํ๋ ์ ์ก๋ฉด์ฒด๊ฐ ์ฒ์ ๋ ๋๋ง๋์์ ๋ ๋๋ฌด ์ ๊ธฐํ๊ณ ํฅ๋ถ๋๋ค. ๋นจ๋ฆฌ ๋ค์ ์คํฐ๋๋ฅผ ์งํํ๊ณ ์ถ๋ค!๐
๊ถ๊ธํ๋ ์ - Pixcel Ratio
Renderer์ setPixelRatio๋ ๋ ๋๋ง๋๋ ํด์๋๋ฅผ ์กฐ์ ํ ์ ์๋ ๋ฉ์๋์ธ๋ฐ, Pixel Ratio์ ๊ฐ์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๋ ๋๋ง ๋๋ ์ง ๊ถ๊ธํ๋ค.
Pixel Ratio๊ฐ ๋ฎ์ผ๋ฉด ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง์ฒ๋ผ ์ค๋ธ์ ํธ๊ฐ ๊นจ์ ธ์ ๋ณด์ผ ์ ์๋ค.
์ค๋ธ์ ํธ๊ฐ ๊นจ์ง๋ฉด ์๋๋๊น ๊ทธ๋ผ Pixel Ratio๊ฐ์ ํญ์ window.devicePixelRatio
์ด์ด์ผ ํ๋ ๊ฒ ์๋๊ฐ? ๋ผ๋ ์ง๋ฌธ์ ์ฐ์
๋์์ธ๊ณผ ์ถ์ ๊ฐ๋ฐ์๋ถ์ด ์ด๋ฐ ์์๋ฅผ ์ฃผ์
จ๋ค.
์ด ์์๋ ๋๋ฌด ๊ท์ฝ๋ค. ์ค๋ฅธ์ชฝ ๋๋์ด ์ฒ๋ผ ์ผ๋ถ๋ก pixel ratio๋ฅผ ๋ฎ์ถฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ๋ค.
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[three.js] ๋ค์ํ ์ง์ค๋ฉํธ๋ฆฌ ์ฌ์ฉํด ๋ณด๊ธฐ (0) | 2023.06.01 |
---|---|
[ํด๋ฆฐ์ฝ๋] 2์ฅ ์๋ฏธ์๋ ์ด๋ฆ with Typescript (0) | 2023.05.28 |
[ํด๋ฆฐ์ฝ๋] 1์ฅ ๊นจ๋ํ ์ฝ๋๋ ๋ฌด์์ธ๊ฐ์ ๊ฐ๋ฐ์์ ์ฑ ์๊ณผ ์๋ฌด (0) | 2023.05.21 |
[ํด๋ฆฐ์ฝ๋] ์๋ก : ํด๋ฆฐ์ฝ๋ ์คํฐ๋๋ฅผ ์์ํ๋ฉฐ (1) | 2023.05.20 |
[three.js] 3D ์คํฐ๋๋ฅผ ์์ํ๋ฉฐ (0) | 2023.05.18 |