osg--动画

回调

  • osg::Node
    • setUpdateCallback()
      • 参数为osg::NodeCallback
        • operator()重载
    • addUpdateCallback()
    • setEventCallback()
      • 参数为osg::NodeCallback
        • operator()重载
    • setCullCallback()
      • 参数为osg::NodeCallback
        • operator()重载
  • osg::Drawable
    • setUpdateCallback()
      • osg::Drawable::UpdateCallback
        • update()重载
    • setEventCallback()
      • osg::Drawable::EventCallback
        • event()重载
    • setCullCallback()
      • osg::Drawable::CullCallback
        • cull()重载
  • osg::StateAttribute
    • setUpdateCallback()
      • osg:: StateAttributeCallback
        • operator()重载
    • setEventCallback()
      • osg:: StateAttributeCallback
        • operator()重载
  • osg::Uniform
    • setUpdateCallback()
      • osg::Uniform:: Callback
        • operator()重载
    • setEventCallback()
      • osg::Uniform:: Callback
        • operator()重载
  • osg::Camera
    • setPreDrawCallback()
      • osg::Camera:: DrawCallback
        • operator()重载
    • setPostDrawCallback()
      • osg::Camera:: DrawCallback
        • operator()重载

traverse用法

  • node和Nodevisitor中traverse用法

在这里插入图片描述

  • callback中traverse用法:
    • 调用Nodevisitor的traverse方法,如果忘记了,traversal会停止

示例

#include <osg/Switch>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

class SwitchingCallback : public osg::NodeCallback
{
public:
	SwitchingCallback() : _count(0) {}
	virtual void operator()(osg::Node* node,
		osg::NodeVisitor* nv);

protected:
	unsigned int _count;
};
void SwitchingCallback::operator()(osg::Node* node,
	osg::NodeVisitor* nv)
{
	osg::Switch* switchNode = static_cast<osg::Switch*>(node);
	if (!((++_count) % 60) && switchNode)
	{
		switchNode->setValue(0, !switchNode->getValue(0));
		switchNode->setValue(1, !switchNode->getValue(1));
	}
	traverse(node, nv);
}
int main(int argc, char** argv)
{
	osg::ref_ptr<osg::Node> model1 = osgDB::readNodeFile(
		"cessna.osg");
	osg::ref_ptr<osg::Node> model2 = osgDB::readNodeFile("cessnafire.osg");
	osg::ref_ptr<osg::Switch> root = new osg::Switch;
	root->addChild(model1.get(), false);
	root->addChild(model2.get(), true);
	root->setUpdateCallback(new SwitchingCallback);

	osgViewer::Viewer viewer;
	viewer.setSceneData(root.get());
	return viewer.run();
}

避免冲突

osg::Object变量枚举值

  • UNSPECIFIED(default)

  • STATIC update和draw过程中不变

  • DYNAMIC update和cull完成后才能draw

      node->setDataVariance( osg::Object::DYNAMIC );
    

drawable回调中如果顶点和组元改变需调用

  • 更新显示列表中顶点和组元
    • setUseDisplayList(true)情况下
      • drawable->dirtyDisplayList()
    • setUseVertexBufferObjects(true)且setUseDisplayList(false)情况下
      • vertices->dirty();
  • 更新边界使cull正确
    • drawable->dirtyBound()

示例

#include <osg/Geometry>
#include <osg/Geode>
#include <osgViewer/Viewer>

osg::Geometry* createQuad
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本人主要从事图形图象工作,空闲之余接触了一些游戏编程,特写一些编程心得,本文 适合没有接触过人物动画编程的初学者,希望游戏制作的大虾们指点,交流。 在以前还有没接触人物动画编程的时候,觉得通过编程让人物动起来一定是一件很麻烦 的事情,尤其是初学者,大都会摸不着头脑,碰到诸如骨骼动画之类,似乎无从下手。但是 当你了解了它们的格式,就会发现其实真正的人物动画的制作并不是在编程阶段,而是在模 型构建阶段,程序员主要做工作的是掌握模型文件的格式,将存储在人物模型中的各种信息, 如顶点,面片,材质,骨骼或顶点运动的关键帧序列等信息读入内存然后用你熟悉的 SDK 绘制出来,再根据时间采用线性或者球形插值对动作序列的关键帧进行插值,不断变换顶点 坐标,从而得到了一系列连续的人物动画,听起来确实不难吧!当然你也可以在程序里自己 控制人物每一帧每一个关节的运动,我想做游戏的很少有人这么做吧。下面我向大家介绍一 下自己是如何编写人物动画程序的。本人从事的图形图象开发主要是基于 OpenGL 和 OSG 因此范例程序将采用 OpenGL 或 OSG。先声明一下,本人的语言表达能力很差,请大家多 多谅解指正。 考虑到没有接触过人物模型的朋友,我首先从人物模型的结构讲起,游戏人物编程主要 采用的人物模型格式有 Quake 里的md2,md3,Half Life 里的 mdl,Doom里的 md5,还有 典型的骨骼动画模型 ms3d…,至于3dmax 的模型,本人觉得太麻烦!在此我说两个有代表 性的 Md3,和 ms3d,其它的模型都大同小异,只要你了解了它们的格式,程序实现都不难。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值