游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3387|回复: 9

请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

[复制链接]

8

主题

70

帖子

79

积分

注册会员

Rank: 2

积分
79
发表于 2008-4-11 21:53:00 | 显示全部楼层 |阅读模式
看了你的类,大致和我设想的差不多,到目前为止,感觉已经看到了"黎明前的曙光"~~
我已经读出了所有骨骼的name,例如手掌的骨骼叫做bip01_R_Hand
那么如何把装备的mesh"挂"上去咧?就是如何知道装备mesh相对于手掌骨骼的位置是怎么知道的啊?
初始的时候任何mesh都是画到世界坐标系原点的,怎么知道那个装备该"移动"到哪个合适的位置上去呢?

另外,非常感谢你上一次的回复,给我带来了莫大的帮助!谢谢了!~

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-4-11 23:29:00 | 显示全部楼层

Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

装备相对于骨骼的位置,一般有个偏移量offsetMatrix,你只要能求出这个骨骼位置的matrix就什么都好说了
再给你一点思路
以下是我的代码片段:
boneMat:是当前骨骼相对于根骨骼的变换
mat:是角色在场景中的世界变换矩阵
而model->GetOriginSenceWorldMatrix() 则是一个offsetMatrix,可以假想那块骨头在圆点,你的武器相对于圆点的变换矩阵,以下就是正确的计算方法。

                const D3DMATRIX *boneMat = ((XSkinnedMesh *)mpRole)->GetFrameFinalMatrix(bone_name);
                D3DMATRIX mat = mpRole->GetSenceWorldMatrix();
                D3DXMATRIX wMat =  model->GetOriginSenceWorldMatrix() * (*boneMat) * mat;

16

主题

191

帖子

191

积分

注册会员

Rank: 2

积分
191
发表于 2008-4-12 08:42:00 | 显示全部楼层

Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

这个问题使用irr引擎一行代码就解决了:NPC0snJointNode->addChild(GW0sn)

NPC0snJointNode就是你的bip01_R_Hand节点
GW0sn是装备模型的节点
addChild()调用一下,武器模型就随着手的动作移动了

8

主题

70

帖子

79

积分

注册会员

Rank: 2

积分
79
 楼主| 发表于 2008-4-12 12:43:00 | 显示全部楼层

Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

tonykee,你前面说的boneMat\mat我都已经找到,这个做人物的骨骼动画时就可以读出来啊,
就是就是你说的那个offsetMatrix我不明白从哪里找到....是让美术给我吗?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2008-4-12 13:41:00 | 显示全部楼层

Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

offsetMatrix我是手工调节到合适的位置,这个是个固定数值,每个武器针对的人物模型都不一样。
我还没有找到很好的方法自动调节。
比如刀把很长,你是拿"上"一点,还是拿"下"一点好看呢?
我是手工调节的。

8

主题

70

帖子

79

积分

注册会员

Rank: 2

积分
79
 楼主| 发表于 2008-4-12 17:05:00 | 显示全部楼层

Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

哦....明白了,手工调节.....看来咋做程序的也还是有体力活
非常感谢你哈,tonykee!

1

主题

19

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2008-6-24 00:32:00 | 显示全部楼层

Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

////找到手的关键帧,然后插上到,渲染,一把倒就在手上了
//D3DXMATRIX mat;
//m_pPlayer->GetSkinMesh()->GetFrameMatrix(NULL,"Bip01_R_Hand",&mat);
//m_pSword->SetTransForm(&mat);
//骨骼帧的位置要相应的传递
//m_pSword->SetPosition(mat._41,mat._42,mat._43);//m_pSword是武器的模型对象
//m_pSword->m_mTransform._41=mat._41;
//m_pSword->m_mTransform._42=mat._42;
//m_pSword->m_mTransform._43=mat._43;
//m_pSword->Render();

//找到节点的矩阵
        LRESULT GetFrameMatrix(LPD3DXFRAME pFrameBase, char *strFrameName,D3DMATRIX *pMat)
        {
                D3DXFRAME *pFrame ;

                if(pFrameBase!=NULL)
                        pFrame = pFrameBase;
                else
                        pFrame = m_pFrameRoot;
          
                if(pFrame->Name!=NULL && 0==strcmp(pFrame->Name,strFrameName))
                {
                        *pMat=((D3DXFRAME_DERIVED*)pFrame)->CombinedTransformationMatrix;
                        return S_OK;
                }
                if (pFrame->pFrameSibling != NULL)
                {
                        if(S_OK==        GetFrameMatrix(pFrame->pFrameSibling,strFrameName,pMat))
                                return S_OK;
                }
                if (pFrame->pFrameFirstChild != NULL)
                {
                        if(S_OK==        GetFrameMatrix(pFrame->pFrameFirstChild,strFrameName,pMat))
                                return S_OK;
                }
                return E_FAIL;
        }

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-6-24 22:39:00 | 显示全部楼层

Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

为模型加一个 tag,附着在一个骨骼上,就是一个透明的三角形。

如果是 morphing 动画,则需要保存许多frame的tag.

武器是单独的 model,也有一个tag,
运行的时候,根据 武器 和 角色 的 tag,把他们连接起来(可以计算出matrix)

综上所述,根本不需要“手工”调节
(tag是美工画的)

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-6-24 22:49:00 | 显示全部楼层

Re: Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

九万里: Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

这个问题使用irr引擎一行代码就解决了:NPC0snJointNode->addChild(GW0sn)

NPC0snJointNode就是你的b...


看起来少,实际上内部有其他处理。
因为,除了把模型加在 Tree 的 Node 上面,还要正确设置武器的 本地matrix

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-6-25 11:03:00 | 显示全部楼层

Re:请教tonykee,麻烦再指教一下,仍然是换装相关的问题~~

各个矩阵的相乘顺序要注意:

武器顶点 * 武器挂接变换 * 孩子骨骼变换 * 父母骨骼变换 * 模型世界变换

其中,武器挂接变换,就是,从武器空间,变换到人物手部的变换。
这个“武器挂接变换”矩阵,一般只需要计算做 一 次。

注意,上式假定,武器附着到手上以后,相对于手,是不运动的。
如果,今后,武器要不停地运动,那么:

武器顶点 * 武器自身变换 * 武器挂接变换 * 孩子骨骼变换 * 父母骨骼变换 * 模型世界变换

其中 武器自身变换,表示,武器的旋转阿,之类的,简单地说,是个“微调”。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 04:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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