[Three.js] 3D 객체의 렌더링과 표시

18121 단어 three.jsthree.js

Three.js

JavaScript 라이브러리를 통해 WebGL를 쉽게 다룰 수 있도록 Three.js를 사용한다.

HTML

<head>
    <title>Scene</title>
    <script type="text/javascript" src="../libs/three.js"></script>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }
    </style>
</head>
<body>

<!-- Div which will hold the Output -->
<div id="WebGL-output">
</div>

Scene 추가

three.js 는 3차원 객체로 구성되는 장면 (Scene)이 있다.
Scene은 렌더링 할 모든 객체와, 카메라와 광원을 저장하는 컨테이너이다.

var scene = new THREE.Scene();

Camera 추가

Scene을 렌더링할 때는 어떤 시점에서 장면을 보는가에 따라서 다양한 모습으로 렌더링된다.
그 시점을 Camera로 정의한다.

Camera에는 PerspectiveCamera, OrthographicCamera 두 가지가 존재한다.

  • PerspectiveCamera : 일상생활에서 우리가 보는 외관.
  • OrthographicCamera : 직교 카메라, 시점으로부터의 거리에 상관없이 모든 물체가 동일한 크기이다.

THREE.PerspectiveCamera(fov, aspect, near, far)

  • fov — Camera frustum vertical field of view.
  • aspect — Camera frustum aspect ratio.
  • near — Camera frustum near plane.
  • far — Camera frustum far plane.
var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);

Renderer 추가

이 장면을 모니터와 같은 출력 장치에 출력할 수 있는, 즉 렌더링할 수 있는 Renderer가 있다.

var renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setClearColorHex();
renderer.setClearColor(new THREE.Color(0xEEEEEE));
renderer.setSize(window.innerWidth, window.innerHeight);
  • 오브젝트의 가장자리를 매끄럽게 하기 위해 antialias를 true로 한다.

AxisHelper (좌표계) 생성

var axes = new THREE.AxisHelper(20);
scene.add(axes);

Plane(바닥) 추가

var planeGeometry = new THREE.PlaneGeometry(60, 20); // 가로, 세로
var planeMaterial = new THREE.MeshBasicMaterial({color: 0xcccccc});
var plane = new THREE.Mesh(planeGeometry, planeMaterial); // 형태, 재질 합쳐주는 역할

// rotate and position the plane
plane.rotation.x = -0.5 * Math.PI;
plane.position.x = 15;
plane.position.y = 0;
plane.position.z = 0;

// add the plane to the scene
scene.add(plane);
  • Plane은 기본값이 수직으로 서있기 때문에 rotation 시켜서 수평으로 만든다.

Cube 생성

// create a cube
var cubeGeometry = new THREE.BoxGeometry(4, 4, 4);
var cubeMaterial = new THREE.MeshBasicMaterial({color: 0xff0000, wireframe: true}); // 광원의 영향을 받지 않기 때문에 그림자를 만들지 못한다.
var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

// position the cube
cube.position.x = -4;
cube.position.y = 3;
cube.position.z = 0;

// add the cube to the scene
scene.add(cube);

Sphere 생성

// create a sphere
var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
var sphereMaterial = new THREE.MeshBasicMaterial({color: 0x7777ff, wireframe: true});
var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);

// position the sphere
sphere.position.x = 20;
sphere.position.y = 4;
sphere.position.z = 2;

// add the sphere to the scene
scene.add(sphere);

Camera 추가

// position and point the camera to the center of the scene
camera.position.x = -30;
camera.position.y = 40;
camera.position.z = 30;
camera.lookAt(scene.position);

Rendering

 // add the output of the renderer to the html element
document.getElementById("WebGL-output").appendChild(renderer.domElement);

// render the scene
renderer.render(scene, camera);

결과물


REFERENCE

좋은 웹페이지 즐겨찾기