Skip to content
Snippets Groups Projects
Select Git revision
  • 5aab3d98bb11329aff4cca13d093d55780268a44
  • master default protected
2 results

README.md

Blame
  • tp1_projection_3D.js 3.46 KiB
    const canvas = document.querySelector('canvas#drawing');
    const ctx = canvas.getContext('2d');
    
    /**
     * Positions des sommets du cube
     * Cube centré sur 0,0,0 de hauteur, largeur, profondeur de 1
     */
    const positions = [
        -0.5, -0.5, -0.5, 0.5, -0.5, -0.5,
        0.5, 0.5, -0.5, -0.5, 0.5, -0.5,
        -0.5, -0.5, 0.5, 0.5, -0.5, 0.5,
        0.5, 0.5, 0.5, -0.5, 0.5, 0.5
    ];
    
    const indices = [
        0, 1, 2, 0, 2, 3,  // devant
        4, 5, 6, 4, 6, 7,  // derrière
        0, 1, 5, 0, 5, 4,  // dessous
        2, 3, 7, 2, 7, 6,  // dessus
        0, 3, 7, 0, 7, 4,  // gauche
        1, 2, 6, 1, 6, 5   // droite
    ];
    
    
    function matXVect(mat, v) {
        let result = [];
        for (let i = 0; i < mat.length; i++) {
            let sum = 0;
            for (let j = 0; j < v.length; j++) {
                sum += mat[i][j] * v[j];
            }
            result.push(sum);
        }
        return result;
    }
    
    function transformerVecteurParMatrice(matrice, vecteur) {
        return matXVect(matrice, vecteur);
    }
    
    const worldMat = [
        [0.5, 0.5, -0.7071067690849304, 0],
        [-0.8535534143447876, 0.1464466154575348, -0.5, 0],
        [-0.1464466154575348, 0.8535534143447876, 0.5, 0],
        [0, 0, 0, 1]
    ];
    
    const viewMat = [
        [-0.7071067690849304, -0.5, -0.5, 0],
        [0, 0.7071067690849304, -0.7071067690849304, 0],
        [0.7071067690849304, -0.5, -0.5, 0],
        [0, 0, 0, 1]
    ];
    
    const projMat = [
        [2.237522602081299, 0, 0, 0],
        [0, 2.365222454071045, 0, 0],
        [0, 0, 1.0002000331878662, 1],
        [0, 0, -2.000200033187866, 0]
    ];
    
    /**
     * Transformer les coordonnées des triangles
     */
    function transformerCoordonneesTriangle(idx, pos, worldMat, viewMat, projMat) {
        const triangles = [];
        for (let i = 0; i < idx.length; i += 3) {
            const sommet1 = [pos[idx[i] * 3], pos[idx[i] * 3 + 1], pos[idx[i] * 3 + 2], 1];
            const sommet2 = [pos[idx[i + 1] * 3], pos[idx[i + 1] * 3 + 1], pos[idx[i + 1] * 3 + 2], 1];
            const sommet3 = [pos[idx[i + 2] * 3], pos[idx[i + 2] * 3 + 1], pos[idx[i + 2] * 3 + 2], 1];