查看: 2319|回复: 5

随相机移动的节点

[复制链接]

该用户从未签到

发表于 2008-12-30 18:06:07 | 显示全部楼层 |阅读模式
如何创建随相机移动的节点,我想让天空和地面随相机移动,与相机保持固定距离

该用户从未签到

发表于 2008-12-30 20:08:47 | 显示全部楼层
在更新回调中计算相机的位置矩阵,然后据此计算节点的位置,我想应该是可以的

该用户从未签到

 楼主| 发表于 2008-12-31 11:26:34 | 显示全部楼层
能否详细点,给出一点代码

该用户从未签到

发表于 2008-12-31 12:01:29 | 显示全部楼层
我手头没有代码。不过在百度上搜索“osg 天空盒”,倒是有一个很不错的有关天空的设计,我以前试验过确实可用。只是做法复杂一些:用一个CULL回调来获取当前的模型视点矩阵,并且重载了Transform类来调整天空的位置。如果只想实现简单的效果,那么这一做法倒是不太推荐

简单的做法则可以用Update回调,取得摄像机的观察矩阵,它的逆矩阵即为摄像机在世界中的位置,然后据此调整物体的位置即可。

该用户从未签到

发表于 2008-12-31 15:53:33 | 显示全部楼层

您可以看下这段,是osgEphemeris里面的

class MoveWithEyePointTransform : public osg::Transform
        {
            public:
                MoveWithEyePointTransform():_enabled(true) {}

                void setCenter( osg::Vec3 center ) { _center = center; }
                void enable()  { _enabled = true; }
                void disable() { _enabled = false; }
                bool isEnabled() const { return _enabled; }

                virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const
                {
                    if( _enabled )
                    {
                        osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
                        if (cv)
                        {
                            osg::Vec3 eyePointLocal = cv->getEyeLocal();
                            matrix.preMult(osg::Matrix::translate(
                                        osg::Vec3( eyePointLocal.x(),eyePointLocal.y(),0.0f) - _center));
                        }
                    }
                    return true;
                }
            private:
                bool _enabled;
                osg::Vec3 _center;
        };

该用户从未签到

发表于 2009-1-1 15:57:18 | 显示全部楼层
你可以看看osgGA::NodeTrackerManipulator ~~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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