[Blender×Python]   オリジナルオブジェクトのつくりかた

#目次

0.平面を生成する
1.立方体を生成する
2.四角錐を生成する
3.多角形を生成する
4.モディファイアを使う
5.ランダムな形状のメッシュを生成する
6.波状のメッシュを生成する


#0.平面を生成する

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/b36738d6-0eb4-66be-245d-a7cca51d4790.png)


```.py
import bpy
 
#平面を形成する頂点と面を定義する
verts = [(0,0,0),(0,5,0),(5,5,0),(5,0,0)]
faces = [(0,1,2,3)]
 
#メッシュを定義する
mesh = bpy.data.meshes.new("Plane_mesh")
#頂点と面のデータからメッシュを生成する
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)

#メッシュのデータからオブジェクトを定義する
obj = bpy.data.objects.new("Plane", mesh)   
#オブジェクトの生成場所をカーソルに指定する
obj.location = bpy.context.scene.cursor.location
#オブジェクトをシーンにリンク(表示)させる
bpy.context.scene.collection.objects.link(obj)
```

#1.立方体を生成する
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/84264d52-802a-8cc8-c841-1954c32f6fe7.png)


```.py
import bpy
 
#立方体を形成する頂点と面を定義する
verts = [(0,0,0),(0,5,0),(5,5,0),(5,0,0),(0,0,5),(0,5,5),(5,5,5),(5,0,5)]
faces = [(0,1,2,3), (4,5,6,7), (0,4,5,1), (1,5,6,2), (2,6,7,3), (3,7,4,0)]
 
#メッシュを定義する
mesh = bpy.data.meshes.new("Cube_mesh")
#頂点と面のデータからメッシュを生成する
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)

#メッシュのデータからオブジェクトを定義する
obj = bpy.data.objects.new("Cube", mesh)   
#オブジェクトの生成場所をカーソルに指定する
obj.location = bpy.context.scene.cursor.location
#オブジェクトをシーンにリンク(表示)させる
bpy.context.scene.collection.objects.link(obj)
```


#2.四角錐を生成する


![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/86d8ae2b-2471-665c-82e9-fd431cbf1b02.png)

```.py
import bpy
 
#四角錐を形成する頂点と面を定義する
verts = [(0,0,0),(0,5,0),(5,5,0),(5,0,0),(2.5,2.5,4.5)]
faces = [(0,1,2,3), (0,4,1), (1,4,2), (2,4,3), (3,4,0)]
 
#メッシュを定義する
mesh = bpy.data.meshes.new("Pyramid_mesh")
#頂点と面のデータからメッシュを生成する
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)

#メッシュのデータからオブジェクトを定義する
obj = bpy.data.objects.new("Pyramid", mesh)   
#オブジェクトの生成場所をカーソルに指定する
obj.location = bpy.context.scene.cursor.location
#オブジェクトをシーンにリンク(表示)させる
bpy.context.scene.collection.objects.link(obj)
```


#3.多角形を生成する

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/9e97a7cc-3e7d-2e47-dff0-b51ba70afc31.png)


```.py
import bpy
import math

#何角形か指定する
p = 5

#中心を起点に頂点を配置する
verts = [(0,0,0)]
for i in range(0,p + 1):
    x = 2 *math.pi / p * i
    verts.append([math.cos(x),math.sin(x),0])
    
#中心と円周上の2点の合計3点で面を形成する
faces = []
for i in range(0,p):
    faces.append([0,i + 1,i + 2])
    
mesh = bpy.data.meshes.new("Polygon_mesh") 
mesh.from_pydata(verts, [], faces) 
obj = bpy.data.objects.new("Polygon", mesh) 
bpy.context.scene.collection.objects.link(obj)

#編集モードにする
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode='EDIT')
 
#重複頂点を削除する
bpy.ops.mesh.remove_doubles()

#オブジェクトモードに戻る
bpy.ops.object.mode_set(mode='OBJECT')
```

#4.モディファイアを使う

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/d4195686-1167-2745-f64d-17f3d7c86e55.png)


```.py
import bpy
 
verts = [(0,0,0),(0,5,0),(5,5,0),(5,0,0),(0,0,5),(0,5,5),(5,5,5),(5,0,5)]
faces = [(0,1,2,3), (7,6,5,4), (0,4,5,1), (1,5,6,2), (2,6,7,3), (3,7,4,0)]
 
mesh = bpy.data.meshes.new("Cube_mesh")
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)

obj = bpy.data.objects.new("Cube", mesh)
obj.location = bpy.context.scene.cursor.location

#サブディビジョンサーフェスを適応する
obj.modifiers.new("subd", type='SUBSURF')
#サブディビジョンサーフェスのレベルを決定する
obj.modifiers['subd'].levels = 3
bpy.context.scene.collection.objects.link(obj)
 
 
#スムーズシェードを適応する
mypolys =　mesh.polygons
for p in mypolys:
    p.use_smooth = True
```



#5.ランダムな形状のメッシュを生成する
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/5581d1f4-bf98-129e-bbaf-f6caa65a4966.png)



```.py
import bpy
import random

verts = []
faces = []
 
#meshに関する変数
numX = 20
numY = 20
 
#波の形状に関する変数
amp = 0.5
scale = 1
 
#頂点座標を生成する
for i in range (0, numX):
    for j in range(0,numY):
        x = scale * i
        y = scale * j
        z = (i*random.random())*amp
        vert = (x,y,z) 
        verts.append(vert)
 
#4つの頂点から面を生成する
count = 0
for i in range (0, numY *(numX-1)):
    if count < numY-1:
        A = i
        B = i+1
        C = (i+numY)+1
        D = (i+numY)
        face = (A,B,C,D)
        faces.append(face)
        count = count + 1
    else:
        count = 0
 
mesh = bpy.data.meshes.new("random mesh")
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)

obj = bpy.data.objects.new("random mesh",mesh)
obj.location = bpy.context.scene.cursor.location
bpy.context.scene.collection.objects.link(obj)

 
#サブディビジョンサーフェスを適応する
obj.modifiers.new("subd", type='SUBSURF')
obj.modifiers['subd'].levels = 3
 
#スムーズシェードを適応する
mypolys = mesh.polygons
for p in mypolys:
    p.use_smooth = True
```

#6.波状のメッシュを生成する


![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/c0cf6906-1ec3-97bb-43a3-aba0d54b15e7.png)


```.py
import bpy
import math

verts = []
faces = []
 
# meshに関する変数
numX = 10
numY = 10
 
#波の形状に関する変数
freq = 1
amp = 1
scale = 1

#頂点座標を生成する
for i in range (0, numX):
    for j in range(0,numY):
 
        x = scale * i
        y = scale * j
        z = scale*((amp*math.cos(i*freq))+(amp*math.sin(j*freq)))
 
        vert = (x,y,z) 
        verts.append(vert)
 
#4つの頂点から面を生成する
count = 0
for i in range (0, numY *(numX-1)):
    if count < numY-1:
        A = i
        B = i+1
        C = (i+numY)+1
        D = (i+numY)
 
        face = (A,B,C,D)
        faces.append(face)
        count = count + 1
    else:
        count = 0
 
mesh = bpy.data.meshes.new("wave")
mesh.from_pydata(verts,[],faces)
mesh.update(calc_edges=True)

obj = bpy.data.objects.new("wave",mesh)
obj.location = (0,0,0)
bpy.context.scene.collection.objects.link(obj)

#サブディビジョンサーフェスを適応する
obj.modifiers.new("subd", type='SUBSURF')
obj.modifiers['subd'].levels = 3
 
#スムーズシェードを適応する
mypolys = mesh.polygons
for p in mypolys:
    p.use_smooth = True
```
















参考サイト
[Nathan's Blender Python Notebook](http://wiki.theprovingground.org/blender-python)