Update index.html
Browse files- index.html +27 -15
index.html
CHANGED
@@ -31,6 +31,7 @@
|
|
31 |
<input type="file" id="imageInput" accept="image/*">
|
32 |
<button type="button" onclick="processImage()">画像を処理</button>
|
33 |
</form>
|
|
|
34 |
<canvas id="canvas" style="display: none;"></canvas>
|
35 |
<div id="scene-container"></div>
|
36 |
|
@@ -40,8 +41,9 @@
|
|
40 |
const canvas = document.getElementById('canvas');
|
41 |
const ctx = canvas.getContext('2d');
|
42 |
let scene, camera, renderer;
|
43 |
-
const cubeSize = 8;
|
44 |
-
let cubes = [];
|
|
|
45 |
|
46 |
function processImage() {
|
47 |
const fileInput = document.getElementById('imageInput');
|
@@ -50,31 +52,38 @@
|
|
50 |
|
51 |
const img = new Image();
|
52 |
img.onload = () => {
|
53 |
-
const scale = 0.1;
|
54 |
canvas.width = img.width * scale;
|
55 |
canvas.height = img.height * scale;
|
56 |
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
57 |
|
58 |
create3DScene();
|
|
|
59 |
};
|
60 |
img.src = URL.createObjectURL(file);
|
61 |
}
|
62 |
|
63 |
function create3DScene() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
// Three.jsの基本設定
|
65 |
scene = new THREE.Scene();
|
66 |
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
|
67 |
-
camera.position.
|
68 |
-
camera.position.x = 300;
|
69 |
-
camera.position.y = 300;
|
70 |
camera.lookAt(new THREE.Vector3(0, 0, 0));
|
71 |
renderer = new THREE.WebGLRenderer();
|
72 |
renderer.setSize(window.innerWidth, window.innerHeight);
|
|
|
73 |
document.getElementById('scene-container').appendChild(renderer.domElement);
|
74 |
|
75 |
createCubesFromImage();
|
76 |
-
|
77 |
-
animate(); // アニメーション開始
|
78 |
}
|
79 |
|
80 |
function createCubesFromImage() {
|
@@ -92,11 +101,10 @@
|
|
92 |
const material = new THREE.MeshBasicMaterial({ color: color });
|
93 |
const cube = new THREE.Mesh(geometry, material);
|
94 |
|
95 |
-
// x座標はそのままに、y座標のみ反転させる
|
96 |
cube.position.set(
|
97 |
-
(x - canvas.width / 2) * cubeSize * 1.2,
|
98 |
-
(canvas.height / 2 - y) * cubeSize * 1.2,
|
99 |
-
Math.random() * 2200 - 100
|
100 |
);
|
101 |
scene.add(cube);
|
102 |
cubes.push(cube);
|
@@ -105,9 +113,8 @@
|
|
105 |
}
|
106 |
|
107 |
function animate() {
|
108 |
-
requestAnimationFrame(animate);
|
109 |
|
110 |
-
// 各立方体をターゲット位置へ移動させる
|
111 |
cubes.forEach((cube, index) => {
|
112 |
const targetX = ((index % canvas.width) - canvas.width / 2) * cubeSize * 1.2;
|
113 |
const targetY = ((canvas.height / 2) - Math.floor(index / canvas.width)) * cubeSize * 1.2;
|
@@ -120,6 +127,11 @@
|
|
120 |
|
121 |
renderer.render(scene, camera);
|
122 |
}
|
|
|
|
|
|
|
|
|
|
|
123 |
</script>
|
124 |
</body>
|
125 |
-
</html>
|
|
|
31 |
<input type="file" id="imageInput" accept="image/*">
|
32 |
<button type="button" onclick="processImage()">画像を処理</button>
|
33 |
</form>
|
34 |
+
<button id="replayButton" style="margin-top: 10px; display: none;" onclick="replayAnimation()">もう一度再生</button>
|
35 |
<canvas id="canvas" style="display: none;"></canvas>
|
36 |
<div id="scene-container"></div>
|
37 |
|
|
|
41 |
const canvas = document.getElementById('canvas');
|
42 |
const ctx = canvas.getContext('2d');
|
43 |
let scene, camera, renderer;
|
44 |
+
const cubeSize = 8;
|
45 |
+
let cubes = [];
|
46 |
+
let animationFrameId;
|
47 |
|
48 |
function processImage() {
|
49 |
const fileInput = document.getElementById('imageInput');
|
|
|
52 |
|
53 |
const img = new Image();
|
54 |
img.onload = () => {
|
55 |
+
const scale = 0.1;
|
56 |
canvas.width = img.width * scale;
|
57 |
canvas.height = img.height * scale;
|
58 |
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
59 |
|
60 |
create3DScene();
|
61 |
+
document.getElementById('replayButton').style.display = 'block';
|
62 |
};
|
63 |
img.src = URL.createObjectURL(file);
|
64 |
}
|
65 |
|
66 |
function create3DScene() {
|
67 |
+
if (renderer) {
|
68 |
+
// 既存のシーンをクリア
|
69 |
+
cancelAnimationFrame(animationFrameId);
|
70 |
+
cubes.forEach(cube => scene.remove(cube));
|
71 |
+
cubes = [];
|
72 |
+
renderer.dispose();
|
73 |
+
}
|
74 |
+
|
75 |
// Three.jsの基本設定
|
76 |
scene = new THREE.Scene();
|
77 |
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
|
78 |
+
camera.position.set(300, 300, 300);
|
|
|
|
|
79 |
camera.lookAt(new THREE.Vector3(0, 0, 0));
|
80 |
renderer = new THREE.WebGLRenderer();
|
81 |
renderer.setSize(window.innerWidth, window.innerHeight);
|
82 |
+
document.getElementById('scene-container').innerHTML = ''; // 既存のcanvasを削除
|
83 |
document.getElementById('scene-container').appendChild(renderer.domElement);
|
84 |
|
85 |
createCubesFromImage();
|
86 |
+
animate();
|
|
|
87 |
}
|
88 |
|
89 |
function createCubesFromImage() {
|
|
|
101 |
const material = new THREE.MeshBasicMaterial({ color: color });
|
102 |
const cube = new THREE.Mesh(geometry, material);
|
103 |
|
|
|
104 |
cube.position.set(
|
105 |
+
(x - canvas.width / 2) * cubeSize * 1.2,
|
106 |
+
(canvas.height / 2 - y) * cubeSize * 1.2,
|
107 |
+
Math.random() * 2200 - 100
|
108 |
);
|
109 |
scene.add(cube);
|
110 |
cubes.push(cube);
|
|
|
113 |
}
|
114 |
|
115 |
function animate() {
|
116 |
+
animationFrameId = requestAnimationFrame(animate);
|
117 |
|
|
|
118 |
cubes.forEach((cube, index) => {
|
119 |
const targetX = ((index % canvas.width) - canvas.width / 2) * cubeSize * 1.2;
|
120 |
const targetY = ((canvas.height / 2) - Math.floor(index / canvas.width)) * cubeSize * 1.2;
|
|
|
127 |
|
128 |
renderer.render(scene, camera);
|
129 |
}
|
130 |
+
|
131 |
+
function replayAnimation() {
|
132 |
+
// アニメーションの再生をリセット
|
133 |
+
create3DScene();
|
134 |
+
}
|
135 |
</script>
|
136 |
</body>
|
137 |
+
</html>
|