簡體   English   中英

WebGL透視投影矩陣

[英]WebGL Perspective Projection Matrix

有人可以在javascript / webGL中向我展示一個將3d坐標更改為2d投影透視坐標的函數嗎? 日Thnx

這是一個非常典型的透視矩陣函數

  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中獲得2d投影坐標。 如果實際上想在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;

這里更多

假設點在世界坐標中,並且您的相機具有世界矩陣和投影矩陣,則這要簡單得多:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM