查看: 1492|回复: 5

在《OpenSceneGraph三维渲染引擎编程指南》中代码小纰漏?

[复制链接]

该用户从未签到

发表于 2011-4-26 23:06:10 | 显示全部楼层 |阅读模式
在《OpenSceneGraph三维渲染引擎编程指南》中 包3中的 布告板(Billboard)示例的代码中有点纰漏吧?我菜鸟,望大师指点。

00066  stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON) ;
应当改为:
00066  stateset->setTextureAttributeAndModes(0,texture.get(),osg::StateAttribute::ON) ;

另外
我用的开发软件是 vs2008
如果改过之后  在debug状态下 编译通过了,但是运行时 出现错误如下图:


怎么调都不行,请指教···

该用户从未签到

 楼主| 发表于 2011-4-26 23:28:01 | 显示全部楼层
上例在Release状态下 编译过不去。出现错误:
1>.\a.cpp(110) : error C2664: “osg::Group::addChild”: 不能将参数 1 从“osg::ref_ptr<T>”转换为“osg::Node *”
怎么办啊 急

该用户从未签到

发表于 2011-4-27 08:46:25 | 显示全部楼层
请给出错误处的相关代码

该用户从未签到

 楼主| 发表于 2011-4-27 18:37:55 | 显示全部楼层
/**********************************************************
*Write by FlySky
*zzuxp@163.com  http://www.OsgChina.org   
**********************************************************/
#include "stdafx.h"
#include <osgViewer/Viewer>

#include <osg/Node>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Group>
#include <osg/Billboard>
#include <osg/Texture2D>
#include <osg/Image>
#include <osg/PositionAttitudeTransform>
#include <osg/MatrixTransform>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>

osg::ref_ptr<osg::Node> createBillboardTree(osg::ref_ptr<osg::Image> image)
{
        //创建四边形
        osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry() ;

        //设置顶点
        osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array() ;
        v->push_back(osg::Vec3(-0.5f,0.0f,-0.5f)) ;
        v->push_back(osg::Vec3(0.5f,0.0f,-0.5f)) ;
        v->push_back(osg::Vec3(0.5f,0.0f,0.5f)) ;
        v->push_back(osg::Vec3(-0.5f,0.0f,0.5f)) ;

        geometry->setVertexArray(v.get()) ;

        //设置法线
        osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array() ;
        normal->push_back(osg::Vec3(1.0f,0.0f,0.0f)^osg::Vec3(0.0f,0.0f,1.0f));

        geometry->setNormalArray(normal.get()) ;
        geometry->setNormalBinding(osg::Geometry::BIND_OVERALL) ;

        //设置纹理坐标
        osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array() ;
        vt->push_back(osg::Vec2(0.0f,0.0f)) ;
        vt->push_back(osg::Vec2(1.0f,0.0f)) ;
        vt->push_back(osg::Vec2(1.0f,1.0f)) ;
        vt->push_back(osg::Vec2(0.0f,1.0f)) ;

        geometry->setTexCoordArray(0,vt.get()) ;

        //绘制四边形
        geometry->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:UADS,0,4)) ;

        if(image.get())
        {
                //状态属性对象
                osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet() ;
               
                //创建一个Texture2D属性对象
                osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D() ;
                //关联image
                texture->setImage(image.get()) ;
                //关联Texture2D纹理对象,第三个参数默认为ON
                stateset->setTextureAttributeAndModes(0,texture.get(),osg::StateAttribute::ON) ;
                //启用混合
                stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
                //关闭光照
                stateset ->setMode (GL_LIGHTING, osg::StateAttribute ::OFF) ;

                geometry->setStateSet(stateset.get()) ;
        }

        //创建Billboard对象一
        osg::ref_ptr<osg::Billboard> billboard1 = new osg::Billboard() ;
       
        //设置旋转模式为绕视点
        billboard1->setMode(osg::Billboard::POINT_ROT_EYE) ;
        //添加Drawable,并设置其位置,默认位置为osg::Vec3(0.0f,0.0f,0.0f) ;
        billboard1->addDrawable(geometry.get(),osg::Vec3(5.0f,0.0f,0.0f)) ;

        osg::ref_ptr<osg::Billboard> billboard2 = new osg::Billboard() ;
        //设置旋转模式为绕轴转,因此还需要设置转轴
        billboard2->setMode(osg::Billboard::AXIAL_ROT) ;
        //设置旋转轴
        billboard2->setAxis(osg::Vec3(0.0f,0.0f,1.0f)) ;
        billboard2->addDrawable(geometry.get(),osg::Vec3(10.0f,0.0f,0.0f)) ;

        osg::ref_ptr<osg::Group> billboard = new osg::Group() ;
        billboard->addChild(billboard1.get()) ;
        billboard->addChild(billboard2.get()) ;
               
        return billboard.get() ;
       
}

int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer() ;

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

        //读取图像
        osg::ref_ptr<osg::Image> image =osgDB::readImageFile("Images/tree0.rgba") ;

        //缩放一下,以达到合适的大小
        osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform() ;
        pat->setScale(osg::Vec3(5.0f,5.0f,5.0f)) ;
                      pat->addChild(createBillboardTree(image.get())) ;  //此处出错

        root->addChild(pat.get()) ;

        //读取cow的模型,以对比
        root->addChild(osgDB::readNodeFile("cow.osg")) ;

        //优化场景数据
        osgUtil::Optimizer optimizer ;
        optimizer.optimize(root.get()) ;

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

        viewer->realize() ;

        viewer->run() ;

        return 0 ;

}
//我是在Release模式下编译的。就出现2楼的错误了

该用户从未签到

 楼主| 发表于 2011-4-27 18:42:07 | 显示全部楼层
以上代码怎么会产生笑脸呢?不管了,他们依次代替为 D P Q P P P

该用户从未签到

发表于 2011-4-28 08:37:00 | 显示全部楼层
  1. pat->addChild(createBillboardTree(image.get()).get())
复制代码
就可以了,您的OSG版本不够
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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