WebGL - 인터랙티브 큐브
안녕하세요, 야심 찬 프로그래머 여러분! 오늘 우리는 WebGL의 세계로 흥미로운 여정을 떠납니다. 마우스로 회전시킬 수 있는 인터랙티브 큐브를 만들어 보겠습니다. 코드를 작성한 적이 없어도 걱정 마세요 - 여러분을 단계별로 안내해 드리겠습니다. 지혜로운 늙은 거북이의 인내심을 가지고 가요. 시작해 보겠습니다!
기본 개념 이해
큐브를 그리기 전에 몇 가지 기본 개념을 빠르게 다루어 보겠습니다.
WebGL이란?
WebGL (Web Graphics Library)는 브라우저에서 3D 그래픽을 렌더링할 수 있게 해주는 JavaScript API입니다. 웹 페이지에 강력한 슈퍼파워를 부여하여 놀라운 시각 효과를 만들 수 있습니다!
필요한 것들
- 텍스트 편집기 (Notepad++나 Visual Studio Code 등)
- 웹 브라우저 (Chrome, Firefox 또는 현대적인 브라우저)
- 약간의 호기심과 한 가닥 인내심!
예제 - 인터랙티브 큐브 그리기
단계 1: HTML 설정
먼저, 우리 웹 페이지의 뼈대를 만들어 보겠습니다. 텍스트 편집기를 열고 interactive_cube.html
이라는 새 파일을 생성합니다. 다음 코드를 복사하고 붙여넣습니다:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebGL Interactive Cube</title>
<style>
canvas { width: 100%; height: 100% }
</style>
</head>
<body>
<canvas id="myCanvas"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script>
// 우리 WebGL 코드가 여기 들어갈 자리입니다
</script>
</body>
</html>
이 코드는 우리의 HTML 구조를 설정하고 Three.js 라이브러리를 포함시킵니다. Three.js는 WebGL 작업을 훨씬 쉽게 만들어 줍니다.
단계 2: 시ーン 생성
이제 JavaScript를 추가하여 3D 시ーン을 만들어 보겠습니다. 스크립트 태그의 주석을 대체하여 다음 코드를 넣습니다:
// 시ーン, 카메라, 렌더러 설정
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ canvas: document.getElementById('myCanvas') });
renderer.setSize(window.innerWidth, window.innerHeight);
// 큐브 생성
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;
이를 간단히 설명하자면:
- 우리는 3D 오브젝트의 무대인 시ーン을 만듭니다.
- 카메라는 우리의 시점을 정의합니다.
- 렌더러는 시ーン을 그리는 역할을 합니다.
- 우리는
BoxGeometry
를 사용하여 큐브를 만들고 녹색으로 칠합니다. - 마지막으로 카메라를 중앙에서 5단위 떨어진 곳에 위치시킵니다.
단계 3: 큐브 애니메이션
큐브를 회전시키기 위해 애니메이션 루프를 추가해야 합니다. 이전 블록 뒤에 다음 코드를 추가합니다:
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
이 함수는 반복적으로 호출되어 각 프레임에서 큐브를 약간 회전시키고 시ーン을 다시 렌더링합니다.
단계 4: 인터랙티브 만들기
이제 마우스로 큐브를 회전시킬 수 있는 인터랙티브 기능을 추가해 보겠습니다. animate()
함수 앞에 다음 코드를 추가합니다:
let isDragging = false;
let previousMousePosition = { x: 0, y: 0 };
document.addEventListener('mousedown', () => isDragging = true);
document.addEventListener('mouseup', () => isDragging = false);
document.addEventListener('mousemove', (e) => {
if (isDragging) {
const deltaMove = {
x: e.offsetX - previousMousePosition.x,
y: e.offsetY - previousMousePosition.y
};
cube.rotation.y += deltaMove.x * 0.01;
cube.rotation.x += deltaMove.y * 0.01;
}
previousMousePosition = {
x: e.offsetX,
y: e.offsetY
};
});
이 코드는 마우스 이벤트에 대한 이벤트 리스너를 추가하여 마우스를 클릭하고 드래그할 때 큐브를 회전시킵니다.
단계 5: 더 재미있게 만들기
큐브를 좀 더 흥미롭게 만들기 위해 각 면에 다른 색상을 주어 보겠습니다. 재질 생성 줄을 다음과 같이 변경합니다:
const materials = [
new THREE.MeshBasicMaterial({ color: 0xff0000 }), // 빨간색
new THREE.MeshBasicMaterial({ color: 0x00ff00 }), // 초록색
new THREE.MeshBasicMaterial({ color: 0x0000ff }), // 파란색
new THREE.MeshBasicMaterial({ color: 0xffff00 }), // 노란색
new THREE.MeshBasicMaterial({ color: 0xff00ff }), // 보라색
new THREE.MeshBasicMaterial({ color: 0x00ffff }) // 청록색
];
const cube = new THREE.Mesh(geometry, materials);
이제 우리의 큐브는 각 면마다 다른 색상을 가지게 됩니다!
결론
축하합니다! 여러분은 WebGL을 사용하여 인터랙티브 3D 큐브를 만들었습니다. 이것은 3D 그래픽 프로그래밍의 시작에 불과합니다. 여러분의 여정을 계속하면 더 놀라운 것들을 발견하게 될 것입니다.
코드를 배우는 것은 자전거 타는 것과 같습니다.처음에는 흔들릴 수 있지만, 연습을 하면 곧 자유자재로 타게 됩니다!
여기 우리가 사용한 주요 메서드를 요약한 표입니다:
메서드 | 설명 |
---|---|
THREE.Scene() |
새로운 3D 시ーン 생성 |
THREE.PerspectiveCamera() |
카메라 시점 설정 |
THREE.WebGLRenderer() |
시ーン 렌더링 처리 |
THREE.BoxGeometry() |
큐브 지오메트리 생성 |
THREE.MeshBasicMaterial() |
큐브 재질 정의 |
THREE.Mesh() |
지오메트리와 재질 결합 |
requestAnimationFrame() |
애니메이션 루프 호출 |
계속 실험하고, 배우고, 가장 중요한 것은 즐겁게 만들어 보세요! WebGL의 세계는 여러분의 것이며, 여러분은 이를 탐험하기 위해 준비되었습니다. 행복한 코딩을 기원합니다!
Credits: Image by storyset