8๊ฐ ์นด๋ฉ๋ผ
์นด๋ฉ๋ผ๋ Camera ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค. ๋ ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
- PerspectiveCamera: ์๊ทผ๊ฐ(๊ฑฐ๋ฆฌ๊ฐ)์ ํํํ๋ค.
- ๊ฐ๊น์ด ์๋ ๋ฌผ์ฒด๊ฐ ๋ฉ๋ฆฌ ์๋ ๋ฌผ์ฒด๋ณด๋ค ์๋์ ์ผ๋ก ํฌ๊ฒ ๋ณด์ด๋๋ก ๋ ๋๋ง
- OrthographicCamera: ์๊ทผ๊ฐ(๊ฑฐ๋ฆฌ๊ฐ) ์์ด ํํํ๋ค.
- ๋ฌผ์ฒด์ ์๋ ํฌ๊ธฐ๋๋ก ๋ ๋๋ง๋๋ค.
์ด ๋๊ฐ์ง ์นด๋ฉ๋ผ์ ์ฐจ์ด์ ์ ์์๋ณด์
PerspectiveCamera
์นด๋ฉ๋ผ๋ฅผ ์ ์ํ๊ธฐ ์ํด์ 4๊ฐ์ ์ธ์๊ฐ์ด ํ์
**์ ๋์ฒด: 4๊ฐ์ ๊ฐ์ ํตํด ๊ตฌ์ฑ๋ (์๋ ๊ทธ๋ฆผ์ ์ฐ๋์) ์ก๋ฉด์ฒด
์ด ์ ๋์ฒด ์์ ์กด์ฌํ๋ ๋ฌผ์ฒด๊ฐ ์นด๋ฉ๋ผ๋ฅผ ํตํด ๋ณด์ฌ์ง๊ณ ํ๋ฉด์ ๋ ๋๋ง๋๋ค.
- fovy: ์ ๋์ฒด ๋์ด ๋ฐฉํฅ์ ๊ฐ๋ (๋จ์: degree)
- aspect: ์ ๋์ฒด ๊ฐ๋ก ๊ธธ์ด๋ฅผ ์ธ๋ก ๊ธธ์ด๋ก ๋๋ ๋น์จ
- zNear, zFar: ์นด๋ฉ๋ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ
- ๊ฑฐ๋ฆฌ ์ฌ์ด์ ์กด์ฌํ๋ ๋ฌผ์ฒด์ ์ผ๋ถ๋ง ๋ ๋๋ง๋๊ณ ์ด ์์ญ์ ๋ฒ์ด๋๋ฉด ๋ ๋๋ง๋์ง ์๋๋ค.
const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 100);
camera.position.set(7, 7, 20); //์นด๋ฉ๋ผ์ ์์น ์ง์
camera.lookAt(0, 0, 0); // ์นด๋ฉ๋ผ๊ฐ ๋ฐ๋ผ๋ณด๋ ์์น ์ง์
- fovy๊ฐ์ 75๋
- aspect๋ 3์ฐจ์ ์ฅ๋ฉด์ด ๋ ๋๋ง๋๋ DOM ์์์ ๊ฐ๋ก ์ธ๋ก ๋น์จ
resize() { const width = this._divContainer.clientWidth; const height = this._divContainer.clientHeight; this._camera.aspect = width / height; this._camera.updateProjectionMatrix(); this._renderer.setSize(width, height); }
- ⇒ DOM ์์์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์ aspect๊ฐ๋ ๊ทธ ๋น์จ์ ๋ง๊ฒ ๋ค์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
- zNear์ zFar ๊ฑฐ๋ฆฌ ์ฌ์ด์ ์์ญ์ ์ฅ๋ฉด์ ๋ฌผ์ฒด๊ฐ ๋ชจ๋ ๋ค์ด์ค๊ฒ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
OrthographicCamera
(์๋ ๊ทธ๋ฆผ์์ ํ๋์) ์ ์ก๋ฉด์ฒด์ธ ์ ๋์ฒด๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด 6๊ฐ์ ๊ฐ์ด ํ์
- xLeft, xRight: ์ ๊ทธ๋ฆผ์์ ๊ฒ์ ์ ์ ์ ์์ ์ผ๋ก ํ์ ๋ ์ํ์ถ์ ๋ํ ์ขํ๊ฐ
- yTop, yBottom: ๊ฒ์ ์ ์ ์ ์์ ์ผ๋ก ํ์ ๋ ์์ง์ถ์ ๋ํ ์ขํ๊ฐ
- zNear, zFar: PerspectiveCamera์ ๊ฐ๊ณผ ๋์ผํ ๊ฐ
const aspect = window.innerWidth / window.innerHeight;
const camera = new THREE.OrthographicCamera(
-10 * aspect, 10 * aspect, // xLeft, xRight
10, -10, // yTop, yBottom
0.1, 100 // zNear, zFar
);
camera.zoom = 10; // ํฌ๊ธฐ ์กฐ์
- xLeft์ xRight์ aspect๋ฅผ ๊ณฑํ๋ ์ด์ : DOM ์์ ํฌ๊ธฐ์ ๋ํ ์ข ํก๋น๋ฅผ ์ ์ฉ์์ผ ์์ฐ์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํจ
- ⇒ PerspectiveCamera์ ๋ง์ฐฌ๊ฐ์ง๋ก DOM ์์์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์ xLeft, xRight๋ฅผ ๋ค์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
resize() {
const width = this._divContainer.clientWidth;
const height = this._divContainer.clientHeight;
const aspect = width / height;
if(this._camera instanceof THREE.PerspectiveCamera) {
this._camera.aspect = aspect;
} else {
// OrthographicCamera
this._camera.left = -10 * aspect;
this._camera.right = 10 * aspect;
}
this._camera.updateProjectionMatrix();
this._renderer.setSize(width, height);
}
์นด๋ฉ๋ผ๊ฐ ํน์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๊ฐ๋๋ก ๋ง๋ค๊ธฐ
update ํจ์(๋ ๋๋ง ์๊ฐ๋์ ๊ณ์ ํธ์ถ๋๋ ํจ์)์์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ์นด๋ฉ๋ผ์ ์์น๊ฐ smallSphere ๊ฐ์ฒด์ ์์น๋ก ์ ๋ฐ์ดํธ ๋๋ค.
const smallSphere = smallShperePivot.children[0];
smallSphere.getWorldPosition(this._camera.position);
PerspectiveCamera์ OrthographicCamera์ ์ฐจ์ด์ ๋น๊ต
์นด๋ฉ๋ผ๊ฐ ๋นจ๊ฐ์ ๊ตฌ์ ๋ค์ชฝ์ ๋ฐ๋ผ๊ฐ๋๋ก ์ค์ ํ๋ฉด ๋์ ์ฐจ์ด์ ์ ํ์คํ ์ ์ ์๋ค.
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[three.js] ๊ทธ๋ฆผ์๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ (0) | 2023.07.06 |
---|---|
[ํด๋ฆฐ์ฝ๋] 6์ฅ ๊ฐ์ฒด์ ์๋ฃ๊ตฌ์กฐ (0) | 2023.07.02 |
[three.js] ์ฌ๋ฌ๊ฐ์ง ๊ด์์ ๋ค๋ค๋ณด์ (0) | 2023.06.23 |
[ํด๋ฆฐ์ฝ๋] 5์ฅ ํ์ ๋ง์ถ๊ธฐ (0) | 2023.06.23 |
[three.js] ์ฌ์ฉ์ ์ ์ ์ง์ค๋ฉํธ๋ฆฌ (0) | 2023.06.22 |