<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<meta name = "viewport" content = "width=device-width, initial-scale = 1.0">
<title>テスト</title>
<style>
#canvas {
display: block;
margin-bottom: 10px;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script type="module">
import * as THREE from "https://cdn.jsdelivr.net/npm/three@0.167.0/build/three.module.js";
// サイズを指定
const width = 360;
const height = 360;
// レンダラー,シーン,カメラを作成
const renderer = new THREE.WebGLRenderer({
canvas: document.getElementById('canvas'),
});
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, width / height);
window.onload = () => {
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(width, height);
camera.position.set(0, 0, 150);
addObjects();
const INTERVAL = 1000 / 60;
let nextUpdateTime = new Date().getTime() + INTERVAL;
frameProc();
function frameProc(){
const curTime = new Date().getTime();
if(nextUpdateTime < curTime){
nextUpdateTime += INTERVAL;
update();
}
requestAnimationFrame(() => frameProc());
}
}
let sprites = [];
function addObjects(){
for(let i=0; i<100; i++){
/** @type {THREE.Sprite} */
const sprite = createSprite();
sprite.position.x = Math.random() * 200 - 100; // -100 ~ +100
sprite.position.y = Math.random() * 200 - 100; // -100 ~ +100
sprite.position.z = Math.random() * 1000 - 900; // 100 ~ -900
sprites.push(sprite);
scene.add(sprite);
}
}
function createSprite(){
const texture = new THREE.TextureLoader().load('./images/star.png');
texture.colorSpace = THREE.SRGBColorSpace;
const material = new THREE.SpriteMaterial({ map: texture, });
const sprite = new THREE.Sprite(material);
sprite.scale.set(20, 20, 20); // サイズ調整
return sprite;
}
// 更新処理
function update() {
for(let i=0; i<sprites.length; i++){
const sprite = sprites[i];
sprite.position.z += 4;
if(sprite.position.z > 150)
sprite.position.z = -1000;
}
renderer.render(scene, camera); // レンダリング
}
</script>
</body>
</html>