在osg中osgGetVersion()获取osg的版本信息。
本例子通过Geode和Geometry创建最基本的几何体,实现logo的绘制,不进行详细的研究。
里面的地球,通过ShapeDrawable纹理贴图,MatrixTransform的setUpdateCallback(new
osg::AnimationPathCallback实现自动的旋转。
本例子MyBillboardTransform : public osg::PositionAttitudeTransform实现了朝向一直屏幕
的效果,这里需要比较一下MyBillboardTransform、Billboard、AutoTransform朝向屏幕的实现
方法。首先看MyBillboardTransform:
重写computeLocalToWorldMatrix方法,计算视点坐标
bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const
{
osg::Quat billboardRotation;
osgUtil::CullVisitor*
cullvisitor = dynamic_cast<osgUtil::CullVisitor*>(nv);
if (cullvisitor)
{
osg::Vec3 eyevector = cullvisitor->getEyeLocal()-
_position;
eyevector.normalize();
osg::Vec3 side =
_axis^_normal;
side.normalize();
float angle = atan2
(eyevector*_normal,eyevector*side);
billboardRotation.makeRotate
(osg::PI_2-angle,_axis);
}
matrix.preMultTranslate(_position);
matrix.preMultRotate(billboardRotation);
matrix.preMultRotate
(_attitude);
matrix.preMultTranslate(-_pivotPoint);
return
true;
}实现节点一直朝向屏幕
看看Billboard
Billboard是在CullVisitor void CullVisitor::apply(Billboard& node)的时候也是获取视点
坐标,调用computeMatrix来实现的,根据不同的设置方法计算computeMatrix(Matrix&
modelview, const Vec3& eye_local, const Vec3& pos_local) const中的modelview。
AutoTransform也是在AutoTransform::computeLocalToWorldMatrix(Matrix&
matrix,NodeVisitor*)中计算computeMatrix()修改_cachedMatrix.makeRotate(_rotation);
_cachedMatrix.postMultTranslate(_position);
_cachedMatrix.preMultScale(_scale);
_cachedMatrix.preMultTranslate(-_pivotPoint);这几个影响节点编号的属性来实现的。
总结起来,他们都是在剔除的过程中通过CullVisitor的apply方法,调用各自的方法来完成朝向
屏幕矩阵的计算。
本例子通过Geode和Geometry创建最基本的几何体,实现logo的绘制,不进行详细的研究。
里面的地球,通过ShapeDrawable纹理贴图,MatrixTransform的setUpdateCallback(new
osg::AnimationPathCallback实现自动的旋转。
本例子MyBillboardTransform : public osg::PositionAttitudeTransform实现了朝向一直屏幕
的效果,这里需要比较一下MyBillboardTransform、Billboard、AutoTransform朝向屏幕的实现
方法。首先看MyBillboardTransform:
重写computeLocalToWorldMatrix方法,计算视点坐标
bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const
{
osg::Quat billboardRotation;
osgUtil::CullVisitor*
cullvisitor = dynamic_cast<osgUtil::CullVisitor*>(nv);
if (cullvisitor)
{
osg::Vec3 eyevector = cullvisitor->getEyeLocal()-
_position;
eyevector.normalize();
osg::Vec3 side =
_axis^_normal;
side.normalize();
float angle = atan2
(eyevector*_normal,eyevector*side);
billboardRotation.makeRotate
(osg::PI_2-angle,_axis);
}
matrix.preMultTranslate(_position);
matrix.preMultRotate(billboardRotation);
matrix.preMultRotate
(_attitude);
matrix.preMultTranslate(-_pivotPoint);
return
true;
}实现节点一直朝向屏幕
看看Billboard
Billboard是在CullVisitor void CullVisitor::apply(Billboard& node)的时候也是获取视点
坐标,调用computeMatrix来实现的,根据不同的设置方法计算computeMatrix(Matrix&
modelview, const Vec3& eye_local, const Vec3& pos_local) const中的modelview。
AutoTransform也是在AutoTransform::computeLocalToWorldMatrix(Matrix&
matrix,NodeVisitor*)中计算computeMatrix()修改_cachedMatrix.makeRotate(_rotation);
_cachedMatrix.postMultTranslate(_position);
_cachedMatrix.preMultScale(_scale);
_cachedMatrix.preMultTranslate(-_pivotPoint);这几个影响节点编号的属性来实现的。
总结起来,他们都是在剔除的过程中通过CullVisitor的apply方法,调用各自的方法来完成朝向
屏幕矩阵的计算。