多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Cocos2d-x 3.x 圖形學渲染系列十一

Cocos2d-x 3.x 圖形學渲染系列十一

來源:程序員人生   發布時間:2017-02-20 10:39:32 閱讀次數:3521次

筆者介紹:姜雪偉IT公司技術合伙人,IT高級講師,CSDN社區專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D游戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。

Avatar換裝系統又稱為紙娃娃系統,在游戲開發中是使用非常廣泛的技術,特別是在MMOARPG或是MMORPG等網絡游戲中,玩家創建的3D角色都具有Avatar換裝功能,在游戲開發中常常需要對角色更換設備,比如角色在戰役進程中獲得到新的盔甲要穿著在身上或新的武器要更換等等。要實現該技術所使用的引擎都必須具有支持Avatar換裝系統的骨骼掛節點,比如市面上的Unity引擎,UE4引擎等都提供了這類掛接骨骼方法,獲得到骨骼掛節點后,可以直接將武器掛接到需要綁定的骨骼上。實現的效果以下圖:



場景中的3個角色彩用了Avatar換裝技術,它們采取的是同1套骨架,將需要更換的各個Mesh模型都掛接到對應的骨架上,從而構成了Avatar換裝系統。而本書介紹的Cocos2d-x引擎也不例外,該引擎也提供了支持Avatar技術的功能,實現該功能的類是AttachNode。下面介紹實現掛接結點的步驟,不論是掛接Mesh還是在角色身上掛接武器都需要根據骨骼掛接,這就要用到AttachNode類實現的功能,實現的函數以下所示:

AttachNode* AttachNode::create(Bone3D* attachBone)
{
    auto attachnode = new (std::nothrow) AttachNode();
    attachnode->_attachBone = attachBone;
    attachnode->autorelease(); 
    return attachnode;
}

首先是創建需要掛接的骨骼,骨骼動畫是需要矩陣支持的,骨骼動畫它在世界坐標系中的變換都需要轉換到世界變換矩陣,這些實現進程也需要引擎提供,下面把接口的函數給讀者展現以下:

Mat4 AttachNode::getWorldToNodeTransform() const
{
    static Mat4 mat;
    mat.setIdentity();
    auto parent = getParent();
    if (parent)
    {
        mat=parent->getWorldToNodeTransform() * _attachBone->getWorldMat() * Node::getNodeToParentTransform();
    }
    else
    {
        mat=_attachBone->getWorldMat() * 										Node::getNodeToParentTransform();
    }
    return mat;
}

getWorldToNodeTransform函數的實現原理是把模型掛接到骨骼上,該骨骼是需要掛接模型的父結點,父結點運動會帶動所綁的模型運動,從而保證掛接到骨骼結點的武器能夠與骨骼動畫1致。這個實現進程是與矩陣相干的,通過案例把實現的代碼片斷給讀者展現以下:

//Girl.c3b里保存了女角色所履行動畫的所有零件(姑且這么叫吧)包括衣服,鞋子等等
std::string fileName = "Sprite3DTest/Girl.c3b";  
		auto sprite = Sprite3D::create(fileName);  
		sprite->setScale(4);  
		sprite->setRotation3D(Vec3(0,0,0));  
		addChild(sprite);  
		sprite->setPosition( Vec2( p.x, p.y⑹0) );  
		auto animation = Animation3D::create(fileName);  
		 if (animation)  
		 {  
			auto animate = Animate3D::create(animation);  		
			 sprite->runAction(RepeatForever::create(animate));  
		}  
	    _sprite = sprite;  
	
	    _curSkin[SkinType::UPPER_BODY] = "Girl_UpperBody01";  
	    _curSkin[SkinType::PANTS] = "Girl_LowerBody01";  
	    _curSkin[SkinType::SHOES] = "Girl_Shoes01";  
	    _curSkin[SkinType::HAIR] = "Girl_Hair01";  
	    _curSkin[SkinType::FACE] = "Girl_Face01";  
	    _curSkin[SkinType::HAND] = "Girl_Hand01";  
	    _curSkin[SkinType::GLASSES] = "";  

上面的代碼片斷是針對1個模型進行換裝操作,首先實現的是對換裝的部位進行初始化操作。下面開始遍歷獲得到骨骼動畫掛接的數量,對掛接的模型,如果是多個通過顯示和隱藏將其顯示出來。下面的代碼片斷函數是ApplySkin,函數內容片斷以下所示:

//函數getMeshCount獲得動畫所有零件數目  
    for (ssize_t i = 0; i < _sprite->getMeshCount(); i++) {  
        auto mesh = _sprite->getMeshByIndex(static_cast<int>(i));  
        bool isVisible = false;  
        for (auto& it : _curSkin) {  
            if (mesh->getName() == it.second)  
            {  
                isVisible = true;  
                break;  
            }  
        }  
        //通過索引來獲得零件并設置可見性  
        _sprite->getMeshByIndex(static_cast<int>(i))->setVisible(isVisible);  
    }  

下面給大家展現利用案例代碼以下所示:

std::string str = _curSkin[SkinType::HAIR];  
    if (str == "Girl_Hair01")  
        _curSkin[SkinType::HAIR] = "Girl_Hair02";  
    else  
        _curSkin[SkinType::HAIR] = "Girl_Hair01"; 

同時要調用ApplySkin函數就能夠完成換裝的要求,實現效果以下圖:




場景中的角色褲子、頭發、鞋子都產生了改變,完成換裝。關于換裝,筆者在CSDN學院出版1個免費的視頻講座《游戲Avatar換裝系統》,供開發者參考。


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产日产高清欧美一区二区三区 | 国产dvd毛片在线视频 | 在线国产小视频 | 最近2019中文字幕最新 | 欧美小说图片视频 | 欧美午夜理伦三级在线观看 | 曰本一区二区三区 | 欧美军人男同69gay | 国产成人不卡亚洲精品91 | 国产精品嫩草影院在线 | 视频一区二区国产无限在线观看 | 中文字幕亚洲精品日韩精品 | 一区二区视频在线观看高清视频在线 | 久久99一区 | 亚洲综合视频网 | 日韩精品免费 | 在线观看日本永久免费视频 | 欧美日韩国产另类一区二区三区 | 国产亚洲综合一区二区在线 | 亚洲图片欧美视频 | 亚洲色图色 | 九九爱精品视频 | 羞羞视频免费观看网站 | 春色吧 | 国产成人综合一区人人 | h视频网站在线 | 国产九九视频在线观看 | 成人啪精品视频免费网站 | 国产精品毛片在线更新 | 秋霞理论福利院 | 18男女很黄的视频 | 永久手机看片福利盒子 | 久久伊人亚洲 | 欧美亚洲桃花综合 | 亚洲国产一区二区三区精品 | 日本护士一级毛片 | 一级网| 日本黄a| 国内性经典xxxxx | 精品伊人久久大香线蕉网站 | 欧美一区二区精品系列在线观看 |