查看: 1103|回复: 4

osg编译链接都通过运行出错,求解决

[复制链接]

该用户从未签到

发表于 2014-12-12 10:32:35 | 显示全部楼层 |阅读模式

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventAdapter>
#include <osgGA/GUIEventHandler>

#include <osgGA/CameraManipulator>
#include <osg/MatrixTransform>
#include <osg/ShapeDrawable>

class Follow: public osgGA::CameraManipulator
{
public:
        Follow(osgViewer::Viewer *vv)
        {
                m_vPosition = osg::Vec3(0.0, 0.0, 3.0);
                m_vRotation = osg::Vec3(osg:I_2, 0.0f, 0.0f);
                m_fMoveSpeed = 2.0;
                m_fAnglg = 2.5;
                carPosition = osg::Vec3(0.0, 12.0, 0.0);
                mt = CreateMT();
                mt->setMatrix(osg::Matrixd::translate(osg::Vec3(0.0, 12.0, 0.0)));
                viewer = vv;
                if(viewer)
                {
                        viewer->getSceneData()->asGroup()->addChild(mt);
                }
        }
        virtual void setByMatrix(const osg::Matrixd& matrix)
        {

        }

        virtual void setByInverseMatrix(const osg::Matrixd& matrix)
        {

        }

        virtual osg::Matrixd getMatrix() const
        {
                osg::Matrixd mat;
                mat.makeRotate(m_vRotation.x(), osg::Vec3(1.0, 0.0, 0.0),
                        m_vRotation.y(), osg::Vec3(0.0, 1.0, 0.0),
                        m_vRotation.z(), osg::Vec3(0.0, 0.0, 1.0));
                return mat * osg::Matrixd::translate(m_vPosition);
        }

        virtual osg::Matrixd getInverseMatrix() const
        {
                osg::Matrixd mat;
                mat.makeRotate(m_vRotation.x(), osg::Vec3(1.0, 0.0, 0.0),
                        m_vRotation.y(), osg::Vec3(0.0, 1.0, 0.0),
                        m_vRotation.z(), osg::Vec3(0.0, 0.0, 1.0));
                return osg::Matrixd::inverse(mat * osg::Matrixd::translate(m_vPosition));
        }

        void ChangePosition(osg::Vec3 delta)
        {
                m_vPosition = osg::Vec3(m_vPosition.x(), m_vPosition.y(), 3.0);
                m_vPosition += delta;
        }


        void ChangePositionCar(osg::Vec3 delta)
        {
                osg::Vec3 temp;
                temp = osg::Vec3(m_vPosition.x(), m_vPosition.y(), 0.0);
                mt->setMatrix(osg::Matrixd::translate(temp + delta));
                carPosition = temp + delta;
        }

        void ChangePositionCarLeftRight(osg::Vec3 delta)
        {
                carPosition += delta;
                mt->setMatrix(osg::Matrixd::translate(carPosition));
        }

        osg::Geode* CreateSphere()
        {
                osg::ref_ptr<osg::Geode> gnode = new osg::Geode;
                gnode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0, 0.0, 1.0), 1)));
                return gnode.release();
        }

        osg::MatrixTransform* CreateMT()
        {
                osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
                mt->addChild(CreateSphere());
                mt->setMatrix(osg::Matrix::translate(0.0, 0.0, 0.0));
                return mt.release();
        }



        bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us)
        {
                switch(ea.getEventType())
                {
                case osgGA::GUIEventAdapter::KEYDOWN:
                        if(ea.getKey() == 'w' || ea.getKey() == 'W')
                        {
                                ChangePosition(osg::Vec3(m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation[2]), m_fMoveSpeed*sinf(osg::PI_2 + m_vRotation[2]), 0));
                                ChangePositionCar(osg::Vec3(m_fMoveSpeed * 6 * cosf(osg::PI_2 + m_vRotation[2]), m_fMoveSpeed * 6 * sinf(osg::PI_2 + m_vRotation[2]), 0));
                        }

                        else if(ea.getKey() == 's' || ea.getKey() == 'S')
                        {
                                ChangePosition(osg::Vec3(-m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation[2]), -m_fMoveSpeed*sinf(osg::PI_2 + m_vRotation[2]), 0));
                                ChangePositionCar(osg::Vec3(m_fMoveSpeed * 6 * cosf(osg::PI_2 + m_vRotation[2]), m_fMoveSpeed * 6 *sinf(osg::PI_2 + m_vRotation[2]), 0));

                        }
                        else if(ea.getKey() == 'a' || ea.getKey() == 'A')
                        {
                                ChangePosition(osg::Vec3(-m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation[2]), m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation[2]), 0));
                                ChangePositionCarLeftRight(osg::Vec3(-m_fMoveSpeed * sinf(osg::PI_2 + m_vRotation[2]), m_fMoveSpeed * cosf(osg::PI_2 + m_vRotation[2]), 0));
                        }
                        else if(ea.getKey() == 0xFF53) //右旋转
                        {
                                float temp = m_vRotation._v[2];
                                m_vRotation._v[2] -= osg:egreesToRadians(m_fAnglg);
                                ChangePosition(osg::Vec3(12*sin(m_vRotation._v[2]) - 12 * sin(temp), 12 * (1-cos(m_vRotation._v[2])) - 12*(1-cos(temp)), 0));
                        }
                        else if(ea.getKey() == 0xFF51) //左旋转
                        {
                                float temp = m_vRotation._v[2];
                                m_vRotation._v[2] += osg::DegreesToRadians(m_fAnglg);
                                ChangePosition(osg::Vec3(12*sin(m_vRotation._v[2]) - 12 * sin(temp), 12 * (1-cos(m_vRotation._v[2])) - 12*(1-cos(temp)), 0));
                        }
                        else
                        {
                        }
                }

                return false;
        }

private:
        osg::Vec3 m_vPosition;
        osg::Vec3 m_vRotation;
        float m_fMoveSpeed;
        float m_fAnglg;
        osg::Vec3 carPosition;
        osg::MatrixTransform* mt;
        osgViewer::Viewer *viewer;

};


int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer  = new osgViewer::Viewer;
        viewer->setSceneData(osgDB::readNodeFile("zzu1.ive"));
       
        viewer->setCameraManipulator(new Follow(viewer));
        return viewer->run();
}

该用户从未签到

 楼主| 发表于 2014-12-12 10:37:12 | 显示全部楼层
求大神帮我找找错,是osg72集里的源码,我直接拷贝过来的

该用户从未签到

发表于 2014-12-15 15:28:32 | 显示全部楼层
没有人会一行行帮您看代码
最好的方式是您自己运行调试,最不济也是将错误信息贴出来

该用户从未签到

发表于 2015-4-19 09:50:57 | 显示全部楼层
我在楼主代码前加了一段这个,链接错误就没有了

#ifdef _DEBUG
#pragma comment(lib,"osgViewerd.lib")
#pragma comment(lib,"osgDBd.lib")
#pragma comment(lib,"OpenThreadsd.lib")
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgGAd.lib")
#pragma comment(lib,"osgTextd.lib")
#pragma comment(lib,"osgUtild.lib")
#else
#pragma comment(lib,"osgViewer.lib")
#pragma comment(lib,"osgDB.lib")
#pragma comment(lib,"OpenThreads.lib")
#pragma comment(lib,"osg.lib")
#pragma comment(lib,"osgText.lib")
#pragma comment(lib,"osgUtil.lib")
#endif

该用户从未签到

发表于 2015-4-19 09:58:31 | 显示全部楼层
楼主还在否,我遇到的问题是运行起来后,wasd按键后画面没有反应,我看了下,程序是执行到handle函数的,不知道为什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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