查看: 1356|回复: 10

绘制一个点

[复制链接]

该用户从未签到

发表于 2014-7-24 16:48:28 | 显示全部楼层 |阅读模式
请问在OSG中如何绘制单个顶点?

该用户从未签到

发表于 2014-7-25 17:15:31 | 显示全部楼层
设置位置 以及其他相关属性就可以了

该用户从未签到

 楼主| 发表于 2014-7-26 09:30:22 | 显示全部楼层
感觉只能绘制多个点(GL_POINTS),而无法绘制单个点

该用户从未签到

发表于 2014-7-28 11:43:57 | 显示全部楼层
单个顶点是多个顶点的特例

该用户从未签到

 楼主| 发表于 2014-7-28 14:37:14 | 显示全部楼层
本帖最后由 guangzhang 于 2014-7-28 14:47 编辑

但是设置为GL_POINTS无法绘制出单个顶点,至少要两个点,而且不能在同一位置,你可以试试

                osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
                osg::ref_ptr<osg::Group> root = new osg::Group;


                // 创建单个点
                osg::Vec3Array* pCoords = new osg::Vec3Array; // 顶点数组
                pCoords->push_back(osg::Vec3(1.0,1.0,1.0));
                pCoords->push_back(osg::Vec3(0.0,1.0,1.0));

                osg::Vec4Array* pColors = new osg::Vec4Array; // 颜色数组
                pColors->push_back(osg::Vec4(1.0,1.0,1.0,1.0));
                pColors->push_back(osg::Vec4(1.0,1.0,1.0,1.0));

                osg::ref_ptr<osg::Geometry> pGeometry = new osg::Geometry;
                pGeometry->setVertexArray(pCoords);
                pGeometry->setColorArray(pColors);
                pGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); // 颜色绑定
                pGeometry->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet::POINTS,0,pCoords->size()));
                pGeometry->getOrCreateStateSet()->setAttribute(new osg::Point(5.0));

                osg::ref_ptr<osg::Geode> pGeode = new osg::Geode;
                pGeode->addDrawable(pGeometry.get());

                root->addChild(pGeode.get());
                osgUtil::Optimizer optimizer;
                optimizer.optimize(root.get());

                viewer->setSceneData(root.get());
                viewer->realize();
                viewer->run();

该用户从未签到

 楼主| 发表于 2014-7-28 14:49:06 | 显示全部楼层
仔细看了看,只有一个点的时候,点是有绘制出来的,但是只要拖动视角就不见了,这是自己写的个测试的小程序。在我自己实际的项目中,加入一个点根本没有显示,必须要加入两个点以上。

该用户从未签到

发表于 2014-7-28 14:51:17 | 显示全部楼层
guangzhang 发表于 2014-7-28 14:37
但是设置为GL_POINTS无法绘制出单个顶点,至少要两个点,而且不能在同一位置,你可以试试

                osg::ref_pt ...

        osg::ref_ptr< osg::Geometry > _selector = new osg::Geometry;
        osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array(1);
        (*colors)[0] = osg::Vec4f(1.0f, 0.0f, 0.0f, 1.0f);
        osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(1);
        (*vertices)[0].set(0.0f, 0.0f, 0.0f);
        osg::ref_ptr<osg:rawElementsUInt> indices = new osg::DrawElementsUInt(GL_POINTS, 1);
        (*indices)[0] = 0;
        _selector->setVertexArray( vertices.get() );
        _selector->addPrimitiveSet( indices.get() );

        _selector->setDataVariance( osg::Object::DYNAMIC );
        _selector->setUseDisplayList( false );
        _selector->setUseVertexBufferObjects( true );
        _selector->setColorArray( colors.get() );
        _selector->setColorBinding( osg::Geometry::BIND_OVERALL );

我这样是可以的。。。。。。你用一个绘制不出来的时候没有任何提示吗?

该用户从未签到

 楼主| 发表于 2014-7-28 15:08:36 | 显示全部楼层
谢谢各位的回答,我知道原因了,是因为一个点的包围盒太小,所以被相机裁剪掉了,所以在大的场景中必须要关掉节点的裁剪,否则是看不到一个点的,使用osg::Node::setCullingActive(false)函数。

该用户从未签到

发表于 2014-7-31 19:20:33 来自手机 | 显示全部楼层
重设单点的包围盒,单点默认包围盒是零无法显示出来

该用户从未签到

发表于 2014-7-31 19:20:36 来自手机 | 显示全部楼层
重设单点的包围盒,单点默认包围盒是零无法显示出来

该用户从未签到

发表于 2014-7-31 19:20:37 来自手机 | 显示全部楼层
重设单点的包围盒,单点默认包围盒是零无法显示出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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