BlenderPython編程實現(xiàn)程序化建模生成超形示例詳解_第1頁
BlenderPython編程實現(xiàn)程序化建模生成超形示例詳解_第2頁
BlenderPython編程實現(xiàn)程序化建模生成超形示例詳解_第3頁
BlenderPython編程實現(xiàn)程序化建模生成超形示例詳解_第4頁
BlenderPython編程實現(xiàn)程序化建模生成超形示例詳解_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第BlenderPython編程實現(xiàn)程序化建模生成超形示例詳解目錄正文什么是超形(Supershapes,Superformula)二維超形n1=n2=n3=1n1=n2=n3=0.3其他特別情況例子1例子2例子3例子4例子5奇異的形狀三維超形Blender生成超形詳細代碼和注釋如下

正文

Blender并不是唯一一款允許你為場景編程和自動化任務的3D軟件;隨著每一個新版本的推出,Blender正逐漸成為一個可靠的CG制作一體化解決方案,從使用油脂鉛筆的故事板到基于節(jié)點的合成。

事實上,你可以使用Python腳本和一些額外的包來批處理你的對象實例化,程序化地生成東西,配置你的渲染設(shè)置,甚至獲得你當前項目的自定義統(tǒng)計數(shù)據(jù),這是非常棒的功能!這是一種減輕繁瑣任務負擔的方式,同時也能讓開發(fā)者參與到這個創(chuàng)造性工具社區(qū)中,而不僅僅是美術(shù)人員。

什么是超形(Supershapes,Superformula)

截圖來自于ShaderToy

二維超形

超形方程是基于由JohanGielis意圖作為自然形狀的建??蚣芏岢龅摹6S超形方程是圓方程和橢圓方程的推廣

他們給出的二維超橢圓/超形的一般公式如下。

其中r和phi是極坐標(表示半徑、角度)

n1、n2、n3、m都是實數(shù)。

a和b是除0以外的實數(shù)。

m=0的話,結(jié)果就是圓,即r=1

n1=n2=n3=1

增大m的話會增加形狀的旋轉(zhuǎn)對稱性。這通常適用于對于n個參數(shù)為其他值時的情況。這些曲線在角2/m的圓上重復出現(xiàn),這現(xiàn)象在下面大多數(shù)m為整數(shù)值的例子中尤為明顯。

n1=n2=n3=0.3

當n保持相等但減小時,形狀將變得越來越緊湊。

其他特別情況

例子1

如果n1略大于n2和n3,則會形成膨脹的形式。

下邊的例子有n1=40和n2=n3=10。

例子2

多邊形形狀是用非常大的n1值以及雖然值大但相等的n2和n3來實現(xiàn)的。

例子3

不對稱形狀可以通過使用不同的n值來創(chuàng)建。下面的例子有n1=60,n2=55和n3=30。

例子4

對于m的非整值,對于有理值其所生成的形狀仍然是封閉的。下面是n1=n2=n3=0.3的示例。角度需要從0擴展到12。

例子5

由于n1的值小于n2和n3,因此形成了光滑的海星形狀。下面的例子有m=5和n2=n3=1.7。

奇異的形狀

感興趣的朋友還可以嘗試其他不同的形狀

三維超形

在給出了上面二維超形的定義后,

我們可以使用球形乘積(sphericalproduct)擴展到3D使用。

Blender生成超形

有了以上的理論支持,我們就可以在Blender里面開始編寫Python代碼了,原理并不難,我們只需要套用上面的三維超形公式,然后定義我們自己的參數(shù)即可。

詳細代碼和注釋如下

importbpy

importmath

#mesh數(shù)組(點、面、邊)

verts=[]

faces=[]

edges=[]

#3Dsupershape參數(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)

#套用公式,填充頂點數(shù)組

theta=-math.pi

foriinrange(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)

forjinrange(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

foriinrange(0,(Vnum+1)*(Unum)):

ifcountVnum:

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')

#移除重復的頂點

bpy.ops.mesh.remove_doubles()

#重新計算法線

bpy.ops.mesh.normals_make_consistent(inside=False)

bpy.ops.object.mode_set(mode='OBJECT')

#新建細分修改器(subdividemodifier)

myobject.modifiers.new("subd",type='SUBSURF')

myobject.modifiers['subd'].levels=3

#平滑mesh

mypolys=mymesh.polygons

forpinmypolys:

p.use_smooth

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論