【问题标题】:WebGL Perspective Projection MatrixWebGL 透视投影矩阵
【发布时间】:2015-08-06 09:56:15
【问题描述】:

谁能给我看一个 javascript/webGL 中的函数,它将 3d 坐标更改为 2d 投影透视坐标?谢谢

【问题讨论】:

    标签: javascript webgl projection-matrix


    【解决方案1】:

    这是一个非常典型的透视矩阵函数

      function perspective(fieldOfViewYInRadians, aspect, zNear, zFar, dst) {
        dst = dst || new Float32Array(16);
    
        var f = Math.tan(Math.PI * 0.5 - 0.5 * fieldOfViewYInRadians);
        var rangeInv = 1.0 / (zNear - zFar);
    
        dst[0]  = f / aspect;
        dst[1]  = 0;
        dst[2]  = 0;
        dst[3]  = 0;
    
        dst[4]  = 0;
        dst[5]  = f;
        dst[6]  = 0;
        dst[7]  = 0;
    
        dst[8]  = 0;
        dst[9]  = 0;
        dst[10] = (zNear + zFar) * rangeInv;
        dst[11] = -1;
    
        dst[12] = 0;
        dst[13] = 0;
        dst[14] = zNear * zFar * rangeInv * 2;
        dst[15] = 0;
    
        return dst;
      }
    

    如果你有这样的顶点着色器

    attribute vec4 a_position;
    uniform mat4 u_matrix;
    void main() {
      gl_Position = u_matrix * a_position;
    }
    

    您将在 WebGL 中获得二维投影坐标。如果实际上想要在说 JavaScript 中以像素为单位的坐标,则需要除以 w 并扩展为像素

    var transformPoint = function(m, v) {
      var x = v[0];
      var y = v[1];
      var z = v[2];
      var w = x * m[0*4+3] + y * m[1*4+3] + z * m[2*4+3] + m[3*4+3];
      return [(x * m[0*4+0] + y * m[1*4+0] + z * m[2*4+0] + m[3*4+0]) / w,
              (x * m[0*4+1] + y * m[1*4+1] + z * m[2*4+1] + m[3*4+1]) / w,
              (x * m[0*4+2] + y * m[1*4+2] + z * m[2*4+2] + m[3*4+2]) / w];
    };
    
    var somePoint = [20,30,40];
    var projectedPoint = transformPoint(projectionMatrix, somePoint);
    
    var screenX = (projectedPoint[0] *  0.5 + 0.5) * canvas.width;
    var screenZ = (projectedPoint[1] * -0.5 + 0.5) * canvas.height;
    

    more here

    【讨论】:

      【解决方案2】:

      假设该点在世界坐标中,并且您的相机有一个世界矩阵和一个投影矩阵,这要简单得多:

      function point3d_to_screen(point, cameraWorldMatrix, projMatrix, screenWidth, screenHeight) {
        var mat, p, x, y;
        p = [point[0], point[1], point[2], 1];
        mat = mat4.create();
        mat4.invert(mat, cameraWorldMatrix);
        mat4.mul(mat, projMatrix, mat);
        vec4.transformMat4(p, p, mat);
        x = (p[0] / p[3] + 1) * 0.5 * screenWidth;
        y = (1 - p[1] / p[3]) * 0.5 * screenHeight;
        return [x, y];
      }
      

      我在这个函数中使用gl-matrix

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2015-05-06
        • 2011-06-07
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多