top of page

Essays

數字生命型態的探索

數字的生命型態樣貌為何,是堅硬還是柔軟的?

 

在當今科技時代,電腦程式無處不在,已經成為我們生活中不可或缺的一部分,就像一種「類自然環境」,伴隨著人類的演化不斷變化。然而,作為不可見的數字運算,我們如何理解和想像它的形態?它只是在屏幕上閃爍的文字嗎?還是有著堅硬的機械外殼,甚至像生物一樣柔軟的形體呢?

 

生命是一種特徵,我們可能還無法明確定義生命,但當我們試圖想像生命的形態時,大自然中的有機物會在我們腦海中浮現。大自然以演算和衍生的方式創造出人類難以想像的形態,就像深海中多孔動物或爬蟲類的皮膚一樣。這種衍生的複雜之美與電腦運算中數字的流動非常相似。我們能否將程式碼和數字視為基因,尋找類似的衍生規則呢?

在以電腦演算法作為創作媒材的初始,我以程式語言定義了八個點座標,創造了一個最基本的立方體形狀。然後我開始思考,這個立方體是否能夠透過規則的改變而演化成我們所熟悉的生命形態。這讓我想起了Ridley Scott執導的電影《Prometheus》中的一句台詞。故事中,太空船剛剛抵達一個未知的星球,船員們試圖尋找更高等的生命體。在船員們猶豫不決時,一位科學家指著一處地方說:“Right there, God does not build in straight lines.”(在那裡,上帝不會建造直線。)

 

這個簡單的立方體由八個頂點、十二條邊和六個面組成。然而,這三個元素都不會在有機生命體中出現。如果我想讓它逐漸演化成某種生命形式,是否應該在迭代過程中逐步弱化這些元素的特徵呢?這個想法就像小孩子玩紙箱一樣,將尖銳的頂點推進去,折疊平直的邊緣,甚至將平坦的面上的某些點推進或拉出。當然,上述規則只是舉例,我們可以通過各種想法和定義的電腦演算法,使一個簡單的幾何形狀逐步演化成極度複雜的狀態。

 

為了實現上述方法,我使用了一種稱為「網格微分」(Mesh Subdivision)的演算規則。以下圖為例來說明這個過程。透過定義頂點之間的順序,指示電腦使用這些頂點來構成面,並使用新產生的面來定義新的頂點。當頂點數量增加時,可以再次構成更加細緻和複雜的面。以圖形為例,假設有三個頂點V1、V2和V3。我們可以使用這三個頂點構成一個面,並找到在這個面上的一個新頂點V4。透過微調V4的位置,使得以這四個頂點構成的三個面不再貼合原來的面,從而使整體形態產生變化。

小圖-01.png

for j in range(level):

    faceList = [ ]

    for i in range(MeshFaceCount):

        

        idx1 = MeshFaceVertices[i][0]

        idx2 = MeshFaceVertices[i][1]

        idx3 = MeshFaceVertices[i][2]

    

        v1 = MeshVertices[idx1]

        v2 = MeshVertices[idx2]

        v3 = MeshVertices[idx3]

        v4 = (v1 + v2 + v3)/3 + (MeshFaceNormals[i]*distance)*(0.5**j)

        MeshVertices.append(v4)

        idx4 = MeshVertexCount

 

        faces = [(idx1, idx2, idx4), (idx2, idx3, idx4), (idx3, idx1, idx4)]

        faceList.extend(faces)        

        MeshVertexCount = MeshVertexCount + 1 

    mesh = AddMesh(MeshVertices, faceList)

 

這段程式碼運用了一個迴圈,其中level表示迭代的次數。在每次迭代中,它會遍歷現有的面(MeshFaceCount),並使用這些面的頂點座標來計算新的頂點位置。新的頂點位置為原始頂點的平均值加上面的法向量乘以距離的參數。然後,新的頂點被添加到MeshVertices列表中,並且新的面被構建出來。最後,我們使用AddMesh函數將新的頂點和面添加到網格中。

通過這種迭代的方式,原始的立方體將逐步演化成一個具有複雜紋理和不規則形狀的立體體積。迭代次數的多寡會影響最終的形態細節和複雜性。

 

而這樣的演算方式有無窮無盡的可能性,以下圖為例:

for j in range(level):

    faceList=[ ]    

    for i in range(MeshFaceCount):

        

        idx1 = MeshFaceVertices[i][0]

        idx2 = MeshFaceVertices[i][1]

        idx3 = MeshFaceVertices[i][2]

    

        v1 = MeshVertices[idx1]

        v2 = MeshVertices[idx2]

        v3 = MeshVertices[idx3]

        nVec = (MeshFaceNormals[i]*distance)*(0.5**j)

        v4 = (v1 + v2)/2 + nVec

        v5 = (v2 + v3)/2 + nVec

        v6 = (v3 + v1)/2 + nVec

 

        MeshVertices.append((v4))

        idx4 = MeshVertexCount

        MeshVertices.append((v5))

        idx5 = MeshVertexCount+1

        MeshVertices.append((v6))

        idx6 = MeshVertexCount+2

        

        faces = [(idx1, idx4, idx6), (idx2, idx5, idx4), (idx3, idx6, idx5), (idx4, idx5, idx6)]

        faceList.extend(faces)        

       MeshVertexCount = MeshVertexCount + 3

        

    mesh = AddMesh(MeshVertices, faceList)

 

這段程式碼展示了另一種網格微分的演算方式,可以進一步豐富形態的多樣性。在這個例子中,我們使用了三個頂點,並根據它們之間的中點定義了三個新的頂點。透過微調這些新頂點的位置,並將它們往面的法向量方向移動,我們可以構建出四個新的面。類似之前的演算方式,我們可以通過迭代演算來重複這個重建面的過程。程式碼中的迴圈用於控制迭代的次數(使用變數level)。在每次迭代中,它遍歷現有的面並根據頂點之間的中點計算新的頂點位置。然後,這些新的頂點根據面的法相量進行微調。新的頂點被添加到MeshVertices列表中,並根據新的頂點組成的面構建faceList列表。

當我們僅僅重複使用相同的規則進行大量迭代演算時,雖然可以產生極其複雜的幾何形體,但卻無法帶給人們有機物質的複雜美感。這是因為重複的規則所產生的節奏過於均質,線性的變化無法展現出有機物質衍生的趨勢。舉例來說,一顆珊瑚的生長不可能僅僅由單一規則來描述,而植物的叢生則取決於自身的生長邏輯與周圍環境的狀態。因此,需要嘗試探索不同階段和狀態所需的演算規則,並逐步推敲和組合它們以實現形態的演化,在尋找擬似有機物質衍生的趨勢和意識的同時,展現對於數字生命演化的想像。

 

透過數位藝術創作的演化過程,我們能夠呈現出複雜且迷人的數字生命體。這種創作不僅反映了對生命的探索,同時也是我們不斷尋求和模擬生命形態和特徵的一種方式,藉此更深入地理解我們自身存在的意義。

bottom of page