WebGL透视投影矩阵
WebGL Perspective Projection Matrix
有人能告诉我一个函数在javascript/webGL将3d坐标改为2d投影视角坐标?非常感谢
这是一个非常典型的透视矩阵函数
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
相关文章:
- 如何检测用于WebGL的专用或集成显卡
- 在WebGL中绘制多个二维图像
- WebGL绘制图像
- webgl在一个正方形上操纵两个纹理
- 在OpenNI中将Zigfu关节位置从真实世界转换为类似投影的位置
- 如何在D3.js中绘制地图投影上的点,并使用范围滑块过滤数据
- html画布中的等轴测立方体投影
- Three.js,WebGL,渲染六幅图像的全景图
- 如何在使用IEWebGL时检测WebGL是否可用
- 是否可以使用不同投影的另一个WMS层显示OSM数据
- WebGL-依次应用多个程序
- 关于基于VivaGraph WebGL的渲染的问题
- WebGL多纹理多维数据集
- WebGl-倾斜投影
- 透视投影不显示任何内容
- 如何在没有 css3 和 webGL 的情况下将 3D 透视添加到 html5 画布
- 在webgl中实现透视矩阵
- WebGL和mat4.透视函数不起作用
- WebGL透视相机画布调整大小问题
- WebGL透视投影矩阵