blog

初心者向け!Three.jsで回転するダイナミックな三角形を書いてみよう!

html部分は非常にシンプルです。\n<!DOCTYPE html>; <html lang="ja">;html lang="ja"&gt\n<html lang="j...

Dec 31, 2020 · 3 min. read
シェア

htmlの部分はとてもシンプルです。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>demoThree</title>
</head>
<body>
 <canvas id="demo-three"></canvas>
</body>
<script type="text/javascript" src="./three.js"></script>
<script type="text/javascript" src="./demo_three.js"></script>
</html>

以下はjsセクションで、各コード行にはコメントの詳細な説明があります。

// 幅と高さを定義する
const width = 400;
const height = 400;
const canvas = document.getElementById('demo-three');
// WebGLRendererあなたがパラメータを渡さない場合は、関連するキャンバスが表示されるようにするために、domElementを配置する必要があり、その場合に関連付けられたhtmlのdom要素に画面のうち、最終的なレンダリングではないだろう、ボディに追加する
let renderer = new THREE.WebGLRenderer({
 canvas
});
// シーンを描画し、シーンにレンダリングされたオブジェクトをシーンに保持する。
let scene = new THREE.Scene();
// 直交カメラを使用して、直交カメラは、上下左右前後の座標を定義する必要があるので、直交カメラは、関連する平面空間、オブジェクトの状況をインターセプトすることができます指定する
let camera = new THREE.OrthographicCamera(-width / 2, width / 2, height / 2, -height / 2, -)
// 黒背景、透明度1.0
renderer.setClearColor(new THREE.Color(0x), 1.0);
// renderer 
renderer.setSize();
// つの.js公式サイトを閲覧することができるが、あらかじめ定義されたジオメトリはたくさんあるが、三角形はなく、shapeGeometryで描画することができる。
let triangleShape = new THREE.Shape();
// 描画開始点をこの位置に移動する
triangleShape.moveTo(0, 100);
// 下線を引く
triangleShape.lineTo(-100, -100);
triangleShape.lineTo(100, -100);
triangleShape.lineTo(0, 100);
// ジオメトリを定義する
const geometry = new THREE.ShapeGeometry(triangleShape);
// マテリアルを定義する。三角形は基本的な形であり、光を当てる必要はない。
const material = new THREE.MeshBasicMaterial({
 color: 0xff0000,
 // デフォルトは片側で、DoubleSideとして定義すると、表と裏の両方がレンダリングされる。
 side: THREE.DoubleSide
});
// 最初のパラメータgeometryは、状況の座標のジオメトリを定義するもので、webGlの頂点シェーダの入力頂点シーケンスに非常によく似ている。
// つ目のパラメータであるマテリアルは、webGlのフラグメント・シェーダーとよく似ていて、頂点の列に色をつける。
let mesh = new THREE.Mesh(geometry, material);
// シーン内のメッシュの位置を設定する。
mesh.position.x = 0;
mesh.position.y = 0;
mesh.position.z = 1;
scene.add(mesh);
// カメラは負のZ軸に沿って覗き込むので、原点に設定されている。
// 頂点シェーダーに渡されるデータを修正するネイティブのwebGlよりも、positionで直接位置を設定する方がずっと簡単だ。
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 0;
// cameraの位置から見て
camera.lookAt(new THREE.Vector3(0, 0, 1));
let currentAngle = 0;
let lastTimestamp = Date.now();
function animate() {
 // requestAnimationFrameの間隔が毎回不明なので、時間をメモして、現在のタイムスタンプを取得する
 const now = Date.now();
 // 古いタイムスタンプを差し引く
 const duration = now - lastTimestamp;
 lastTimestamp = now;
 // requestAnimationFrameを180度回転させる。
 currentAngle = currentAngle + duration / 1000 * Math.PI;
}
function render() {
 animate();
 // meshcurrentAngleをy軸周りに回転させる。
 mesh.rotation.set(0, currentAngle, 0);
 //  
 renderer.render(scene, camera);
 requestAnimationFrame(render);
}
render();

効果

Read next

アルゴリズムの復習:2つの数を足す

2つの非負整数を表す、2つの空でない連結リストが与えられています。それぞれの桁は逆順に格納され、各ノードには1桁しか格納できません。 2つの数値を足し合わせると、その和を表す新しい連結表が返されます。 どちらの数字も0から始まらないと思ってください。 では、笛は...

Dec 31, 2020 · 3 min read