现在的位置: 首页 > 综合 > 正文

用OGRE装载和渲染WOW模型

2018年01月16日 ⁄ 综合 ⁄ 共 2210字 ⁄ 字号 评论关闭

目前只支持一个Mesh,(WOW的 model 里有多个 ModelRenderPass每个 pass代表一个子物体,整个模型只有一套顶点数据,但每个子物体有自己的贴图信息和顶点索引)

 

还没添加动画,粒子的支持….

 

一创建支持MPQ的FileSystem

class MPQArchive : public Ogre::Archive

一个MPQArchive代表一个 .mpq文件

 

class _OgrePrivate MPQArchiveFactory : public Ogre::ArchiveFactory

工厂,用来创建 MPQArchive

 

class _OgrePrivate MPQFile : public DataStream

MPQ文件,保存WOW各种文件的数据

 

而mpq文件的装载使用的是 wowmodelview的mpq库

 

二 在OGRE里 添加 MPQfilesystem

mRoot = new Root(pluginsPath,

mResourcePath + "ogre.cfg", mResourcePath + "Ogre.log");

 

创建root 和 设置resource 之间增加MPQ 文件工厂

ArchiveManager::getSingleton().addArchiveFactory( new MPQArchiveFactory() );

 

setupResources();

 

三装载一个MPQ文件

tempname 为WOW的文件名 ,blp mdx等等

String temps = tempname;

DataStreamPtr steam = ResourceGroupManager::getSingleton().openResource(temps);

 

MPQFile *f = (MPQFile*)(steam.get());

 

四包装WOW的模型

结构使用 modelview 的 Model类 让他继承 SimpleRenderable 以便可以放入到

SceneManager中,已经拥有自己的renderop

class Model : public  Ogre::SimpleRenderable

protected 参数

Ogre::VertexData* mVertexData;

用来保存顶点数据

 

decl->addElement(0, offset, VET_FLOAT3, VES_POSITION);

offset += VertexElement::getTypeSize(VET_FLOAT3);

decl->addElement(0, offset, VET_FLOAT3, VES_NORMAL);

offset += VertexElement::getTypeSize(VET_FLOAT3);

decl->addElement(0, offset, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0);

offset += VertexElement::getTypeSize(VET_FLOAT2);

 

 创建顶点缓冲元素定义,包括顶点,法线和纹理

从indexLookup中读取 顶点索引

 

五模型的Materail

1 装载blp文件

首先获取texture 的 ModelTextureDef,如果 type == 0 ,为标准纹理

 如果不等于0,为特殊纹理(一个模型有很多风格的纹理那种,WOW里那种样子一样

 颜色不一样的怪….)利用CreatureModelDB和CreatureSkinDB来获得实际的纹理

 

 装载这个BLP文件(方法和wowmodel一样),将图象元素装载到内存 buf里

创建 Ogre的 Image img, 根据格式DXT1 ,DXT3 ,DXT5 的不同

从buf 装载图象, 建立一个名字为 WOWTexture 的纹理

img.loadDynamicImage( buf, w, h, PF_DXT1 );

TextureManager::getSingleton().loadImage( "WOWTexture",

ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, img, TEX_TYPE_2D, 0, 1.0f,true );

 

2 创建Materail

用OGRE创建一个材质

shadMat = MaterialManager::getSingleton().create("WOWMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

获得pass,并给这个pass创建一个TexUnit

Pass *shadPass = shadMat->getTechnique(0)->getPass(0);

TextureUnitState* tex = 0;

tex = shadPass->createTextureUnitState("WOWTexture");

 

将这个材质设置给模型

setMaterial("WOWMaterial");

 

六在OGRE场景中添加一个WOW模型

 

Model *m = new Model("Creature\\Bear\\polarbearcub.mdx");

SceneNode *myNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();

myNode->attachObject(m);

 

使用special texture的波利

标准纹理的

抱歉!评论已关闭.