三维空间的物体点坐标设为(x,y,z),求解其在屏幕上的映射点,需要的输入为:三维坐标点、pvm矩阵(projection * view * model)、渲染屏幕的宽高及起始点(left,up,width,height)。
cv::Point ptCast(Vec3f pos3D, int* viewPort, float* pmv)
{
GLKMatrix4 pmvMatrix={ pmv[0], pmv[1], pmv[2], pmv[3],
pmv[4], pmv[5], pmv[6], pmv[7],
pmv[8], pmv[9], pmv[10], pmv[11],
pmv[12], pmv[13], pmv[14], pmv[15] };
GLKVector4 scaleVector={pos3D[0], pos3D[1], pos3D[2], 1.0};
GLKVector4 res = GLKMatrix4MultiplyVector4(pmvMatrix, scaleVector);
res.v[0]/=res.v[3];
res.v[1]/=res.v[3];
res.v[0]=viewPort[0]+viewPort[2]*(res.v[0]+1.0)/2.0;
res.v[1]=-viewPort[1]+viewPort[3]*(1.0-(res.v[1]+1.0)/2.0);
return cv::Point(res.v[0],res.v[1]);
}
上程序中可以看出其主要工作就是仿照顶点着色器的机制 glPosition = projection * view * model * vec4(position, 1.0) 进行计算(注意:传入的三维坐标点xyz需要是-1到1范围的,和传入顶点着色器的坐标一致)。得到的glPosition每个分量除以最后一个分量值(这个过程学名为透视除法)是opengl渲染中自动进行的,这就得到了x、y均在(-1,1)范围的二维坐标了,接下来便是将其搞到屏幕大小和左上角为原点的坐标系上了,需要注意一点的是y轴需要做个镜像,屏幕坐标系的y是向下为正的。
以上。