假设canvas坐标为[x,y,z],已知viewmatrix和projectmatrix,怎么将二维坐标转为三维坐标
谢谢回答,但是实际操作中还是有点困惑,比如下面将三维点转二维点中,得到裁剪坐标后为什么要除以w位的值
var point = [100, 0, 0, 1]; // 这是正面的右上角
// 使用矩阵计算出这一点的裁剪空间坐标
var clipspace = m4.transformVector(matrix, point);
// 将 X 和 Y 除以 W,和 GPU 一样
clipspace[0] /= clipspace[3];
clipspace[1] /= clipspace[3];
// 从裁剪空间转换到像素值
var pixelX = (clipspace[0] 0.5 + 0.5) gl.canvas.width;
var pixelY = (clipspace[1] -0.5 + 0.5) gl.canvas.height;
首先canvas坐标是二维的,你想把这个二维坐标转三维坐标就必须要有一个辅助面。比如你可以假设这个辅助面是裁剪空间中深度为0的面,那你把二维的canvas坐标的x,y转裁剪坐标的x',y',再拼上之前的深度0,可得裁剪坐标位(x',y',0)。接下来用(projectmatrix*viewmatrix)的逆矩阵乘以(x',y',0),便可得canvas坐标在世界坐标系中的相机远近裁剪面的中间的裁剪面上的一个三维点位。
w 是齐次坐标,你可以看一下透视投影矩阵的推导过程:https://juejin.cn/post/7067399682896429069。