查看: 971|回复: 3

新人,求大神解答!关于世界坐标向屏幕坐标的转化。

[复制链接]

该用户从未签到

发表于 2013-4-1 16:10:10 | 显示全部楼层 |阅读模式
#define M(row,col) m[col * 4 + row]
void Transform_Point(double out[4], const double m[16], const double in[4])
{
        out[0] = M(0, 0) * in[0] + M(0, 1) * in[1] + M(0, 2) * in[2] + M(0, 3) * in[3];
        out[1] = M(1, 0) * in[0] + M(1, 1) * in[1] + M(1, 2) * in[2] + M(1, 3) * in[3];
        out[2] = M(2, 0) * in[0] + M(2, 1) * in[1] + M(2, 2) * in[2] + M(2, 3) * in[3];
        out[3] = M(3, 0) * in[0] + M(3, 1) * in[1] + M(3, 2) * in[2] + M(3, 3) * in[3];}

osg::Vec3d WorldToScreen(osgViewer::View* view,osg::Vec3 bd)
{
        double in[4], out[4];
        in[0] = bd._v[0];
        in[1] = bd._v[1];
        in[2] = bd._v[2];
        in[3] = 1.0;
        //获得当前的投影矩阵和模型视图矩阵

        osg::Matrix projectMatrix= view->getCamera()->getProjectionMatrix();
        osg::Matrix viewprojectMatrix = view->getCamera()->getViewMatrix();
        //下面计算 模型视图矩阵 * 投影矩阵 * 视口窗口变换矩阵
        double modelViewMatrix[16];
        memcpy(modelViewMatrix,viewprojectMatrix.ptr(),sizeof(GLdouble) * 16);
        Transform_Point(out, modelViewMatrix, in);
        double myprojectMatrix[16];
        memcpy(myprojectMatrix,projectMatrix.ptr(),sizeof(GLdouble) * 16);
        Transform_Point(in, myprojectMatrix, out);
        if(int(in[3] * 100000) == 0)
        {
                return osg::Vec3d(0,0,0);
        }
        in[0] /= in[3];
        in[1] /= in[3];
        in[2] /= in[3];
        int viewPort[4];
        osg::Viewport* myviewPort = view->getCamera()->getViewport();
        viewPort[0] = 0;
        viewPort[1] = 0;
        viewPort[2] = mConfigure->GetScreenWidthPixel(); //横向象素点
        viewPort[3] = mConfigure->GetScreenHeightPixel();//纵向象素点
        //计算 三维点在屏幕上的二维投影点
        osg::Vec3d sceenPoint;
        sceenPoint._v[0] = (int)(viewPort[0] + (1 + in[0]) * viewPort[2] / 2 + 0.5);
        sceenPoint._v[1] = (int)(viewPort[1] + (1 + in[1]) * viewPort[3] / 2 + 0.5);
        sceenPoint._v[2] = 0;
        return sceenPoint;
}


viewPort[2] = mConfigure->GetScreenWidthPixel(); //横向象素点
mConfigure指的是什么?谢谢!

该用户从未签到

发表于 2013-4-1 16:21:11 | 显示全部楼层
连个定义的类型都不没有,我们怎么知道是什么,又开始猜谜语了

该用户从未签到

 楼主| 发表于 2013-4-1 16:27:42 | 显示全部楼层
我也很纠结啊!这个是网上的代码!谢谢你的关注!!

该用户从未签到

发表于 2013-4-1 16:54:42 | 显示全部楼层
那我更猜不到了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表