查看: 4766|回复: 15

一个小问题。

[复制链接]

该用户从未签到

发表于 2008-3-8 22:08:55 | 显示全部楼层 |阅读模式
编译错误:
1>g:\osgexamples\osgexap\osgexap\pyramidgeometry .cpp(106) : error C2512: “osg:ositionAttitudeTransform”: 没有合适的默认构造函数可用
指向这句:
//初始化位置变换节点
osg::PositionAttitudeTransform* pyramidTwoXForm =
        new osg::PositionAttitudeTransform();

知道是头文件的问题,加了这两个:
#include <osg/Transform>
#include <osg/NodeVisitor>
还是不行,OSG中那么多头文件??

该用户从未签到

 楼主| 发表于 2008-3-8 22:19:34 | 显示全部楼层
问题已经解决,
各位能不能给一下有关OSG学习的网站,手册之类的,

该用户从未签到

 楼主| 发表于 2008-3-8 23:17:35 | 显示全部楼层
编译是通过了,但是却什么都没有显示,蓝屏一片;
我加上了osgview了啊:
        osgViewer::Viewer viewer;
        viewer.setSceneData( root );
        viewer.run();
可能是什么原因??高手指教。

该用户从未签到

发表于 2008-3-9 00:18:09 | 显示全部楼层
原帖由 dizuo 于 2008-3-8 23:17 发表
编译是通过了,但是却什么都没有显示,蓝屏一片;
我加上了osgview了啊:
        osgViewer::Viewer viewer;
        viewer.setSceneData( root );
        viewer.run();
可能是什么原因??高手指教。


嗯,您给的信息有点少,这样的话可能的错误是很多的:比如要加载的文件名不正确,路径信息有误,或者root节点的类型与readNodeFile读出的实际类型不匹配等等。能大概再给出一下程序代码或者编写流程吗?
至于有关OSG学习的网站和手册之类的,个人觉得本站是比较全面的选择了,呵呵。本站的网页部分包括大量翻译自官方网站的OSG及相关软件和知识,目前网络上流传的大部分教程应该也都在论坛上有涵盖,FreeSouth等很多朋友经验也很丰富,多提问多讨论一定可以迅速提高的~~

该用户从未签到

发表于 2008-3-9 01:08:58 | 显示全部楼层


问问题的话,请尽量能够详细点~~~~~~~~

该用户从未签到

 楼主| 发表于 2008-3-9 07:45:56 | 显示全部楼层
谢谢ls两位大哥的回复.
我没有用到readNodeFile函数,
我的例子就是按照:
http://www.osgchina.org/projects/osgcn/wikicn/Supportcn/Tutorials/BasicGeometry.php
这里写的.但不知为什么是蓝屏,没有显示的内容.
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-3-9 08:56:06 | 显示全部楼层
    readNodeFile是读取数据的,你没用肯定不行的,把这句:viewer.setSceneData( root );

    改成viewer.setSceneData(osgDB::ReadNodeFile("glider.osg")) ;
    试试~~~~读一个飞机进去看看可行不

    该用户从未签到

     楼主| 发表于 2008-3-9 09:28:19 | 显示全部楼层
    TO FreeSouth:
    是这样子的,我是自己建立了一个简单的模型, 所以没有用readNodeFile函数。

    该用户从未签到

    发表于 2008-3-9 14:01:50 | 显示全部楼层
    原帖由 dizuo 于 2008-3-9 09:28 发表
    TO FreeSouth:
    是这样子的,我是自己建立了一个简单的模型, 所以没有用readNodeFile函数。


    使用Geometry绘制图形时要注意以下几个地方:
    · 是否正确设置了顶点坐标,并使用setVertexArray将其赋予Geometry?
    · 是否正确定义了一个PrimitiveSet类,并使用addPrimitiveSet将其赋予Geometry?
    · 是否使用addDrawable正确地将Geometry添加给Geode?
    · 是否使用addChild或者setSceneData正确地将Geode添加给场景?
    以上四步都正确执行的话,即使不设置法向量和颜色,应该也可以看到图形了。旋转一下场景的视角,看看图形是否绘制正确(如果您只是画了一个四边形面片,要注意它是不是一开始就与视角平行,以致您看不到它的存在!)。

    该用户从未签到

     楼主| 发表于 2008-3-9 14:13:45 | 显示全部楼层
    谢谢array以及ls几位的回复.
    貌似都做了,这是主程序代码:
    int main()
    {
            osg::Group* root=new osg::Group();
            osg::Geode* pyramidGeode =new osg::Geode();
            osg::Geometry* pyramidGeometry= new osg::Geometry();

            pyramidGeode->addDrawable(pyramidGeometry);
            root->addChild(pyramidGeode);
           
            osg::Vec3Array* pyramidVertices = new osg::Vec3Array;
            pyramidVertices->push_back( osg::Vec3( 0,  0,  0 ) );        //Left front        -----0  
            pyramidVertices->push_back( osg::Vec3(10,  0,  0 ) );        //right front        -----1
            pyramidVertices->push_back( osg::Vec3(10, 10,  0 ) );        //right back        -----2
            pyramidVertices->push_back( osg::Vec3( 0, 10,  0 ) );        //left back-----3
            pyramidVertices->push_back( osg::Vec3( 5,  5, 10 ) );        //Top-----4

            pyramidGeometry->setVertexArray( pyramidVertices );

            //为了保证背面剔除(backface cullling)的正确,我们需要按照逆时针的顺序添加顶点数据
           
            //法线垂直于底面指向几何体外;所以顶点顺序:3, 2, 1, 0
            osg:rawElementsUInt* pyramidBase = new
                    osg::DrawElementsUInt( osg:rimitiveSet:UADS, 0 );
            pyramidBase->push_back(3);
            pyramidBase->push_back(2);
            pyramidBase->push_back(1);
            pyramidBase->push_back(0);
           
            //法线垂直于侧面向外,顺序;
            osg::DrawElementsUInt* pyramidFaceOne = new
                    osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 );
            pyramidFaceOne->push_back(0);                        //----0
            pyramidFaceOne->push_back(1);
            pyramidFaceOne->push_back(4);

            osg::DrawElementsUInt* pyramidFaceTwo = new
                    osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 );
            pyramidFaceTwo->push_back(1);                        //----1
            pyramidFaceTwo->push_back(2);
            pyramidFaceTwo->push_back(4);

            osg::DrawElementsUInt* pyramidFaceThree = new
                    osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 );
            pyramidFaceThree->push_back(2);                        //----2
            pyramidFaceThree->push_back(3);
            pyramidFaceThree->push_back(4);

            osg::DrawElementsUInt* pyramidFaceFour = new
                    osg::DrawElementsUInt( osg::PrimitiveSet::TRIANGLES, 0 );
            pyramidFaceFour->push_back(3);                        //----3
            pyramidFaceFour->push_back(0);       
            pyramidFaceFour->push_back(4);

            osg::Vec4Array* colors = new osg::Vec4Array;
            colors->push_back( osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) );        //索引0--red
            colors->push_back( osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f) );        //索引1--green
            colors->push_back( osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f) );        //索引2--blue
            colors->push_back( osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) );        //索引3--white

            osg::TemplateIndexArray
                    <unsigned int, osg::Array::UIntArrayType, 4, 4> *colorIndexArray;
            colorIndexArray =
                    new osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType, 4, 4>;
            colorIndexArray->push_back(0); // vertex 0 assigned color array element 0
            colorIndexArray->push_back(1); // vertex 1 assigned color array element 1
            colorIndexArray->push_back(2); // vertex 2 assigned color array element 2
            colorIndexArray->push_back(3); // vertex 3 assigned color array element 3
            colorIndexArray->push_back(0); // vertex 4 assigned color array element 0

            pyramidGeometry->setColorArray( colors );
            pyramidGeometry->setColorIndices( colorIndexArray );
            pyramidGeometry->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
           
            osg::Vec2Array* texcoords = new osg::Vec2Array(5);
            (*texcoords)[0].set(0.00f,0.0f);
            (*texcoords)[1].set(0.25f,0.0f);
            (*texcoords)[2].set(0.50f,0.0f);
            (*texcoords)[3].set(0.75f,0.0f);
            (*texcoords)[4].set(0.50f,1.0f);
            pyramidGeometry->setTexCoordArray(0,texcoords);
           
            //初始化位置变换节点
            osg::PositionAttitudeTransform* pyramidTwoXForm =
                    new osg::PositionAttitudeTransform();

            //使用osg::Group的addChild方法,将位置变换节点添加到根节点的子节点上,并将金字塔节点作为变换节点的子节点
            root->addChild(pyramidTwoXForm);
            pyramidTwoXForm->addChild(pyramidGeode);

            // 初始化一个Vec3实例,用于改变模型在场景中的位置
            osg::Vec3 pyramidTwoPosition(15,0,0);
            pyramidTwoXForm->setPosition( pyramidTwoPosition );

            osgViewer::Viewer viewer;
            viewer.setSceneData( root );
            viewer.run();
    }

    该用户从未签到

     楼主| 发表于 2008-3-9 14:15:05 | 显示全部楼层
    代码中为什么会出现图标呢?

    该用户从未签到

    发表于 2008-3-9 14:25:08 | 显示全部楼层
    貌似没有执行addPrimitiveSet的工作~~
    1. osg::DrawElementsUInt* pyramidBase =
    2.       new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
    3. pyramidBase->push_back(3);
    4. pyramidBase->push_back(2);
    5. pyramidBase->push_back(1);
    6. pyramidBase->push_back(0);
    7. // 缺少 pyramidGeometry->addPrimitiveSet(pyramidBase);

    8. osg::DrawElementsUInt* pyramidFaceOne =
    9.       new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
    10. pyramidFaceOne->push_back(0);
    11. pyramidFaceOne->push_back(1);
    12. pyramidFaceOne->push_back(4);
    13. // 缺少 pyramidGeometry->addPrimitiveSet(pyramidFaceOne);
    复制代码
    要插入程序代码的话,请在编辑帖子的时候,选中所有的代码行并点击工具栏图标第一行的最后一个(类似 <> 的那个)

    该用户从未签到

     楼主| 发表于 2008-3-9 14:38:26 | 显示全部楼层
    1. 谢谢array的回复。问题解决了。再次感谢!
    复制代码

    该用户从未签到

    发表于 2008-3-9 15:01:56 | 显示全部楼层
    原帖由 dizuo 于 2008-3-9 14:15 发表
    代码中为什么会出现图标呢?


    禁用表情就能解决吧

    该用户从未签到

    发表于 2010-10-9 15:13:33 | 显示全部楼层
    你好,我也遇到了这个问题 “osgsitionAttitudeTransform”: 没有合适的默认构造函数可用
    请问是如何解决的啊?

    该用户从未签到

    发表于 2010-10-9 20:28:30 | 显示全部楼层
    您恐怕没有包含相应的头文件吧?

    #include <osg/PositionAttitudeTransform>
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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