放下你手里那些張牙舞爪的AI繪圖工具,來看看這個。沒神經(jīng)網(wǎng)絡(luò)、沒擴(kuò)散模型,連GPU都用不上——就幾個 sin(x) 和 cos(x),配上約一萬個點(diǎn),硬生生在純黑背景上擰出一只渾身上下散發(fā)著“我好像是活的”氣息的紅色生物。這不是哪個神秘實(shí)驗(yàn)室的機(jī)密渲染,而是開發(fā)者Vitaliy Kaurov用Wolfram語言重寫的一段數(shù)學(xué)動畫。他把yuruyurau的一個P5.js原型改成了你現(xiàn)在看到的版本,而且整段代碼短到可以寫在餐巾紙上。
Vitaliy給這個生物起了兩個備選名字:“DragonSpine”(龍脊)和“TetherRoot”(拴系根)。你多看兩眼,確實(shí)能瞧見一條不斷起伏的脊柱,還有從脊背上伸展出來的根須狀觸手。但他本人更想讓人注意的,是這玩意兒根本沒用人工智能——他說:“這不是AI,僅僅是幾個sin(x)和cos(x)。代碼微小到餐巾紙都能寫。”同時他也拋出了一個讓不少搞圖形學(xué)的同行陷入沉思的問題:既然只是幾個初等函數(shù),視覺上怎么會這么復(fù)雜?而我們的大腦為什么執(zhí)著地認(rèn)為眼前擺了只“動物”?
![]()
趁著這個紅色團(tuán)子還在屏幕上扭動,我試著把它那股“不是AI勝似AI”的詭異勁兒掰開揉碎,給你列幾點(diǎn)觀察。看完之后你大概會和我一樣,既佩服數(shù)學(xué)的神奇,又忍不住吐槽某些動不動就標(biāo)榜自己是“AI生成生命”的玩意兒。
1. 活物的骨架,是用三角函數(shù)搭出來的
整個怪物的運(yùn)動全靠一個時間變量 t 驅(qū)動。在Vitaliy的代碼里,t 從0到2π來回播放,對應(yīng)著各種 sin 和 cos 項(xiàng)的相位變化。就是這種周期性起伏,讓每一個點(diǎn)都跟著呼吸節(jié)拍在屏幕上蠕動。沒有關(guān)鍵幀、沒有骨骼蒙皮,純粹是把一萬個點(diǎn)的坐標(biāo)寫成了關(guān)于 t 的函數(shù),然后讓它們集體起舞。你盯著那條“龍脊”看,會發(fā)現(xiàn)它的波浪幅度和頻率還會隨空間位置變化,這是代碼里 (4+3 Sin[2 y-t]) Cos[x/29.] 這樣的表達(dá)式在作祟。說白了,脊骨的每一次上下擺動,都是乘法與正弦在相互掐架。
2. 一萬個點(diǎn),就能騙過你的眼睛
代碼里用了 Range[10000] 生成了一萬個編號,接著映射成二維點(diǎn)云。這一萬個點(diǎn)并沒有哪個被賦予“頭部”“尾巴”或“觸須”的屬性,它們只是被同一套數(shù)學(xué)規(guī)則推來搡去。但有意思的是,這些點(diǎn)一旦被畫成半透明白色,堆疊出不同疏密,人眼就開始自動腦補(bǔ):這里有個隆起,那里像一條鰭,再遠(yuǎn)處仿佛是根須。Vitaliy自己也在博客里反思,我們判斷一個東西是否“活著”,需要的信息量其實(shí)極小,只要有靜態(tài)形狀再配上運(yùn)動,大腦就會自動把它往生物上歸攏。這條數(shù)學(xué)動畫恰好戳中了這種認(rèn)知軟肋。
3. 觸手與根須,是除法與正弦聯(lián)手編出來的
如果你硬是想知道那幾根張牙舞爪的“觸手”是咋來的,可以瞄一眼代碼里的變量 q。它的定義是 3 Sin[2 k]+0.3/k+Sin[y/25.] k (9+4 Sin[9 e-3 d+2 t]),看起來像一鍋亂燉,但這里正好藏著精細(xì)的控制:前面 3 Sin[2 k] 負(fù)責(zé)主體扭動節(jié)奏,中間 0.3/k 避免當(dāng)k趨近于零時產(chǎn)生炸裂數(shù)值,最后那一大坨帶了九個系數(shù)的正弦堆疊,則負(fù)責(zé)在脊骨周圍催生出復(fù)雜的次生結(jié)構(gòu)。正是這層數(shù)學(xué)上的“分形感”,讓龍脊周圍生出了枝枝杈杈的根須效果。明明都是中學(xué)就教過的三角函數(shù),堆一起卻能擰出類似外星生物的視覺紋理,這事兒擱誰都得愣一下。
4. 不是AI,所以不會有“翻車感”
現(xiàn)在遍地都是AI生成內(nèi)容的翻車現(xiàn)場——手指多一根、嘴巴歪半邊、動物身上憑空長出一套機(jī)甲。但這個數(shù)學(xué)造物不會,因?yàn)樗鼔焊鶝]經(jīng)過任何訓(xùn)練數(shù)據(jù)。它的所有動作都是確定的、可解析的,每一幀都嚴(yán)格按照公式生成。你永遠(yuǎn)不用擔(dān)心它突然長出一條不屬于龍脊的怪腿,因?yàn)榉匠汤飰焊蜎]給這個意外留余地。這種干凈利落的可控性,反倒讓某些整天喊著“AI定義下一代游戲美術(shù)”的宣發(fā)稿相形見絀——有時候,幾個初代三角函數(shù)真的比折騰半天調(diào)權(quán)重來得更穩(wěn)。
5. 對做游戲的人,這可能是另一種輕量級解法
別急著把這當(dāng)純藝術(shù)看。在游戲開發(fā)里,時常需要生成一些有機(jī)體形狀的環(huán)境物件或怪物,傳統(tǒng)建模動不動就上千萬面片,外加骨骼綁定和動畫狀態(tài)機(jī)。而Vitaliy這段代碼提醒你,有時候萬把個點(diǎn)加上幾行數(shù)學(xué)公式,就能實(shí)時渲染出一個不斷變形、看似活物的東西。雖然沒有碰撞體積,但作為背景里的漂浮異星生物,或者UI背后蠕動的氛圍元素,簡直不要太省錢。事實(shí)上,Emīls Ger?inskis-Je?inskis已經(jīng)用VEX在Houdini里實(shí)現(xiàn)過類似的數(shù)學(xué)生物,說明它不光能在Wolfram里蹦跶,也能進(jìn)入實(shí)際的DCC管線。
對了,如果你對這種“用數(shù)學(xué)手搓活物”的東西上頭,原初作者yuruyurau的X/Twitter賬號里還有更多類似作品,包括用更簡單公式生成的詭異小魚和章魚狀物,每一個都在挑逗你對“生命感”的認(rèn)知閾值。Vitaliy的博客也記錄了更詳細(xì)的推導(dǎo)思路,有興趣的可以去扒一扒。看完你或許會像我一樣,對著屏幕發(fā)上幾分鐘呆,心里只剩一句:真正的魔法師不是AI,是那幾位兩百年前就長在教科書里的老伙計(jì)——sin和cos。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.