Untitled

 avatar
unknown
plain_text
a month ago
2.7 kB
1
Indexable
// Retrieve the canvas element for rendering
const canvas = document.getElementById('pianoCanvas');

// Initialize the scene
const scene = new THREE.Scene();

// Set up the camera with perspective projection
const camera = new THREE.PerspectiveCamera(
    75, // Field of view
    window.innerWidth / window.innerHeight, // Aspect ratio
    0.1, // Near clipping plane
    1000 // Far clipping plane
);

// Create the WebGL renderer and attach it to the canvas
const renderer = new THREE.WebGLRenderer({ canvas });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// Adjust camera position for a better view
camera.position.z = 5;

// Function to create a basic 3D piano model
function createPiano() {
    // Piano base
    const baseGeometry = new THREE.BoxGeometry(4, 0.5, 2);
    const baseMaterial = new THREE.MeshStandardMaterial({ color: '#2d2d2d' });
    const base = new THREE.Mesh(baseGeometry, baseMaterial);
    base.position.y = -0.5; // Position slightly below the center
    scene.add(base);

    // Piano keys (white keys)
    for (let i = 0; i < 12; i++) {
        const keyGeometry = new THREE.BoxGeometry(0.3, 0.1, 1);
        const keyMaterial = new THREE.MeshStandardMaterial({ color: '#ffffff' });
        const key = new THREE.Mesh(keyGeometry, keyMaterial);
        key.position.set(-1.65 + i * 0.35, 0, 0.5);
        scene.add(key);
    }

    // Piano keys (black keys)
    const blackKeyPositions = [0, 1, 3, 4, 5, 7, 8, 10];
    blackKeyPositions.forEach((pos) => {
        const keyGeometry = new THREE.BoxGeometry(0.2, 0.1, 0.6);
        const keyMaterial = new THREE.MeshStandardMaterial({ color: '#000000' });
        const key = new THREE.Mesh(keyGeometry, keyMaterial);
        key.position.set(-1.475 + pos * 0.35, 0.1, 0.3);
        scene.add(key);
    });
}

// Add lights to illuminate the scene
const ambientLight = new THREE.AmbientLight(0x404040); // Soft white light
scene.add(ambientLight);

const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8); // Strong directional light
directionalLight.position.set(10, 10, 10);
scene.add(directionalLight);

// Call the function to add the piano to the scene
createPiano();

// Render loop to continuously update the scene
function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}

// Resize handler for responsiveness
window.addEventListener('resize', () => {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
});

// Start animation
animate();
Leave a Comment