【转】将3DMAX中的动画通过OGREMAX导入OGRE中,并生成相应的骨骼动画

原创内容转载请注明:http://weibo.com/gdexqin


程序代码的的基础在http://blog.sina.com.cn/s/blog_7c03dc6f01012um2.html中

先看导入后的效果。



动画模型是用别人传到网上的(好像这个人物叫真名法典的样子,不太认识,但是感谢上传者),之前我们已经完成了通过OGREMAX导入静态的场景的效果,导入骨骼动画我们需要对OGREMAX的导出选项进行一些修改。

下面先了解一下OGREMAX的一些基本选项(转自网络):

-------------我是分割线----------------------------------------------------------------------

在OgreMax->Object Settings中可以对导出物体的属性进行设置。这里介绍一下其中比较重要的一些选项。

General

Type 这一项决定了导出物体在.scene文件中的类型。最常用的是Entity/Mesh,这个类型在导出以后会生成一个node以及挂载在该node上面的entity,同时会把3ds
max中的该物体导出为一个.mesh文件。然后就比较常用的就是Empty,这种类型会导出为一个没有挂任何东西的node。比如说我用一个box来代表NPC出现的位置,那么这个box就可以设置为Empty类型。
Rendering 在这里设置物体的可见性、渲染顺序、shader参数等等
Node Animation

在这里设置物体的Node动画,即位置、旋转、缩放上的动画。物体模型本身变化的动画在Mesh Animation中设置。具体的用法还没有仔细研究。

User Data

自己游戏所需要的自定义数据就在这里设置了。点Configure...按钮添加上面所说的userdatatypes.xml文件以后,User Data Class中就会出现自定义的数据类型。这样就可以直接把3ds
max作为一个关卡编辑器来使用了。虽说还是没有专门的编辑器那么方便,不过大多数情况下还是够用了。

Mesh

Mesh Name和Skeleton Name可以制定输出的模型和骨骼的文件名,如果不指定的话则会以3ds max中物体的名字命名。

Mesh Animation

这里用来设置顶点动画或骨骼动画。可以把整个场景中物体的任意某一段动画制定某个名字以供程序调用。点击Add..会弹出Animation Settings窗口。通常其中的Track类型已经设置好了,骨骼动画是Physicue,
定点动画是Morph。只需要制定动作的起始帧号就可以了。要注意的是一个场景中某个物体的骨骼动画只能导出为一个skeleton文件,如果你需要把不同的动作导出为不同的动画的话,需要把骨骼动画保存为不同的max文件然后飞别导出。

自定义文件的读取

OgreMax提供了从3ds max中导出为.scene文件的机制,然是我们还是缺一个读取它的程序。虽然OgreMax中自带了一个Viewer程序,但是要处理自定义数据显然还是得自己动手写一个。这里可以参考Ogre
Wiki中的一个.scene文件读取程序的例子,在它的基础上进行修改:

http://www.ogre3d.org/wiki/index.php/New_DotScene_Loader

但是这个程序在很多地方都只是写了一个函数名而没有实现,并且对场景文件的处理和OgreMax导出的格式还是有所区别,需要自己进行大量修改。
-------------我是分割线----------------------------------------------------------------------

在之前的工作中,我们已经完成了 .scene文件 读取的工作,所以我们现在需要做的只是导出,对不同的OGREMAX其中的选项有一些差异,我的版本是OgreMaxSceneExporter2.4.1是目前最新的版本。

首先读入模型,

在Mesh Animation中进行一些设置,注意动画类型要选对


如果导出的动画贴图有错误,在

中打上勾。

之后将导出的文件加入我们的资源文件夹中,在程序的resources.cfg中加入相应的路径,并在程序中读入我们导入的模型和骨骼动画。
代码在此,和上次一样,是基于以前的代码基础的,只修改了一个文件。

代码在此:EnvMapping.h

#include "Ogremaxscene.hpp"

#include "BaseApplication.h"

#include "SinbadCharacterController.h"

class EnvMapApplication : public BaseApplication

{

public:

EnvMapApplication() {}

OgreMax::OgreMaxScene *m_maxScene;

AnimationState * mAnimationState;

AnimationStateSet *mAnimationStateSet;

bool frameRenderingQueued(const FrameEvent& evt)

{

// let character update animations and camera

mChara->addTime(evt.timeSinceLastFrame);

mAnimationState->addTime( evt.timeSinceLastFrame );

return BaseApplication::frameRenderingQueued(evt);

}

bool keyPressed(const OIS::KeyEvent& evt)

{

// relay input events to character controller

if (!mTrayMgr->isDialogVisible()) mChara->injectKeyDown(evt);

return BaseApplication::keyPressed(evt);

}

bool keyReleased(const OIS::KeyEvent& evt)

{

// relay input events to character controller

if (!mTrayMgr->isDialogVisible()) mChara->injectKeyUp(evt);

return BaseApplication::keyReleased(evt);

}

#if OGRE_PLATFORM == OGRE_PLATFORM_IPHONE

bool touchPressed(const OIS::MultiTouchEvent& evt)

{

// relay input events to character controller

if (!mTrayMgr->isDialogVisible()) mChara->injectMouseDown(evt);

return SdkSample::touchPressed(evt);

}

bool touchMoved(const OIS::MultiTouchEvent& evt)

{

// relay input events to character controller

if (!mTrayMgr->isDialogVisible()) mChara->injectMouseMove(evt);

return SdkSample::touchMoved(evt);

}

#else

bool mouseMoved(const OIS::MouseEvent& evt)

{

// relay input events to character controller

if (!mTrayMgr->isDialogVisible()) mChara->injectMouseMove(evt);

return BaseApplication::mouseMoved(evt);

}

bool mousePressed(const OIS::MouseEvent& evt, OIS::MouseButtonID id)

{

// relay input events to character controller

if (!mTrayMgr->isDialogVisible()) mChara->injectMouseDown(evt, id);

return BaseApplication::mousePressed(evt, id);

}

#endif

protected:

// Just override the mandatory create scene method

void createScene(void)

{

m_maxScene = new OgreMax::OgreMaxScene();

// 1.scene是ogremax导出的场景文件名,,当然你也可以用绝对路径,但不建议那样做。

m_maxScene->Load("123.scene",mWindow,OgreMax::OgreMaxScene::NO_OPTIONS, 0, 0);

// 读取MaxScene文件中的设定的场景管理器

mSceneMgr = m_maxScene->GetSceneManager();

// 读取Max文件中的设定的Camera

// mCamera = mSceneMgr->getCamera("Camera02"); // 1.scene文件中指定的照相机名称

mCamera = mSceneMgr->Ogre::SceneManager::createCamera("Chara");

Ogre::Viewport* vp = mWindow->addViewport(mCamera);

vp->setBackgroundColour(Ogre::ColourValue(0,0,0));

mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth())/Ogre::Real(vp->getActualHeight()));

mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));

// mCameraMan = new OgreBites::SdkCameraMan(mCamera);

//获取节点

//Entity *ent= mSceneMgr->getEntity("Teapot01");

//ent->setMaterialName("Examples/EnvMappedRustySteel");

setupContent();

Ogre::Entity* girl = mSceneMgr->createEntity("girl", "ms_01_4.mesh");

Ogre::SceneNode* girlNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("girlNode",Ogre::Vector3(

100, 0, 50 ));

girlNode->attachObject(girl);

girlNode->scale( .3, .3, .3);

SkeletonPtr skel = SkeletonManager::getSingleton().load("ms_01_4.skeleton",

ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

// Animation* anim = skel->getAnimation("girlkk");

mAnimationStateSet = girl->getAllAnimationStates();

mAnimationState = girl->getAnimationState( "123" );

mAnimationState->setLoop( true );

mAnimationState->setEnabled( true );

//设置光源

// Create a point light

Ogre::Light* l = mSceneMgr->createLight("MainLight");

// Accept default settings: point light, white diffuse, just set position

// NB I could attach the light to a SceneNode if I wanted it to move automatically with

// other objects, but I don‘t

l->setPosition(20,20,50);

}

void setupContent()

{

// set shadow properties

mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);

mSceneMgr->setShadowColour(ColourValue(0.5, 0.5, 0.5));

mSceneMgr->setShadowTextureSize(1024);

mSceneMgr->setShadowTextureCount(1);

// use a small amount of ambient lighting

mSceneMgr->setAmbientLight(ColourValue(0.3, 0.3, 0.3));

// add a bright light above the scene

Light* light = mSceneMgr->createLight();

light->setType(Light::LT_POINT);

light->setPosition(-10, 40, 20);

light->setSpecularColour(ColourValue::White);

// create a floor mesh resource

MeshManager::getSingleton().createPlane("floor", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,

Plane(Vector3::UNIT_Y, 0), 100, 100, 10, 10, true, 1, 10, 10, Vector3::UNIT_Z);

// create a floor entity, give it a material, and place it at the origin

Entity* floor = mSceneMgr->createEntity("Floorchara", "floor");

floor->setMaterialName("Examples/Rockwall");

floor->setCastShadows(false);

mSceneMgr->getRootSceneNode()->attachObject(floor);

// create our character controller

mChara = new SinbadCharacterController(mCamera);

}

void cleanupContent()

{

// clean up character controller and the floor mesh

if (mChara) delete mChara;

MeshManager::getSingleton().remove("floor");

}

SinbadCharacterController* mChara;

};

时间: 2024-10-23 02:55:12

【转】将3DMAX中的动画通过OGREMAX导入OGRE中,并生成相应的骨骼动画的相关文章

将用myEclipse中做的web项目导入eclipse中

1.新建相同名称的web项目,2.修改目录结构3.同上4.复制src 和WebRoot目录粘贴到新创建的web工程中 原文地址:http://blog.51cto.com/13416247/2065563

3DSMAX 中的CS 骨骼动画插件初探

王玉培 郑利平1 合肥工业大学计算机与信息学院VCC 研究室, 合肥 230009 摘要:首先介绍了3DSMAX 中的CS 骨骼动画制作方法,通过Biped 骨架可以快速方便的制 作两足动物的动画.并介绍了基于3DSMAX SDK 的插件开发,SDK 中类库的组织方式和3DSMAX 的场景组织,最后介绍了和3D引擎密切相关的骨骼动画导出插件的开发过程. 关键词:骨骼动画 插件开发 Biped Preliminary Study on the CS Skeletal Animation Plug-

尝试优化骨骼动画计算的意外收获——使用内嵌式汇编对float转int进行优化

本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4984530.html 最近一直在尝试优化公司引擎的代码,因为公司之前的客户端最大只支持1440x900的分辨率,现在想要提高到1920x1080,但是怕性能方面有问题,所以让我试试看能不能提高客户端在几百人同屏时的帧数和稳定性. 因为公司引擎目前是使用CPU计算骨骼动画,虽然采用了D3DX提供的函数(D3DX的矩阵运算使用了SSE指令,即SIMD技术)进行计算,但在屏幕中存在大量角

[寒江孤叶丶的Cocos2d-x之旅_39]Cocos骨骼动画功能解密

原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net/qq446569365 原创文章,首发地址:http://www.cocos.com/cocos/dynamic/2015/0908/82.html 在游戏中,人物的各种动作是必不可少,一般实现人物动作的方式有两种,序列帧动画或骨骼动画.Cocos在更新到2.x版本之后,便没有了骨骼动画的功能,使得开发者非常困扰.终于在本次更新中,Cocos编辑器将骨骼动画添加

骨骼动画具体解释

转载:http://blog.csdn.net/ccx1234/article/details/6641944 近期,再次研究其骨骼动画,发现这篇文章讲的相当不错,通俗易懂,非常好的学习资源. 骨骼蒙皮动画(Skinned Mesh)的原理解析(一) 一)3D模型动画基本原理和分类 3D模型动画的基本原理是让模型中各顶点的位置随时间变化.主要种类有Morph动画,关节动画和骨骼蒙皮动画(Skinned Mesh).从动画数据的角度来说,三者一般都採用关键帧技术,即仅仅给出关键帧的数据,其它帧的数

cocos2dx 2.2.1 骨骼动画使用

使用骨骼动画: // 加载资源文件 png 图片,plist 文件和 ExportJson 动画文件,一般而言可以在场景运行之初加载此资源 CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("resTest/Hero/Hero.ExportJson"); CCArmature* _pArrmature = CCArmature::create("Hero"); _pA

cocosudio 骨骼动画制作

首先 基本步骤转官方文档 后续 学习实现 新建骨骼动画 首先点击屏幕右上角的 文件->新建文件(快捷键:Command+N),打开如下界面,选择骨骼动画,点创建: 主界面介绍 首先我们需要了解一下编辑器界面中各个部分的功能, 我们常用的空间的位置已经不需要使用了 1.资源列表,这里显示你项目中所有资源,如果想编辑骨骼,首先需要将骨骼动画的图片导入进来. 2.渲染区域,也就是我们的画布.这里是资源布局的编辑区域,在这个区域可以各个图片和骨骼进行移动,缩放,旋转的操作,所有的图片.骨骼.动画的绑定与

骨骼动画原理(转载)

视频教程请关注 http://edu.csdn.net/lecturer/lecturer_detail?lecturer_id=440 本例程展示如何建立骨骼动画,有些人叫蒙皮动画 定义如下: 当前有两种模型动画的方式:顶点动画和骨骼动画.顶点动画中,每帧动画其实 就是模型特定姿态的一个“快照”.通过在帧之间插值的方法,引擎可以得到平滑 的动画效果.在骨骼动画中,模型具有互相连接的“骨骼”组成的骨架结构,通过 改变骨骼的朝向和位置来为模型生成动画. 骨骼动画比顶点动画要求更高的处理器性能,但同

骨骼动画程序

最近有人问我怎样实现骨骼动画,于是我就想起了我以前写的这篇文章,贴上来给大家看看. 一.文章编写目的 写这篇文章,是给程序员看的.目的在于给程序员介绍骨骼动画的原理.数据结构和程序实现的粗略方法. 骨骼动画的应用面很多,主要用在3D角色动画,不过现在也很多人用于2D动画.下面的内容不会直接的把程序列出,只会阐述原理,关键的步骤是使用矩阵做坐标系变换.原理明白之后,不管2D或者3D应该都能自己编写. 二.什么是骨骼动画 传统的动画,一般是对一个物体对象进行位移.旋转.缩放.变形,然后把关键帧的信息