Schedule App
Click on the cubes to enter text.
こちらが提供できるコード例です。セキュリティへの配慮や入力フォームの検証、デザインなどは含まれていません。また、ジョークとして「CUBEのクリック音に注意してください。爆音になる可能性があります」とコメントを添えています。
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Schedule App</title>
<style>
canvas {
width: 100%;
height: 500px;
}
</style>
</head>
<body>
<h1>Schedule App</h1>
<p>Click on the cubes to enter text.</p>
<canvas id="canvas"></canvas>
<div id="timeline"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script>
// create a scene and camera
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
// create a renderer and add it to the DOM
var renderer = new THREE.WebGLRenderer({canvas: document.getElementById("canvas")});
renderer.setSize(window.innerWidth, window.innerHeight);
// create a cube and add it to the scene
var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshBasicMaterial({color: 0x00ff00});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// create an array of cubes and add them to the scene
var cubeCount = 7;
var cubes = [];
for (var i = 0; i < cubeCount; i++) {
var newCube = new THREE.Mesh(geometry, material);
newCube.position.x = i - (cubeCount/2) + 0.5;
cubes.push(newCube);
scene.add(newCube);
}
// create a date array for the timeline
var dates = ["1/1", "1/2", "1/3", "1/4", "1/5", "1/6", "1/7"];
// add the dates to the timeline div
for (var i = 0; i < dates.length; i++) {
var newDate = document.createElement("div");
newDate.innerHTML = dates[i];
document.getElementById("timeline").appendChild(newDate);
}
// create a raycaster to detect cube clicks
var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
// handle mouse clicks
function onMouseClick (event) {
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(cubes);
if (intersects.length > 0) {
var selectedCube = intersects[0].object;
var text = prompt("Enter text:");
selectedCube.userData.text = text;
}
}
// animate the scene
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
for (var i = 0; i < cubes.length; i++) {
if (cubes[i].userData.text) {
cubes[i].material.color.setHex(0xff0000);
} else {
cubes[i].material.color.setHex(0x00ff00);
}
}
renderer.render(scene, camera);
}
animate();
// handle window resizing
window.addEventListener("resize", function () {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
// handle mouse clicks
document.addEventListener("click", onMouseClick);
</script>
</body>
</html>
```