soiz commited on
Commit
a0e0c36
·
verified ·
1 Parent(s): ceadab9

Update index.html

Browse files
Files changed (1) hide show
  1. 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.z = 300;
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, // x座標をそのまま使用
98
- (canvas.height / 2 - y) * cubeSize * 1.2, // y座標を反転
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>