- 1日8h×3ヶ月の社内研修あり
- 業界未経験OK!ディレクター
- 1日8h×3ヶ月の社内研修アリ
- 他40件の職種
-
開発
- 1日8h×3ヶ月の社内研修あり
- 1日8h×3ヶ月の社内研修アリ
- 1日8時間×3ヶ月は社内研修
- 3ヶ月フルタイムで社内研修アリ
- 3ヶ月は社内研修に専念!
- 入社後3ヶ月は社内研修のみ
- 単価公開&案件選択の制度あり!
- 未経験OK!3ヶ月は研修のみ!
- 単価公開&案件選択制度あり!
- 3ヶ月はフルタイムで研修!
- 入社後3 ヶ月は研修のみ
- 入社後3 ヶ月は研修のみ!
- 未経験OK!3ヶ月研修あり!
- 入社後最大3ヶ月研修あり!
- 実務未経験OK!
- 入社後最大3ヶ月の研修あり!
- 未経験OK!3ヶ月は研修アリ!
- 未経験OK!3ヶ月は研修専念!
- 未経験歓迎!3ヶ月は研修のみ!
- 未経験歓迎!
- 若手歓迎!アットホームな社風!
- 1日8時間・3ヶ月の研修あり
- 入社後3ヶ月は社内研修あり
- 未経験者は3ヶ月の研修あり
- フロントエンド/バックエンド
- 未経験OK!3ヶ月研修に専念!
- 未経験歓迎!Webエンジニア!
- 未経験者は研修3ヶ月あり
- 入社後3ヶ月は研修にコミット!
- 入社後3ヶ月の研修あり!
- 未経験OK!Webエンジニア
- 入社後3ヶ月研修あり
- バックエンドエンジニア
- スクール卒業生歓迎
- フルスタックエンジニア
- エンジニア未経験OK
- フロントエンドエンジニア
- フロントエンド・バックエンド
- スクール卒業生歓迎!
- 3ヶ月フルタイムで研修あり!
- ビジネス
こんにちは!ALCHEMYのエンジニア、丸山です。
こんなかっこいいモノが作れればいいなと思いまして、Three.jsを学び始めたんですけど、奥が深くて面白いので、みなさんに共有します。
この記事の対象者
- Three.js 初心者の方
- 少しでも、3Dでモノ作りをしたいと思っている方
パッケージのインストールから説明しているので、少しでもweb制作の経験がある方は理解できる内容になっていると思います。
本日のゴール
画面の真ん中に赤い四角を表示させる(下図を参照)
最初は難しいことは考えずに、画面にobjectを表示させてみましょう。
※ ページの最後に完成したソースを載せています
1.下記コマンドを入力してdependency の追加
npm install vite
npm install threenpm install vite
npm install three
copy
※念のため、package.jsonを確認
2.htmlファイルの作成
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>初めてのthree.js</title>
</head>
<body>
<h3>テスト</h3>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>初めてのthree.js</title>
</head>
<body>
<h3>テスト</h3>
</body>
</html>
copy
npm run dev で vite が走っているか確認
テストと反映されている状態
3.JSファイルの作成
script.jsファイルを作成し、先ほど作成したindex.htmlに紐付ける
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>初めてのthree.js</title>
</head>
<body>
<script type="module" src="./script.js"></script>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>初めてのthree.js</title>
</head>
<body>
<script type="module" src="./script.js"></script>
</body>
</html>
copy
4.Three.js をインポートしましょう
import * as THREE from 'three'
copy
これで Three.js が提供しているクラスにアクセスできるようになっています。念のため、ログで確認しましょう。
提供されている全てのクラスが羅列されているわけではありませんが、「本日のゴール」でやりたいことを実現するためには十分なので、次に進みます。
5.実際に提供されているクラスを使いmesh(object)を作成
以下を作成していきます。
- scene
- object(赤い四角)
- camera
- renderer
- scene
まずはsceneから。
sceneは簡単にいうと、objectやlightsを入れるための箱です。
// Scene
const scene = new THREE.Scene()
// Scene
const scene = new THREE.Scene()
copy
次にobjectの作成。
赤い四角を作成するためにはMeshと呼ばれるタイプのobjectを使用します。
Meshはgeometry(objectの形)とmaterial(obejctの見た目。色など)が合わさったものです。
Mesh = geometry + material
まずはgeometryを作成するので、提供されているBoxGeometryを使用します。それぞれのパラメータは、geometryのサイズです。
// Object
const geometry = new THREE.BoxGeometry(1, 1, 1)// Object
const geometry = new THREE.BoxGeometry(1, 1, 1)
copy
次に、materialを作成します。
今回はMeshBasicMaterial を使用します。
パラメータには色を入れてあげましょう。
// Object
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })// Object
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })
copy
geometryとmaterialが完成したので、それぞれ作成したものを使用してmeshを作りましょう。
// Object
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })
const mesh = new THREE.Mesh(geometry, material)// Object
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })
const mesh = new THREE.Mesh(geometry, material)
copy
最後に、作成したmeshをsceneに追加します。
scene.add(mesh)
copy
これでmesh(object)の作成とsceneへの追加が完了しました。
6.cameraを作成
cameraの種類もいくつかあるのですが、今回はPerspectiveCameraというクラスを使います。そして、以下2つのパラメータを入れます。
- fov (field of view) = 画面に映る視界の広さ。値が大きければ大きいほど、広い範囲を見れるが歪みが発生してしまう。小さいと、objectにズームしている感じになります。defaultは50°で、値は「°」です。
- aspect ratio = 画面の比率。大体は、width/heightです。
// Sizes
const sizes = {
width: 800,
height: 600
}
// Camera
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
scene.add(camera)// Sizes
const sizes = {
width: 800,
height: 600
}
// Camera
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
scene.add(camera)
copy
※ cameraもsceneに追加することを忘れずに
7.rendererを作成
rendererの仕事はsceneをレンダリングすること。
つまり、rendererに頼んで、作成したmeshを設定したcameraの位置でレンダリングします。
その際、index.htmlに<canavs>を作成しなくてはいけません。
<canvas class="webgl"></canvas>
copy
script.jsで使用するのでクラス設定をしてください。
script.jsに戻ります。
renderer を作成し<canvas>と紐付ける。
// Canvas
const canvas = document.querySelector('canvas.webgl')
// ...
// Renderer
const renderer = new THREE.WebGLRenderer({
canvas: canvas
})
// Canvas
const canvas = document.querySelector('canvas.webgl')
// ...
// Renderer
const renderer = new THREE.WebGLRenderer({
canvas: canvas
})
copy
rendereのサイズも設定しなくてはいけないので、setSize(...)というメソッドを使用します。先ほど camera作成時に設定した、widthとheightを使用しましょう。
// Canvas
const canvas = document.querySelector('canvas.webgl')
// ...
// Renderer
const renderer = new THREE.WebGLRenderer({
canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)// Canvas
const canvas = document.querySelector('canvas.webgl')
// ...
// Renderer
const renderer = new THREE.WebGLRenderer({
canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)
copy
最後に、render(...)メソッドを呼び出して、sceneとcameraをパラメータとして入れます。
renderer.render(scene, camera)
copy
あれれ。。。となると思います。
問題点としては、作成したobejctとcameraのpositionを指定していないことです。defaultでobejctとcameraのpositionは、sceneの真ん中に設置されています。要するに、今見ている画面は作成したobjectの内側です。
なので、
cameraの位置をz軸に沿って動かします。3Dなのでx軸(右、左)とy軸(上、下)にプラスしてz軸(前、後)があります。
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
camera.position.z = 3
scene.add(camera)const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
camera.position.z = 3
scene.add(camera)
copy
そうすると、赤い箱が浮かんでくると思います。
いかがだったでしょうか。
最後までお読みいただき、ありがとうございました。
↓ 完成したソース
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>初めてのthree.js</title>
</head>
<body>
<canvas class="webgl"></canvas>
<script type="module" src="./script.js"></script>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>初めてのthree.js</title>
</head>
<body>
<canvas class="webgl"></canvas>
<script type="module" src="./script.js"></script>
</body>
</html>
import * as THREE from 'three'
// Canvas
const canvas = document.querySelector('canvas.webgl')
// Scene
const scene = new THREE.Scene()
/**
* Objects
*/
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })
const mesh = new THREE.Mesh(geometry, material)
scene.add(mesh)
/**
* Sizes
*/
const sizes = {
width: 800,
height: 600
}
/**
* Camera
*/
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
camera.position.z = 3
scene.add(camera)
/**
* Renderer
*/
const renderer = new THREE.WebGLRenderer({
canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)
renderer.render(scene, camera)
import * as THREE from 'three'
// Canvas
const canvas = document.querySelector('canvas.webgl')
// Scene
const scene = new THREE.Scene()
/**
* Objects
*/
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })
const mesh = new THREE.Mesh(geometry, material)
scene.add(mesh)
/**
* Sizes
*/
const sizes = {
width: 800,
height: 600
}
/**
* Camera
*/
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
camera.position.z = 3
scene.add(camera)
/**
* Renderer
*/
const renderer = new THREE.WebGLRenderer({
canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)
renderer.render(scene, camera)