惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
B
Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Jina AI
Jina AI
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
L
LangChain Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
F
Fortinet All Blogs
H
Help Net Security
B
Blog RSS Feed
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题

博客园 - 安徽飞雪游戏工作室

贴几张我们用irrlicht做的游戏截图 jpg图片效果有点差,看起来是不是有点像劲舞团? 3dmax导出为my3d教程 从内存中加载图片资源 3dmax文件导出到ms3d文件. irrlicht1.3中文支持 Audiere PK OpenAL 【引】[翻译]Irrlicht引擎里的冲突检测与响应 [原创]IrrLicht中MS3D模型骨骼动画支持bug的排除 MS3D model 的 Frame count - 安徽飞雪游戏工作室 材质动画 Irrlicht 论坛好贴 精选(不断补充中...) [转]Scrolling Credits Code [转](C++) How to animate and move an entity [原创]为Irrlicht中的人物添加武器 [原创]Irrlicht中的Texture透明色(colorkey) [原创]IrrLicht的GUI使用 [原创]IrrLicht-1.0中文支持 [原创]一个在Irrlicht中会常用的字符串转换函数 [转]宽字符标量L"xx"在VC6.0/7.0和GNU g++中的不同实现。
【原创】IrrLicht中ms3D模型不支持多个贴图问题的解决
安徽飞雪游戏工作室 · 2006-07-28 · via 博客园 - 安徽飞雪游戏工作室

测试过irrlicht中ms3d模型的朋友可能发现了这样的现象,如果ms3d模型只有一个贴图,则无论贴图文件放到和demo可执行程序同一目录下或者调用setMaterialTexture()函数都可以让模型正常被正常渲染,而当模型拥有两个或以上贴图时,则只有贴图和可执行程序在同一目录被自动加载时才能正确渲染,而用setMaterialTexture(0,。。。),setMaterialTexture(1,。。。)时似乎只有第一个贴图起作用。仔细查看引擎的代码发现,这不是偶然的现象,也可以算是引擎对ms3d模型支持的一个bug吧。在说到具体的解决方案之前,我们先来说一下ms3d模型中组的概念。“组”顾名思义应该是拥有一些共同属性的事物集合了。在ms3d中,一个组内的三角形就拥有同一个贴图文件。在引擎装载ms3d模型数据时,已经记下了组对应的贴图文件名,因此自动贴图不会出错。而在用setMaterialTexture函数指定时却并没有指定是哪个组的贴图,因此就会出现只有一个贴图起效果的现像,其实从代码中可以看出,它是遍历了所有组,但都用了setMaterialTexture(0,...)指定的这一个贴图。
好了,知道原因后,我们大概就可以想到解决办法了。就是在setMaterialTexture时也指定是哪个组。对就是这样。我们提供了另外两个针对MS3D的setMaterialTexture函数,分别是:
void  CAnimatedMeshSceneNode::setMS3DMaterialTexture(const c8 * groupName,s32 textureLayer, video::ITexture* texture)
{
  if (textureLayer<0 || textureLayer>= video::MATERIAL_MAX_TEXTURES)
    return;

  // 根据组名得到MeshBuffer
  IMesh * pMesh = Mesh->getMesh(0,0);
  
  for(s32 i = 0; i<pMesh->getMeshBufferCount();i++)
  {
   IMeshBuffer* pMeshBuf = pMesh->getMeshBuffer(i);
   if(strcmp(pMeshBuf->getGroupName(),groupName) == 0){
    irr::video::SMaterial & mat = pMeshBuf->getMaterial();
    mat.Textures[textureLayer] = texture;
    Materials[i].Texture1 = texture;
    break;
   }
  }

}
void  CAnimatedMeshSceneNode::setMS3DMaterialTexture(s32 groupIndex,s32 textureLayer, video::ITexture* texture)
{
  if (textureLayer<0 || textureLayer>= video::MATERIAL_MAX_TEXTURES)
    return;
  
 
  // 根据组名得到MeshBuffer
  IMesh * pMesh = Mesh->getMesh(0,0);
  
  if(groupIndex < 0 || groupIndex > pMesh->getMeshBufferCount())
   return;

  
  IMeshBuffer* pMeshBuf = pMesh->getMeshBuffer(groupIndex);
  // yfxu
  irr::video::SMaterial & mat = pMeshBuf->getMaterial();
  mat.Textures[textureLayer] = texture;
  if(textureLayer == 0) mat.Texture1 = texture; 
  Materials[groupIndex].Texture1 = texture;

}
一个是根据组名设贴图,一个是根据组索引设贴图。
值得一起的是 引擎在载如ms3d模型数据在取组名时也有一点问题,原来的代码如下:
for (i=0; i<numGroups; ++i)
 {
  Groups.push_back(SGroup());
  SGroup& grp = Groups.getLast();
  // 组名称
  grp.Name = (const c8*)pPt;
。。。

参考ms3d的文件格式可知改为:
 grp.Name = (const c8*)(pPt+1);
才能正确取到组名。
到此为止,加上动画模型旋转bug,和无效帧问题的解决。irrlicht对ms3d模型的支持基本就完美了。

下图中的美女,身体和头发是分开的贴图: