앞에서 이해한 개념을 바탕으로 기본적인 threejs의 사용법을 알아보는 시간을 가져보려 한다.
> npm create vite velog-threejs-vanila --template vanila
만든 폴더로 이동 후, 위와 같은 구조로 파일이 생성되었다면 기본 세팅은 성공이다!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Vite App</title> </head> <body> <div id="app"></div> <!--좌측의 div가 바로 우리가 작업할 scene이 나올 div이다.--> <script type="module" src="/main.js"></script> </body> </html>
> npm i three
> npm run dev
import "./style.css";
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
import "./style.css";
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
const app = document.querySelector("#app");
app.appendChild(renderer.domElement);
renderer.setSize(window.innerWidth, window.innerHeight);
import "./style.css";
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
const app = document.querySelector("#app");
app.appendChild(renderer.domElement);
renderer.setSize(window.innerWidth, window.innerHeight);
const scene = new THREE.Scene();
import "./style.css";
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
const app = document.querySelector("#app");
app.appendChild(renderer.domElement);
renderer.setSize(window.innerWidth, window.innerHeight);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
);
import "./style.css";
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
const app = document.querySelector("#app");
app.appendChild(renderer.domElement);
renderer.setSize(window.innerWidth, window.innerHeight);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75, // fov(시야각) 값이다.
window.innerWidth / window.innerHeight, // aspect ratio 값으로서, 카메라의 가로세로 비율 이다.
0.1, // near 값이다.(이 거리보다 가까운 객체는 카메라에 담기지 않는다.)
100 // far 값이다.(이 거리보다 먼 객체는 카메라에 담기지 않는다.
);
import "./style.css";
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
const app = document.querySelector("#app");
app.appendChild(renderer.domElement);
renderer.setSize(window.innerWidth, window.innerHeight);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75, // fov(시야각) 값이다.
window.innerWidth / window.innerHeight, // aspect ratio 값으로서, 카메라의 가로세로 비율 이다.
0.1, // near 값이다.(이 거리보다 가까운 객체는 카메라에 담기지 않는다.)
100 // far 값이다.(이 거리보다 먼 객체는 카메라에 담기지 않는다.
);
renderer.render(scene, camera);
#app {
position: absolute;
top: 0;
left: 0;
}
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
const app = document.querySelector("#app");
app.appendChild(renderer.domElement);
renderer.setSize(window.innerWidth, window.innerHeight);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.01,
1000
);
scene.add(camera);
// 간단하게 박스 모양의 geometry를 추가하고, 너비, 높이, 깊이를 각각 1,1,1로 설정한다.
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 빛의 영향을 받지 않는 MeshBasicMaterial을 추가하고, 색은 개인적으로 좋아하는 초록색으로 했다.
const material = new THREE.MeshBasicMaterial({ color: 'green' });
// mesh에 앞서 만든 geometry와 material을 인자로 넣어서 만든다.
const mesh = new THREE.Mesh(geometry, material);
// scene에 방금 만든 mesh를 추가한다.
scene.add(mesh);
renderer.render(scene, camera);
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
const app = document.querySelector("#app");
app.appendChild(renderer.domElement);
renderer.setSize(window.innerWidth, window.innerHeight);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.01,
1000
);
// 카메라와 z축 위치를 5로 바꿔준다.
camera.position.z = 5;
scene.add(camera);
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: "green" });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
renderer.render(scene, camera);
import * as THREE from "three";
const renderer = new THREE.WebGLRenderer();
const app = document.querySelector("#app");
app.appendChild(renderer.domElement);
renderer.setSize(window.innerWidth, window.innerHeight);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.01,
1000
);
camera.position.z = 5;
// 카메라의 y축 위치를 2로 바꿔준다.
camera.position.y = 2;
scene.add(camera);
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: "green" });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
renderer.render(scene, camera);
> npm create vite velog-threejs-react --template react-ts
> cd velog-threejs-react
> npm i
> npm i three @react-three/fiber @react-three/drei
> npm i @types/three --dev
// App.tsx
function App() {
return null;
}
export default App;
// App.tsx
import "./App.css";
import { Canvas } from "@react-three/fiber";
function App() {
return (
// 위의 vanila와 동일한 결과물을 나오게 하기위해 스타일 코드를 추가했다.
<div style={{ width: "100vw", height: "100vh", background: "#000" }}>
// fiber에 내장된 canvas 객체이다.
<Canvas
// camera를 props로 추가하였다.
camera={{
isPerspectiveCamera:true,
fov: 75,
aspect: window.innerWidth / window.innerHeight,
near: 0.01,
far: 1000,
position: [0, 2, 5],
}}
>
// Canvas 하위에 추가될 mesh를 컴포넌트로 추가하였다.
<mesh position={[0, 0, 0]}>
// 기존에 Mesh에 파라미터로 전달되던 geometry가 하위 컴포넌트로 추가되었다.
<boxGeometry args={[1, 1, 1]} />
// 기존에 Mesh에 파라미터로 전달되던 material이 하위 컴포넌트로 추가되었다.
<meshBasicMaterial color={"green"} />
</mesh>
</Canvas>
</div>
);
}
export default App;