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

推荐订阅源

雷峰网
雷峰网
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
博客园_首页
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
美团技术团队
小众软件
小众软件
Jina AI
Jina AI
S
SegmentFault 最新的问题
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

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

贴几张我们用irrlicht做的游戏截图 jpg图片效果有点差,看起来是不是有点像劲舞团? 3dmax导出为my3d教程 从内存中加载图片资源 3dmax文件导出到ms3d文件. irrlicht1.3中文支持 Audiere PK OpenAL 【原创】IrrLicht中ms3D模型不支持多个贴图问题的解决 【引】[翻译]Irrlicht引擎里的冲突检测与响应 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模型骨骼动画支持bug的排除
安徽飞雪游戏工作室 · 2006-07-28 · via 博客园 - 安徽飞雪游戏工作室

试验过在IrrLicht中导入播放骨骼动画模型的朋友可能会发现,引擎存在下列问题:一, 当一次循环结束时会产生无效帧,在原模型不远的位置出现一片不规则的图片,严重影响显示效果。二,当模型包含旋转动作时发现模型在旋转过程中方向会突然反向,猜想也是计算错误。针对这两个问题,可以采用如下解决办法。
针对出现无效帧的问题,代码做如下修改:
在类SMS3DMeshBuffer的loadFile方法中(请对照原代码)
 // 获得旋转的关键帧
  //>>rxue add
  s32 j;
  SKeyframe k;
  MS3DKeyframe* eka = NULL; // this contains data of first keyframe
  f32 first = 0; // this is time of first keyframe
  //<<rxue add end

  for (j=0; j<pJoint->NumRotationKeyframes; ++j)
  {
   MS3DKeyframe* kf = (MS3DKeyframe*)pPtr;
   pPtr += sizeof(MS3DKeyframe);
   //>>rxue add
   if(j==0)
   {
    eka = kf;
    first = kf->Time;
   }
   k.timeindex = (kf->Time-first) * 1000.0f;
   //<<rxue add end
   k.data.X = kf->Parameter[0];
   k.data.Y = kf->Parameter[1];
   k.data.Z = kf->Parameter[2];
   jnt.RotationKeys.push_back(k);
  }
  //>>rxue add
  totalTime -= first;
  if(eka)
  {
   k.timeindex = totalTime;
   k.data.X = eka->Parameter[0];
   k.data.Y = eka->Parameter[1];
   k.data.Z = eka->Parameter[2];
   jnt.RotationKeys.push_back(k);
  }
  eka = NULL;
  //<<rxue add end

  // 获得变换的关键帧
  first = 0; //rxue add
  for (j=0; j<pJoint->NumTranslationKeyframes; ++j)
  {
   MS3DKeyframe* kf = (MS3DKeyframe*)pPtr;
   pPtr += sizeof(MS3DKeyframe);
   
   //>>rxue add
   if(j==0)
   {
    eka = kf;
    first = kf->Time;
   }
   
   k.timeindex = (kf->Time-first) * 1000.0f;
   //<<rxue add end   
   k.data.X = kf->Parameter[0];
   k.data.Y = kf->Parameter[1];
   k.data.Z = kf->Parameter[2];
   jnt.TranslationKeys.push_back(k);
  }
  //>> rxue add Let's add one keyframe to the end
  if(eka)
  {
   k.timeindex = totalTime;
   k.data.X = eka->Parameter[0];
   k.data.Y = eka->Parameter[1];
   k.data.Z = eka->Parameter[2];
   jnt.TranslationKeys.push_back(k);
  }
  //<<rxue add end
旋转反向的问题:
修改SMS3DMeshBuffer类的getKeyframeData方法如下:(注意:s32type为增加的参数,所以函数声明也要做相应修改
void CAnimatedMeshMS3D::getKeyframeData(core::array<SKeyframe>& keys, f32 time, core::vector3df& outdata,s32 type)
{
 if(type == 0)
 {
  for (s32 i=0; i<(s32)keys.size()-1; ++i)
  {
   if (keys[i].timeindex <= time && keys[i+1].timeindex >= time)
   {    
    f32 interpolate = (time - keys[i].timeindex)/(keys[i+1].timeindex - keys[i].timeindex);    
    outdata = keys[i].data + ((keys[i+1].data - keys[i].data) * interpolate);   
    return;
   }
  }
 }
 else
 {
  for (s32 i=0; i<(s32)keys.size()-1; ++i)
  {
   if (keys[i].timeindex <= time && keys[i+1].timeindex >= time)
   {
    irr::core::quaternion q1(keys[i].data.X,keys[i].data.Y,keys[i].data.Z);
    irr::core::quaternion q2(keys[i+1].data.X,keys[i+1].data.Y,keys[i+1].data.Z);     
    f32 interpolate = (time - keys[i].timeindex)/(keys[i+1].timeindex - keys[i].timeindex);
    q2 = q1.slerp(q1,q2,interpolate);
    q2.toEuler(outdata);
    return;
   }
  }
 }
}

SMS3DMeshBuffer类animate方法修改如下:
//find keyframe translation and roation
//getKeyframeData(Joints[i].TranslationKeys, time, translation);
//getKeyframeData(Joints[i].RotationKeys, time, rotation);
  
  getKeyframeData(Joints[i].TranslationKeys, time, translation,0);//rxue
  getKeyframeData(Joints[i].RotationKeys, time, rotation,1);//rxue 重新计算
至此,解决了模型动画的播放问题。在我们这里测试正常,有问题的朋友可以留言讨论。