3D坐标在二维屏幕上的映射

        三维空间的物体点坐标设为(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是向下为正的。

        以上。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值