Blender Python編程實(shí)現(xiàn)程序化建模生成超形示例詳解
正文
Blender 并不是唯一一款允許你為場景編程和自動化任務(wù)的3D軟件; 隨著每一個新版本的推出,Blender 正逐漸成為一個可靠的 CG 制作一體化解決方案,從使用油脂鉛筆的故事板到基于節(jié)點(diǎn)的合成。
事實(shí)上,你可以使用 Python 腳本和一些額外的包來批處理你的對象實(shí)例化,程序化地生成東西,配置你的渲染設(shè)置,甚至獲得你當(dāng)前項(xiàng)目的自定義統(tǒng)計數(shù)據(jù),這是非常棒的功能! 這是一種減輕繁瑣任務(wù)負(fù)擔(dān)的方式,同時也能讓開發(fā)者參與到這個創(chuàng)造性工具社區(qū)中,而不僅僅是美術(shù)人員。
什么是超形(Supershapes, Superformula)
截圖來自于 ShaderToy
二維超形
超形方程是基于由 Johan Gielis 意圖作為 自然形狀的建??蚣?/strong> 而提出的。 二維超形方程是圓方程和橢圓方程的推廣
他們給出的二維超橢圓/超形的一般公式如下。
其中 r
和 phi
是極坐標(biāo)(表示半徑、角度)
n1
、n2
、n3
、m
都是實(shí)數(shù)。
a
和 b
是除 0 以外的實(shí)數(shù)。
m = 0
的話,結(jié)果就是圓,即 r = 1
n1 = n2 = n3 = 1
增大 m
的話會增加形狀的旋轉(zhuǎn)對稱性。這通常適用于對于 n 個參數(shù)為其他值時的情況。這些曲線在角 2π/m
的圓上重復(fù)出現(xiàn),這現(xiàn)象在下面大多數(shù) m
為整數(shù)值的例子中尤為明顯。
n1 = n2 = n3 = 0.3
當(dāng) n 保持相等但減小時,形狀將變得越來越緊湊。
其他特別情況
例子 1
如果 n1
略大于 n2
和 n3
,則會形成 膨脹 的形式。
下邊的例子有 n1 = 40
和 n2 = n3 = 10
。
例子 2
多邊形 形狀是用非常大的 n1
值以及雖然值大但相等的 n2
和 n3
來實(shí)現(xiàn)的。
例子 3
不對稱 形狀可以通過使用不同的 n
值來創(chuàng)建。下面的例子有 n1 = 60
, n2 = 55
和 n3 = 30
。
例子 4
對于 m
的非整值,對于有理值其所生成的形狀仍然是封閉的。下面是 n1 = n2 = n3 = 0.3
的示例。角度需要從 0
擴(kuò)展到 12π
。
例子 5
由于 n1
的值小于 n2
和 n3
,因此形成了光滑的海星形狀。下面的例子有 m=5
和 n2 = n3 = 1.7
。
奇異的形狀
感興趣的朋友還可以嘗試其他不同的形狀
三維超形
在給出了上面二維超形的定義后,
我們可以使用球形乘積(spherical product)擴(kuò)展到 3D 使用。
Blender 生成超形
有了以上的理論支持,我們就可以在 Blender 里面開始編寫 Python 代碼了,原理并不難,我們只需要套用上面的三維超形公式,然后定義我們自己的參數(shù)即可。
詳細(xì)代碼和注釋如下
import bpy import math # mesh 數(shù)組(點(diǎn)、面、邊) verts = [] faces = [] edges = [] #3D supershape 參數(shù) m = 14.23 a = -0.06 b = 2.78 n1 = 0.5 n2 = -.48 n3 = 1.5 scale = 3 Unum = 50 Vnum = 50 Uinc = math.pi / (Unum/2) Vinc = (math.pi/2)/(Vnum/2) # 套用公式,填充頂點(diǎn)數(shù)組 theta = -math.pi for i in range (0, Unum + 1): phi = -math.pi/2 r1 = 1/(((abs(math.cos(m*theta/4)/a))**n2+(abs(math.sin(m*theta/4)/b))**n3)**n1) for j in range(0,Vnum + 1): r2 = 1/(((abs(math.cos(m*phi/4)/a))**n2+(abs(math.sin(m*phi/4)/b))**n3)**n1) x = scale * (r1 * math.cos(theta) * r2 * math.cos(phi)) y = scale * (r1 * math.sin(theta) * r2 * math.cos(phi)) z = scale * (r2 * math.sin(phi)) vert = (x,y,z) verts.append(vert) #增加 phi phi = phi + Vinc #增加 theta theta = theta + Uinc # ------------------------------------------------------------------------------- # 填充面數(shù)組 count = 0 for i in range (0, (Vnum + 1) *(Unum)): if count < Vnum: A = i B = i+1 C = (i+(Vnum+1))+1 D = (i+(Vnum+1)) face = (A,B,C,D) faces.append(face) count = count + 1 else: count = 0 # 創(chuàng)建 mesh 和 object mymesh = bpy.data.meshes.new("supershape") myobject = bpy.data.objects.new("supershape",mymesh) # 設(shè)置 mesh 的 location myobject.location = bpy.context.scene.cursor.location # * bpy.context.scene.collection.objects.link(myobject) # * # 從 python 數(shù)據(jù)創(chuàng)建 mesh mymesh.from_pydata(verts,edges,faces) mymesh.update(calc_edges=True) # 設(shè)置 object 為編輯模式 bpy.context.view_layer.objects.active = myobject # * bpy.ops.object.mode_set(mode='EDIT') # 移除重復(fù)的頂點(diǎn) bpy.ops.mesh.remove_doubles() # 重新計算法線 bpy.ops.mesh.normals_make_consistent(inside=False) bpy.ops.object.mode_set(mode='OBJECT') # 新建細(xì)分修改器(subdivide modifier) myobject.modifiers.new("subd", type='SUBSURF') myobject.modifiers['subd'].levels = 3 # 平滑 mesh mypolys = mymesh.polygons for p in mypolys: p.use_smooth = True
通過以上代碼,我們就可以輕松生成如下形狀,不用費(fèi)力得進(jìn)行 “雕刻”
還可以自行修改參數(shù),比如 “咻得一下” 就可以得到以下形狀,是不是很簡單~
以上就是Blender Python編程實(shí)現(xiàn)程序化建模生成超形示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Blender Python超形建模的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python生成隨機(jī)驗(yàn)證碼代碼實(shí)例解析
這篇文章主要介紹了Python生成隨機(jī)驗(yàn)證碼代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06python list 切片倒著取的實(shí)現(xiàn)示例
切片操作非常靈活,可以按照需要獲取列表中的任意一段元素,本文主要介紹了python list 切片倒著取的實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-01-01python 最簡單的實(shí)現(xiàn)適配器設(shè)計模式的示例
這篇文章主要介紹了python 最簡單的實(shí)現(xiàn)適配器設(shè)計模式的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Pythont特殊語法filter,map,reduce,apply使用方法
這篇文章主要介紹了Pythont特殊語法filter,map,reduce,apply使用方法,需要的朋友可以參考下2016-02-02Python pandas dataframe之重命名相同列名
這篇文章主要介紹了Python pandas dataframe之重命名相同列名方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09