查看: 1080|回复: 2

新手求指导,关于回调的问题

[复制链接]

该用户从未签到

发表于 2013-7-10 09:46:26 | 显示全部楼层 |阅读模式
在build时没有提示错误,但是运行就出错了,提示错误:
First-chance exception at 0x001f22e6 in e17.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x001f22e6 in e17.exe: 0xC0000005: Access violation reading location 0x00000000.
错误定位在:
fountain ->asGroup() ->getChild(0) ->setNodeMask(0) ;
具体代码2L附上

该用户从未签到

 楼主| 发表于 2013-7-10 09:46:54 | 显示全部楼层
具体代码如下:
// e17.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Geode>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>

//创建一条路径
osg::AnimationPath* createAnimationPath(const osg::Vec3& center,float radius,double looptime)
{
        //路径实体
        osg::AnimationPath* animationPath = new osg::AnimationPath;
        //设置循环模式为LOOP
        animationPath->setLoopMode(osg::AnimationPath:OOP);
        //设置关键点数
        int numSamples = 40;
        float yaw = 0.0f;
        float yaw_delta = 2.0f*osg:I/((float)numSamples-1.0f);
        float roll = osg::inDegrees(30.0f);
        //设置时间间隔
        double time=0.0f;
        double time_delta = looptime/(double)numSamples;
        //插入关键点与时间以及旋转角度和位置
        for(int i=0;i<numSamples;++i)
        {
                osg::Vec3 position(0,0,0);
                osg:uat rotation(osg::Quat(roll,osg::Vec3(0.0,1.0,0.0))*osg::Quat(-(yaw+osg::inDegrees(90.0f)),osg::Vec3(0.0,0.0,1.0)));
                //具体插入操作
                animationPath->insert(time,osg::AnimationPath::ControlPoint(position,rotation));
                yaw += yaw_delta;
                time += time_delta;
        }
        return animationPath;
}
//创建移动模型

osg::Node* createMovingModel(const osg::Vec3& center, float radius)
{
        float animationLength = 10.0f;
        //创建的路径
        osg::AnimationPath* animationPath = createAnimationPath(center,radius,animationLength);
        osg::Group* model = new osg::Group;
        //读取模型,并隐藏它下面的第一个结点
        osg::Node* fountain = osgDB::readNodeFile("fountain.osg");
        fountain ->asGroup() ->getChild(0) ->setNodeMask(0) ;
        //如果读取成功,则更新负于它的路径
        if (fountain)
        {
                osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;
        //设置更新回调
                xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0,1.0));
                //加入子模型结点
                xform->addChild(fountain);
                model->addChild(xform);
        }

        return model;
}

//创建模型

osg::Node* createModel()
{
        osg::Vec3 center(0.0f,0.0f,0.0f);
        float radius = 1.0f;
        osg::Group* root = new osg::Group;

        //创建移动的结点,以radius为半径转圈
        osg::Node* movingModel = createMovingModel(center,radius*0.8f);
        //把结点加入到root中并返回
        root->addChild(movingModel);
        return root;
}


int _tmain(int argc, _TCHAR* argv[])
{
        osgViewer::Viewer viewer;
        //创建模型
        osg::Node* model = createModel();
        //viewer.setSceneData(model);
        viewer.setSceneData(osgDB::readNodeFile("fountain.osg"));
        viewer.setCameraManipulator(new osgGA::TrackballManipulator());
        viewer.realize() ;
        return viewer.run();
}




该用户从未签到

发表于 2013-7-10 16:05:02 | 显示全部楼层
asgroup返回是否为0?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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