看了看時(shí)間,已經(jīng)3點(diǎn)過(guò)了,突然想寫(xiě)點(diǎn)什么,卻又不知從何說(shuō)起。
那就從今天這個(gè)用irrlicht做天龍八部的模型換裝說(shuō)起吧。
也不知道是為什么,最近又搗鼓起了OGRE和irrlicht. 并且,總想用irrlicht實(shí)現(xiàn)一些OGRE中的東西。
當(dāng)然,這不是商業(yè)項(xiàng)目,也沒(méi)有商業(yè)目的,純屬蛋疼而已。
一切行動(dòng)的由來(lái),都來(lái)自于vczh那天晚上的舉動(dòng)。
記得有一天晚上在群里聊天,大伙就稱(chēng)贊各位菊苣是多么的厲害。
最后vc發(fā)了一個(gè)自己的桌面截圖說(shuō):讓你們看看菊苣是如何練成的(這不是原話(huà),和話(huà)的字眼有出入,在此不想負(fù)任何責(zé)任,如果真有想看的,去翻群的聊天記錄)
那天晚上,我想了很久。想想自己自從轉(zhuǎn)做頁(yè)游以后,是如何虛渡光陰的。
終于忍不住了,翻開(kāi)了自己的移動(dòng)硬盤(pán),看看自己曾經(jīng)做過(guò)的小東西。90%是建好工程就沒(méi)理了。
這才明白,我花在思考上的時(shí)間遠(yuǎn)遠(yuǎn)大于了行動(dòng)。 于是,我決定改變自己,找回那個(gè)真的我。
3D游戲是我的真愛(ài), 真愛(ài)到就算畫(huà)面差一點(diǎn),只要是3D,我也會(huì)很喜歡。
于是,我覺(jué)得自己還是應(yīng)該接著先前的路走下去。 什么服務(wù)器,什么 AS3. 都是浮云, 不喜歡就是不喜歡。
私下又開(kāi)始研究irrlicht了。
猛地一發(fā)現(xiàn),自己是多么的搞笑, 從09年到11年,一直在做引擎開(kāi)發(fā), 也翻過(guò)irrlicht和ogre無(wú)數(shù)遍。 卻從來(lái)就沒(méi)有寫(xiě)完過(guò)一個(gè)完整的DEMO。
連功能測(cè)試用例都沒(méi)有寫(xiě)過(guò)。突然覺(jué)得之前的一些設(shè)計(jì)似乎有些脫離了實(shí)際。沒(méi)有真正使用過(guò),又怎知如何是好,如何是壞呢?
這一次是真的玩irrlicht了, 中間也糾結(jié)過(guò)是不是OGRE更適合。 但在目前這個(gè)時(shí)間有限的空間下,我更愿意玩irrlicht.小巧,輕便。 當(dāng)然,意味著更多東西要自己實(shí)現(xiàn)。 不過(guò)對(duì)于一個(gè)代碼控來(lái)說(shuō),也反而更自得其樂(lè)。 正好可以在短路的時(shí)候,去參考一下其它引擎,用來(lái)擴(kuò)充irrlicht.
我要做的不是把irrlicht整得牛B,而是想自己弄弄,加上移動(dòng)平臺(tái)的崛起,我覺(jué)得irrlicht更加適合吧。 據(jù)說(shuō)gameloft也有使用(僅是據(jù)說(shuō))。
可能很多兄弟會(huì)說(shuō)我這講的東西,其實(shí)就是一坨屎了。 不過(guò),我覺(jué)得再壞的評(píng)論,也表示一種關(guān)注。 批評(píng)好過(guò)于無(wú)視啊~~~~
----------------------------------------------------------下面說(shuō)說(shuō)我遇上的糾結(jié)------------------------------------------------
糾結(jié)1:換裝需要場(chǎng)景節(jié)點(diǎn)配合
在irrlicht中,并沒(méi)有提供普通引擎中的submesh或者bodypart這種東西,用于直接支持換裝。 在irrlicht中,如果想要換裝,最直接的方法就是依賴(lài)于場(chǎng)景結(jié)點(diǎn)
比如,在我的示例中,可以更換頭發(fā),帽子,衣服,護(hù)腕,靴子,面容。 那就需要7個(gè)場(chǎng)景節(jié)點(diǎn),1個(gè)作為根節(jié)點(diǎn),用于控制整個(gè)角色的世界坐標(biāo),平移,縮放,旋轉(zhuǎn)等屬性。另外6個(gè)場(chǎng)景節(jié)點(diǎn)則分別綁有各個(gè)部件的模型
貼一下我的角色類(lèi)的代碼,行數(shù)不多
class CCharactor
{
IrrlichtDevice* m_pDevice;
IAnimatedMeshSceneNode* m_pBodyParts[eCBPT_Num];
ISceneNode* m_pRoot;
public:
CCharactor(IrrlichtDevice* pDevice)
:m_pDevice(pDevice)
{
memset(m_pBodyParts,0,sizeof(m_pBodyParts));
m_pRoot = pDevice->getSceneManager()->addEmptySceneNode(NULL,12345);
}
void changeBodyPart(ECharactorBodyPartType ePartType,stringw& meshPath,stringw& metrialPath)
{
ISceneManager* smgr = m_pDevice->getSceneManager();
IAnimatedMeshSceneNode* pBpNode = m_pBodyParts[ePartType];
IAnimatedMesh* pMesh = smgr->getMesh(meshPath.c_str());
if(pMesh==NULL)
return;
if(pBpNode==NULL)
{
pBpNode = smgr->addAnimatedMeshSceneNode(pMesh,m_pRoot);
m_pBodyParts[ePartType] = pBpNode;
}
else
{
pBpNode->setMesh(pMesh);
}
ITexture* pTexture = m_pDevice->getVideoDriver()->getTexture(metrialPath.c_str());
if(pTexture)
pBpNode->setMaterialTexture(0,pTexture);
}
};
//然后,我用了一個(gè)結(jié)構(gòu)體來(lái)構(gòu)建部件信息
struct SBodyPartInfo
{
stringw Desc;
ECharactorBodyPartType Type;
stringw MeshPath;
stringw MeterialPath;
};
糾結(jié)2:共享骨骼
首先,irrlicht 1.8中對(duì)OGRE模型的格式支持在代碼中,最高只看到了1.40版本的解析,更高的就會(huì)被無(wú)視。 天龍八部的模型有幾個(gè)是1.30的,而用于換裝和主角的,都是1.40的。 可能是解析不全的原因,導(dǎo)致1.40的骨骼動(dòng)畫(huà)無(wú)法正常播放。 這個(gè)問(wèn)題整了幾個(gè)小時(shí),沒(méi)有解決,明天繼續(xù)
其次,多個(gè)模型共享骨骼只能通過(guò)場(chǎng)景節(jié)點(diǎn)的useAnimationFrom來(lái)完成,并且傳入的是一個(gè)Mesh參數(shù)。這點(diǎn)讓人蛋疼, 天龍八部的角色動(dòng)作是分開(kāi)了的,不同的攻擊動(dòng)作是一個(gè)skeleton文件。 想要實(shí)現(xiàn)共享,有點(diǎn)麻煩。
糾結(jié)3:模型文件格式
irrlicht不像OGRE那樣有一個(gè)強(qiáng)大且成熟的模型文件格式,雖然提供了.irr格式,但僅是用于irrEdit的場(chǎng)景信息輸出。先看一張圖
這張圖是irrlicht samples中的MeshViewer的提示框內(nèi)容。 上面列出了可以支持的模型文件類(lèi)型。 大家可以看看,又有多少模型格式是可以直接拿來(lái)放到項(xiàng)目上用的呢? mdl和ms3d可以考慮,dae的話(huà),我在開(kāi)源游戲0 A.D. 中見(jiàn)到使用過(guò)。 其它的話(huà),就完全不熟悉了。 OGRE的 .mesh支持也不完全。 難道真要自己整一個(gè)。
我能想到的,就是選一個(gè)插件完整和模型和動(dòng)畫(huà)格式都比較好的作為與美術(shù)工具交互的格式。 自己再寫(xiě)一個(gè)工具,轉(zhuǎn)換成自己的格式。
糾結(jié)4:硬件蒙皮
我以為像NIKO那樣的技術(shù)狂,怎么會(huì)放掉這一個(gè)特性。 很高興地在場(chǎng)景節(jié)點(diǎn)上發(fā)現(xiàn)了硬件蒙皮的函數(shù)接口。但一看注釋?zhuān)盐已手恕?/p>
//! (This feature is not implemented in irrlicht yet)
virtual bool setHardwareSkinning(bool on);
其它地方,還沒(méi)有去整,就先不發(fā)表言論了。 繼續(xù)著這個(gè)很傻B,很天真的搗鼓之路。
上個(gè)圖,紀(jì)念一下我的irrlicht產(chǎn)物。
布衣
換了身盔甲
換了帽子和靴子
PS:頭發(fā)沒(méi)有紋理,所以是白的。