游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5355|回复: 11

MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(即An

[复制链接]

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
发表于 2009-6-1 19:30:00 | 显示全部楼层 |阅读模式
MAX静态模型的导出插件已经解决了,但动画信息还没完成,想知道MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(即Animation),还有Control的Linear还是其他的是什么意思,要导出哪种?

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2009-6-3 21:50:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

自己顶一下。

2

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2009-6-3 22:10:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

max里不知道,需要美工手工敲入。也可以像quake那样为每个动画模型用一个文本配置文件提供动画的帧数范围信息。

linear什么的指插值模式

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2009-6-4 00:08:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

我觉得既然美工敲入了第几帧到第几帧是属于哪个动作,那肯定是要存在什么位置,所以MAX中肯定是有数据存储这些数据,但到目前我还不晓得要怎么导出,查了很多资料也不得行。像quake那样为每个动画模型用一个文本配置文件提供动画的帧数范围信息,是可以,但是你还要获取动作的时间点,你不能只晓得帧数范围啥。

14

主题

156

帖子

158

积分

注册会员

Rank: 2

积分
158
QQ
发表于 2009-6-4 10:22:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

这个问题确实是第一次做MAX插件会遇到的,呵呵

在 google 上搜
GetKeyControlInterface
HYBRIDINTERP_FLOAT_CLASS_ID
GetInTanType
LININTERP_FLOAT_CLASS_ID
等,可以找到一些开源项目的代码,进去看看就OK了,不是很复杂~

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2009-6-6 20:44:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

1。IGameKeyTab的Count()是不是等于KeyFrame的帧数?
2。IGameOBject中的IGAME_BONE、IGAME_MESH与IGameMesh中的IGAME_BONE、IGAME_Mesh是不是一样的?不然的话选择的时候选哪个?
3。动画插值有三种:Linear、Brizer、TCB,在实际建动画模型的时候应用中哪种用的最多,周围没有学3DMAX的。
4。是不是要从GetTopLevelNode()获得的所有的以及他们的ChildNode,导出它们所有的信息。
5。看到动画模型一般都把纹理集中到一张图片上,在建模的时候怎么指定对应的纹理。

14

主题

156

帖子

158

积分

注册会员

Rank: 2

积分
158
QQ
发表于 2009-6-9 17:17:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

只知道第3,5点
3:我见过与问过的美术都是Beizier的Linear模式
5:直接在MAX的材质管理器里配置好材质,然后应用到模型上

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2009-6-9 18:11:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

LS,
3。Beizier与Linear应该是不同的模式吧,什么是“Beizier的Linear模式”
5。我没说清楚,是纹理坐标等怎么对应。

14

主题

156

帖子

158

积分

注册会员

Rank: 2

积分
158
QQ
发表于 2009-6-11 13:11:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

5我没大明白,呵呵~

3的意思是这样的:
动画插值用的都是Bezier Key Control,但其插值方式比较灵活,有以下几种:
// Bezier tangent types
#define BEZKEY_SMOOTH                0
#define BEZKEY_LINEAR                1
#define BEZKEY_STEP                2
#define BEZKEY_FAST                3
#define BEZKEY_SLOW                4
#define BEZKEY_USER                5
#define BEZKEY_FLAT                6

线性插值就是 BEZKEY_LINEAR,具体如下:
你打开MAX,随便拖一个物体,然后给它打上一个位置的关键帧
接着在关键帧上点鼠标右键,鼠标左键点选弹出菜单上任一个条目,弹出关键帧属性面板
在面板下部分别有 in 和 out 的插值类型图标
鼠标按住其中任一个图标,淡出插值类型列表(共7个),其中的第2个即为线性插值

举个例子,比如你要创建一个Bezier BEZKEY_STEP插值的Key Control,并添加一个关键帧,大致代码如下:
Control* ctrl = (Control*)CreateInstance( CTRL_FLOAT_CLASS_ID, Class_ID( HYBRIDINTERP_FLOAT_CLASS_ID , 0 ) );

IKeyControl *ikeys = GetKeyControlInterface( ctrl );
ikeys->SetNumKeys( 1);

IBezFloatKey key;
key.time = 10;
key.val = 7.0f;
SetInTanType( key.flags, BEZKEY_STEP );
SetOutTanType( key.flags, BEZKEY_STEP );
ikeys->SetKey( 0, &key );

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2009-6-11 20:49:00 | 显示全部楼层

Re:MAX插件中要怎样知道从第几帧到第几帧属于哪个动作(

谢谢liuzewei大哥的细心讲解,我明白了。但是在导出的时候不会用到BEZKEY_LINEAR等定义.

IGameControl *control=node->GetIGameControl();
IGameKeyTab keysRotation;
IGameKeyTab keysPosition;
control->GetBezierKeys(keysRotation,IGAME_ROT);
control->GetBezierKeys(keysPosition,IGAME_POS);
m_joints[m_header.nNumJoints].nNumKeyFrameRotation=keysRotation.Count();
m_joints[m_header.nNumJoints].nNumKeyFramePosition=keysPosition.Count();
m_joints[m_header.nNumJoints].pKeyFramePosition=new ModelKeyFramePosition[keysPosition.Count()];
m_joints[m_header.nNumJoints].pKeyFrameRotation=new ModelKeyFrameRotation[keysRotation.Count()];
for (int nRots=0;nRots<keysRotation.Count();nRots++)
{
IGameKey *keyRotation=&keysRotation[nRots];
m_joints[m_header.nNumJoints].pKeyFrameRotation[nRots].fTime=keyRotation->t;
m_joints[m_header.nNumJoints].pKeyFrameRotation[nRots].vRotation.x=keyRotation->bezierKey.qval.x;
m_joints[m_header.nNumJoints].pKeyFrameRotation[nRots].vRotation.y=keyRotation->bezierKey.qval.y;
m_joints[m_header.nNumJoints].pKeyFrameRotation[nRots].vRotation.z=keyRotation->bezierKey.qval.z;
m_joints[m_header.nNumJoints].pKeyFrameRotation[nRots].vRotation.w=keyRotation->bezierKey.qval.w;
}
这是我写的,应该没错吧。

但我还是不知道怎么导出动画信息,就是怎样才能知道从第几帧到第几帧属于哪个动作?我照你的建议去搜了些源码,发现大多都是直接从第一帧到最后一帧直接导出,没怎么细分动作。
而且基本都是用基本API写的,我比较想知道用IGame接口是个什么思路。
再次感谢liuzewei大哥。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-19 23:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表