Nate談Spine 4.2版本物理系統(tǒng)的開發(fā)進(jìn)展

當(dāng)然,我很樂意嘮幾句!希望不會(huì)太無聊。?? 博客文章往往需要花很多精力來潤(rùn)色,而我們幾乎總是在爭(zhēng)分奪秒地發(fā)布新版本(最近更是如此)。雖然我們看起來沉默,但要知道我們一直在幕后工作!我們也試圖在不過于分散精力的情況下在論壇上保持活躍。
對(duì)于版本發(fā)布之間的長(zhǎng)時(shí)間沉默我很抱歉。我們盡量避免這種情況,但有時(shí)會(huì)冒出一系列的事情(錯(cuò)誤),所以還是發(fā)生了。
我們會(huì)推出4.2測(cè)試版,這是我們向大家尋求反饋的方式,為的是確保4.2非測(cè)試版足夠穩(wěn)定,可用于生產(chǎn)。測(cè)試版一旦準(zhǔn)備就緒會(huì)立即開始。我們很樂意盡早推出測(cè)試版,但有時(shí)我們無法做到,尤其是對(duì)于較大的功能更新。
測(cè)試版本的主要挑戰(zhàn)是,不管我們發(fā)布什么功能,都應(yīng)該要在后續(xù)版本中繼續(xù)正常工作。例如,我們不希望你在測(cè)試版中完成了工作,然后因?yàn)樽兓^大,無法在新版本中打開你的項(xiàng)目。
根據(jù)我們的工作內(nèi)容,有些是很容易做到的,比如假設(shè)我們正在添加UI功能或更改工具的工作方式。如果我們要做的改動(dòng)比較大,會(huì)影響到項(xiàng)目中的存儲(chǔ)方式,那么我們就需要非常有把握才會(huì)在測(cè)試版中發(fā)布它們。如果我們?cè)诎l(fā)布后又必須修改,那么我們就需要做更多的工作,將舊版本的項(xiàng)目數(shù)據(jù)轉(zhuǎn)換成被新版本所兼容(可能的話)。要是不可能,我們會(huì)認(rèn)為這是一場(chǎng)災(zāi)難。
對(duì)于4.2版本,其實(shí)我們很早就有了關(guān)于物理系統(tǒng)的想法,甚至在4.0之前我們就有了原型。最后我們覺得是時(shí)候了,我們做了更嚴(yán)肅的原型,并且看起來很有希望。我們?cè)诰庉嬈髦羞m當(dāng)集成了物理功能,這對(duì)于幕后工作來說是一項(xiàng)重大努力,因?yàn)檫@與Spine以前的工作方式截然不同。
在4.2之前,Spine是完全確定性的:對(duì)于時(shí)間軸上的任何時(shí)間點(diǎn),動(dòng)畫的姿勢(shì)都是相同的。有了物理系統(tǒng)后,這一點(diǎn)就不復(fù)存在了。在物理系統(tǒng)中,姿勢(shì)取決于先前的幀發(fā)生了什么。這使得Spine編輯器中的某些操作變得更加復(fù)雜,但我們還是完成了,而且很不錯(cuò)。有兩種模式:
物理系統(tǒng)始終進(jìn)行著計(jì)算,即使停止播放動(dòng)畫。物理系統(tǒng)計(jì)算出的姿勢(shì)會(huì)受到動(dòng)畫的播放、循環(huán)以及骨骼的移動(dòng)等的影響。
物理系統(tǒng)從第0幀開始確定性的計(jì)算。在時(shí)間軸上的任何給定時(shí)間,你總是能獲得相同的姿勢(shì),盡管該姿勢(shì)取決于先前的幀。
一個(gè)有趣的方面是,這在運(yùn)行時(shí)是一個(gè)重要的考慮因素。當(dāng)你播放動(dòng)畫時(shí),你的骨骼會(huì)隨著物理效果產(chǎn)生動(dòng)畫,但你也可以把骨骼在游戲世界空間中的移動(dòng)告訴物理系統(tǒng),這樣物理系統(tǒng)就可以做出反應(yīng)。
舉個(gè)例子,你有一件披風(fēng)和一個(gè)原地跑步動(dòng)畫。在運(yùn)行時(shí),你讓骨骼在游戲世界中移動(dòng)。你需要將這一移動(dòng)告訴物理系統(tǒng),這樣披風(fēng)的物理效果就能做出適當(dāng)?shù)捻憫?yīng),而不僅僅是對(duì)跑步動(dòng)畫中的移動(dòng)做出響應(yīng)。
你還要能夠在運(yùn)行時(shí)重置物理效果。例如,當(dāng)角色開始一個(gè)新的關(guān)卡時(shí),你不希望他們的披風(fēng)物理效果隨著上一關(guān)的任何動(dòng)作繼續(xù)擺動(dòng)。
這些意味著從4.2版本開始,你需要考慮對(duì)運(yùn)行時(shí)API進(jìn)行一些更改。
回到阻礙4.2測(cè)試版發(fā)布的原因——我們已經(jīng)為非確定性進(jìn)行了必要的修改。接著,我們從原型中引入了我們想要的物理系統(tǒng)工作方式,并創(chuàng)建了配置它的UI等。這一切都很成功,并即將在測(cè)試版中發(fā)布。這個(gè)物理系統(tǒng)有一個(gè)節(jié)點(diǎn)和彈簧機(jī)制。你可以做一些有趣的事情,比如這樣設(shè)置:

當(dāng)動(dòng)畫播放時(shí),你會(huì)看到非常逼真的布料模擬效果:

抱歉,我找不到那個(gè)動(dòng)畫的GIF了。不過我找到了一些其他的。為了給這篇文章增添點(diǎn)趣味,這里有一些更有趣的GIF。兩個(gè)節(jié)點(diǎn)和一個(gè)彈簧:

更多節(jié)點(diǎn):

更多彈簧:

碰撞:

節(jié)點(diǎn)可以附加到骨骼上,將其固定在適當(dāng)?shù)奈恢茫蛘咄ㄟ^骨骼驅(qū)動(dòng)節(jié)點(diǎn)的位置:

當(dāng)然,你也可以瘋狂一點(diǎn),這與上面編輯器截圖中的布料設(shè)置類似,但沒有重力:

節(jié)點(diǎn)和彈簧可以驅(qū)動(dòng)骨骼,影響平移、旋轉(zhuǎn)和縮放:

下一張是在編輯器中反復(fù)播放的動(dòng)畫,它顯示了兩種物理模式。當(dāng)“模擬(Simulate)”未激活時(shí),動(dòng)畫重復(fù)播放時(shí)姿勢(shì)會(huì)重置。當(dāng)模擬激活時(shí),即使動(dòng)畫重復(fù)播放,姿勢(shì)也會(huì)持續(xù)更新。

顯示影響骨骼旋轉(zhuǎn)和縮放的節(jié)點(diǎn)和彈簧:

不管怎么說,這一切都很酷。不過我們最終決定,這實(shí)際上并不是我們前進(jìn)的方向。??它對(duì)某些事情很有用,但并不是我們想要的一切。對(duì)于其他用例,它很難控制。盡管離發(fā)布已經(jīng)很近了,我們還是決定重新設(shè)計(jì),看看能否做得更好。我們想出了一種更適合用例的新方法,制作了原型,并從編輯器中刪除了很多內(nèi)容。這花了很長(zhǎng)時(shí)間,而且對(duì)自己的工作 "嗤之以鼻 "會(huì)讓人有點(diǎn)難過,但最終的結(jié)果會(huì)更好。理想情況下,我們應(yīng)該早點(diǎn)做這些改動(dòng),這樣就不會(huì)那么痛苦了。我們嘗試過,但如果不把它真的做出來,我們也不可能知道,而這需要付出很多。從痛苦中誕生的會(huì)更加美麗。??
這就是我們現(xiàn)在的情況。我們已經(jīng)在編輯器中重新使用了新內(nèi)容,但還不完全,所以還不能發(fā)布。不過它正在穩(wěn)步靠近!
至于我們是如何開發(fā)出Spine的,我很久以前寫過一篇博文——哇,已經(jīng)10年了。這篇文章涵蓋了早期使用的一些技術(shù):
http://esotericsoftware.com/blog/building-spine
有點(diǎn)好笑的是,我十幾歲的時(shí)候還在用QBasic制作火柴人。我有一個(gè)非常垃圾的編輯器,你可以在其中移動(dòng)火柴人的點(diǎn)。它將點(diǎn)存儲(chǔ)為姿勢(shì),游戲通過點(diǎn)位置之間的插值來播放動(dòng)畫,這與Spine的工作原理非常相似。直到大約20年后,我在制作游戲時(shí)發(fā)現(xiàn)對(duì)Spine的需求,我才重新審視它。