Part3 [Three.js]์ Chapter03 3D ํ
์คํธ ๊ฐ์ ํ๊ธฐ(04~05๊ฐ)
์ค๋์ ํฐํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ฉํ๋ ๋ฐฉ๋ฒ๊ณผ Text Geometry๋ฅผ ํ๋ฉด ๊ฐ์ด๋ฐ๋ก ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์ ์ต๋๋ค.
์ง๋ ์๊ฐ์ ๊ธฐ๋ณธ์ ์ธ otf, ttf ํฐํธ๋ฅผ typeFont๋ก ๋ณ๊ฒฝ ํ Three.js๊ฐ ์ ๊ณตํ๋ FontLoader class๋ฅผ ์ฌ์ฉํด์ three.js์์ ์ฌ์ฉํ ์์๋ font ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ์ด๋ฅผ TextGeometry์ font ์ต์
์ผ๋ก ์ถ๊ฐํ์ฌ ์ ์ฉํ๋ ๊ฒ๊น์ง ํ๋๋ฐ์, ์ด๋ ์ฝ๋๋ฅผ ๋ณด์๋ฉด ํ
์คํธ๋ก ์ถ๊ฐํ ๊ฐ์ด onLoad cb scope ์์๋ง ์ ํจํ๋ค๋ ๊ฒ์ ํ์ธํ ์์์ต๋๋ค.
const fontLoader = new FontLoader();
// 1. load method
fontLoader.load(
"./assets/fonts/The Jamsil 3 Regular_Regular.json",
(font) => {
const textGeometry = new TextGeometry("์๋
ํ์ธ์", {
font,
size: 0.5, // ํฌ๊ธฐ ์ค์
height: 0.1, // ๋๊ป ์ง์
});
const textMaterial = new THREE.MeshPhongMaterial({ color: 0x00c896 });
const text = new THREE.Mesh(textGeometry, textMaterial);
scene.add(text);
}
);
์ ์ญ์ผ๋ก ๋ณ์๋ฅผ ๋ง๋ค์ด ๋ด๋ถ์์ ์์ ํ ์๋์๊ฒ ์ง๋ง ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์ํด async await์ ์ฌ์ฉํด์ ํฐํธ๋ฅผ ๋ถ๋ฌ์ค๋๋ก ์์ ํ์ต๋๋ค
const font = await fontLoader.loadAsync(
"./assets/fonts/The Jamsil 3 Regular_Regular.json"
);
์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ก๋ค์!
๋ค์์ผ๋ก๋ ํ
์คํธ๋ฅผ ์ค์ ์ ๋ ฌ์ํค๋ ๋ฐฉ๋ฒ์
๋๋ค.
์ ๋ฒ์ ์ฌ๋ฆฐ ๊ณผ์ ๋ฌผ ์์์์๋ ํ๋ฉด ์์ชฝ์ด ์๋ ค์ ์ค์์ ์์นํ ๊ฒ์ฒ๋ผ ๋ณด์์ง๋ง ์ฌ์ค์ ๊ธ์์ ์์๋ถ๋ถ์ด ํ๋ฉด ์ค์์ ์์นํด ์ ์ฒด์ ์ผ๋ก๋ ํ๋ฉด ์ฐ์ธก์ผ๋ก ์ ๋ฆฐ๋ฏํด ๋ณด์์ต๋๋ค.
์ด๋ฅผ ์์ ํ๊ธฐ ์ํด boundingBox ์ ๊ฐ๋
์ ์์์ผํฉ๋๋ค
boundingBox๋ ํ๋ฉด์ ๋ณด์ด์ง๋ ์์ง๋ง Text Geometry๋ฅผ ๊ฐ์ธ๊ณ ์๋ ์์ญ์
๋๋ค.
boundingBox๋ฅผ ํ์ธํด๋ณด๋ ค๋ฉด ๊ผญ ์๋ computeBoundingBox ํจ์๋ฅผ ๋จผ์ ์คํํด์ผํฉ๋๋ค!
boundingBox๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณ์ฐ๋ ๊ฐ์ด ์๋๋ผ ๋ช ์์ ์ผ๋ก ๊ณ์ฐ ๋ช ๋ น์ ๋ด๋ฆฐ ํ ํ์ธ๊ฐ๋ฅํฉ๋๋ค.
textGeometry.computeBoundingBox();
min, max ๊ฐ์ฒด ๊ฐ์ผ๋ก ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ์๋ Vector3๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค์..! vector3๋ threejs๊ฐ 3D๊ณต๊ฐ์ ๋ํ๋ผ ๋ ์ฌ์ฉํ๋ ์ขํํด๋์ค์ ๋๋ค.
https://threejs.org/docs/#api/en/math/Vector3
three.js docs
threejs.org
Text Geometry์ ์์์์น(min)์ ๋์์น(max)๋ฅผ ์๋ฉด ๋๋น๋ฅผ ์์์๊ณ ๊ทธ ๊ฐ์ ๋ฐ์ ๊ฐ x,y,z๊ฐ์ ์ ๋นผ์ฃผ๋ฉด ์ค์ ์ ๋ ฌ์ด ๋ฉ๋๋ค.
์ด๋๋ ์ง๋ ๊ฐ์ ๋ ์ฌ์ฉํด๋ณธ translate ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
textGeometry.translate(
-(textGeometry.boundingBox.max.x - textGeometry.boundingBox.min.x) * 0.5,
-(textGeometry.boundingBox.max.y - textGeometry.boundingBox.min.y) * 0.5,
-(textGeometry.boundingBox.max.z - textGeometry.boundingBox.min.z) * 0.5
);
((( ํ๋ฉด์์ ๋ณด์ด๋ ํ ์คํธ๋ ํ๋ฉด์ ๋๋ฆฌ์ง์๋ ์ด์ 2D ์ค๋ธ์ ํธ์ฒ๋ผ ๋ณด์ด๋์ง๋ผ ์ฒ์์ x ,y์ขํ๋ง ๋นผ๋ ๊ฑธ ์๊ฐํ๋ค์…
3D ์ค๋ธ์ ํธ๋ฅผ ๋ค๋ฃจ๊ณ ์๋ค๋ ์ฌ์ค์ ์์ง๋ง์์ผ๊ฒ ์ต๋๋ค..๐ )))
๊ทธ๋ฆฌ๊ณ ์ด ๋ฐฉ๋ฒ๋ง๊ณ ๋ ๋ ๋น ๋ฅด๊ฒ ์ค์ ์ ๋ ฌ์ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค
textGeometry.center();
๋จ ์ ์ฝ๋๋ ์ค์์ ๋ ฌ๋ง ๊ฐ๋ฅํ๊ณ ์์น๋ฅผ ์ธ์ธํ๊ฒ ์กฐ์ ํ ๋๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก geometry์ translate๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์๋ ์์๋ฌ์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. (๊ทธ๋ฐ๋ฐ,, y๊ฐ์ด ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋ณด์ด๋ ๊ฑด ์ ์ฐฉ๊ฐ์ผ๊น์..?)
๊ฐ์ธ์ ์ผ๋ก css์์ ์ฌ์ฉํ๋ translateX(-50%) ์ฒ๋ผ ์ง์ค๋ฉํธ๋ฆฌ์ ์ค๊ฐ ๋๋น๊ฐ์ ๋ฐ๋ก ๊ณ์ฐํ ์ ์์๊ฑฐ๋ผ ์๊ฐํ๋๋ฐ์..
์ด๋ฐ ๊ธฐ๋ฅ์ ๋ฐ๋ก ์ง์ํ์ง ์๋ ๊ฒ ๊ฐ๋ค์..๐ค
โจ์ค๋์ ํ์ต ์ธ์ฆ ์ท
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑํ์์ต๋๋ค.
https://fastcampus.co.kr/event_online_challenge_2401_mission
์ปค๋ฆฌ์ด ์ฑ์ฅ์ ์ํ ์ต๊ณ ์ ์ค๋ฌด๊ต์ก ์์นด๋ฐ๋ฏธ | ํจ์คํธ์บ ํผ์ค
์ฑ์ธ ๊ต์ก ์๋น์ค ๊ธฐ์ , ํจ์คํธ์บ ํผ์ค๋ ๊ฐ์ธ๊ณผ ์กฐ์ง์ ์ค์ง์ ์ธ '์ (ๆฅญ)'์ ์ฑ์ฅ์ ๋๊ณ ์ ๋ชจ๋ ์ข ๋ฅ์ ๊ต์ก ์ฝํ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๋ํ๋ฏผ๊ตญ No. 1 ๊ต์ก ์๋น์ค ํ์ฌ์ ๋๋ค.
fastcampus.co.kr