查看: 3835|回复: 12

MFC程序创建球体的时候怎么是扁的啊

[复制链接]

该用户从未签到

发表于 2008-6-28 11:42:32 | 显示全部楼层 |阅读模式
大家一致推荐我问array。我用mfc的程序创建了一个球体,贴上去了一个地球影像的那个纹理。坐标系统是wgs84的我完全参照的是例子的程序啊,但是用mfc的框架做出来球就是扁的,不用mfc的窗口,或者全屏的时候就是对的。为什么呢?感觉好像是viewport算的不对似的,但是我简单调试了一下,值是对的啊?请array帮忙解决一下吧!

该用户从未签到

发表于 2008-6-28 17:48:52 | 显示全部楼层
谢谢您的信任,不过单凭您的描述,我恐怕也不太清楚问题的所在~~

您可以先看看是不是GraphicsContext::Traits的参数,或者透视投影的参数出了问题?
如果您确信这些都不会有错的话(事实上大多数问题都源自我们的疏忽或者笔误~~),最好的方法是上传一部分有问题的源代码,这样有助于大家合力分析和解决难题。

该用户从未签到

 楼主| 发表于 2008-6-28 19:54:09 | 显示全部楼层

回复 2楼 的帖子

[code]
osg::Node* createEarth()
{
    osg::TessellationHints* hints = new osg::TessellationHints;
    hints->setDetailRatio(5.0f);

   
    osg::ShapeDrawable* sd = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0,0.0,0.0), osg::WGS_84_RADIUS_POLAR), hints);
   
    osg::Geode* geode = new osg::Geode;
    geode->addDrawable(sd);
   
    std::string filename = osgDB::findDataFile("Images/land_shallow_topo_2048.jpg");
    geode->getOrCreateStateSet()->setTextureAttributeAndModes(0, new osg::Texture2D(osgDB::readImageFile(filename)));
   
    osg::CoordinateSystemNode* csn = new osg::CoordinateSystemNode;
    csn->setEllipsoidModel(new osg::EllipsoidModel());
    csn->addChild(geode);
   
    return csn;
   
}
[/code]

我只把这段从别的例子里面拿过来的,代码放到mfc的例子里面,出来的球是扁的,跟我mfc窗口有关系。

该用户从未签到

 楼主| 发表于 2008-6-28 19:58:19 | 显示全部楼层

回复 2楼 的帖子

[code]

BOOL CMainFrame:reCreateWindow(CREATESTRUCT& cs)
{
    if( !CMDIFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs

cs.cx = 800;
cs.cy = 400;

    return TRUE;
}
[/code]

窗口比例差距越大,球体越是扁。甚至我宽高反过来,更是夸张了。

该用户从未签到

 楼主| 发表于 2008-6-28 20:05:02 | 显示全部楼层

回复 2楼 的帖子

[code]
void cOSG::InitSceneGraph(void)
{
    //// Init the main Root Node/Group
    mRoot  = new osg::Group;

    //// Load the Model from the model name
    //mModel = osgDB::readNodeFile(m_ModelName);

    //// Optimize the model
    //osgUtil::Optimizer optimizer;
    //optimizer.optimize(mModel.get());
    //optimizer.reset();

    // Add the model to the scene
    //mRoot->addChild(mModel.get());
mRoot->addChild(createEarth());
}
[/code]

该用户从未签到

发表于 2008-6-28 20:19:29 | 显示全部楼层
建议你参考一下MFC的那个例子,使用osg::GraphicsContext::Traits~~~~其实这个使用它的默认比例就可以了,2.X以上系列,在窗口控制的方式上发生了变化,这个也算是一个小的BUG吧~~~

贴代码时最好加上【code】【/code】这样大家看代码也方便一点~~~~~~~

该用户从未签到

发表于 2008-6-29 15:32:18 | 显示全部楼层
请检查一下程序中含有
osg::GraphicsContext::Traits
或者
setProjectionMatrixAsPerspective
字样的代码。您发上来的代码好像不含有窗口相关的信息

如果
cs.cx = 800;
cs.cy = 400;
指的是窗口大小的话,那么如何正确地设定透视投影(Perspective)就尤为重要了,否则很可能出现画面扁平的情形。
把窗口大小指定为标准的4:3是否就显示正常了?那样的话请务必设置setProjectionMatrixAsPerspective的参数

该用户从未签到

发表于 2008-7-3 01:20:34 | 显示全部楼层
关于这个问题我遇到过,你要是能得到显示器的分辨率来创建你的窗口就没问题了!

该用户从未签到

发表于 2008-7-3 08:52:09 | 显示全部楼层
traits->x = 0;
    traits->y = 0;
    traits->width = ************;
    traits->height = ***************;
    traits->windowDecoration = false;
    traits->doubleBuffer = true;
    traits->sharedContext = 0;
    traits->setInheritedWindowPixelFormat = true;
    traits->inheritedWindowData = windata;
我用******标注的那个宽度和高度,创建的时候要满足比率!要不然你创建的任何物体都会变形!

该用户从未签到

发表于 2010-12-10 14:43:42 | 显示全部楼层
我也遇到了这个问题,不知道你解决了没?讨论下吧,3Q!

该用户从未签到

发表于 2010-12-10 20:47:17 | 显示全部楼层
有可能是你的透视投影没有跟着窗口的纵横比变化而变化。不论是OpenGL还是用osg来写程序,都要做这个事情的。
osg内部搞了很复杂的一段代码来动态计算这个东西,同时还在动态计算远近剪裁面的距离,当窗口变化时,它会自动计算投影矩阵改变量。不过也许你关闭了这个功能??

该用户从未签到

发表于 2010-12-10 20:48:38 | 显示全部楼层
你可以试着在程序运行起来之后,拖拽窗口边沿,以改变窗口的纵横比,看看视图内的物体是不是跟着压扁、拉长?依此来验证是否是上述原因。

该用户从未签到

发表于 2010-12-16 01:16:16 | 显示全部楼层
很久以前的帖子了。。。貌似需要根据屏幕的宽高比不同,设置以下,典型的看flysky书里解决宽屏变形问题。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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