[Blender×Python]   関数を自分でつくる&今までの総まとめ

この記事では、より多彩な処理を手軽に行うために関数を自分でつくる方法を紹介します。

#目次
0.関数とは
1.関数の種類
2.関数をつくるサンプルコード
3.英単語

#0.関数とは

関数とは、出力装置のようなものです。
引数の情報を受け取って、処理を実行します。

見た目は、``関数名(引数1,引数2,...)``のような形をしています。
引数は、パラメーターの役割を果たしています。
つまり、引数をいじると処理の結果が変わってきます。

その点、料理と似てます。
塩の量(パラメーター)をいじると、料理の味(出力)も当然変わってきますよね。


#1.関数の種類

関数には2種類あります。

**誰かが用意してくれた関数**　と　**自分でつくる関数**　です。

##1-0.誰かが用意してくれた関数

今まで頻繁に使ってきた立方体を追加する関数``primitive_cube_add()``などは**誰かが用意してくれた関数**です。

``primitive_cube_add()``とか、長い関数名だなと思った方もいるかもしれませんが、きっとどこかのおじさんたちが頑張って話しあって、こんな長い名前の関数ができたんだと思われます。



##1-1.自分でつくる関数

自分でつくる関数は、おじさんたちが用意してくれた関数をありがたく使ってつくります。

①**定義**
②**使用**

の順番で進めます。

もう少し具体的にかくと、

```.py
def 関数():
    処理
```
のようにして関数を**定義**したあと、

```.py
関数()
```

と書くだけです。

次章で具体的に見てみましょう。


##1-2.関数をつくってみる

立方体を1つ出現させる関数を自分でつくってみます。

まず、どこかの誰かが用意してくれた立方体を出現させる関数``primitive_cube_add( )``を見てみましょう。

```.py
import bpy

bpy.ops.mesh.primitive_cube_add()
```

これを利用して自分で関数をつくります。

####①定義
以下の例では、cube( )という関数を自分で定義しています。

```.py
import bpy

#オリジナル関数の定義
def cube():
    #誰かが用意してくれた関数
    bpy.ops.mesh.primitive_cube_add()
```

上のコードでは、自分のオリジナルの関数``cube()``を``def``を使って**定義**しています。構造は以下のような形です。

```.py
def 自分で作る関数の名前():
   関数を呼び出した時にさせたい処理
```

②使用
関数を呼び出してみましょう。

```.py
cube()
```

これだけです。
全体像は以下のようになります。

```.py
import bpy

#関数の定義
def cube():
    #関数を呼び出した時にやりたい処理
    bpy.ops.mesh.primitive_cube_add()

#自分で定義した関数cube()を呼び出す
cube()
```
![スクリーンショット 2020-11-15 17.25.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/e58c389a-88d8-1798-fc9c-bc53fb5269f6.png)




#2.関数をつくるサンプルコード

具体例で見て行った方がわかりやすいと思うので、ここからはサンプルコードと簡単な解説を載せていきます。

###オブジェクトをワイヤーフレームにする関数をつくる

```.py
import bpy

def cube():
    bpy.ops.mesh.primitive_cube_add()

def wireframe():
    bpy.ops.object.modifier_add(type='WIREFRAME')
    
cube()
wireframe()
```

![スクリーンショット 2020-11-15 15.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/88ff42d4-5b92-10a9-0de7-d14443277f0f.png)


###wireframe関数を他の関数の中で使う

```.py
import bpy

#オブジェクトをワイヤーフレームにする関数
def wireframe():
    bpy.ops.object.modifier_add(type='WIREFRAME')

#サイズを変えながらワイヤーフレームの立方体を出現させる関数
def wireframe_cube(_size = 2,num = 3):
    for i in range(0,num):
        bpy.ops.mesh.primitive_cube_add(
            size = _size * i
        )
        #出現させたオブジェクトを1つずつワイヤーフレームにしていく
        wireframe()
    
#最初のサイズは、1でそれを倍にしていく。立方体の数は10個。
wireframe_cube(_size = 1,num = 10)
```

![スクリーンショット 2020-11-15 15.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/eaa2b93d-2fda-caed-f210-33dd2db6289a.png)





###uv_spehreを出現させる関数をつくる

```.py
import bpy

#sphere()という関数を定義する
#滑らかさと出現位置を調整できるようにする
def uv_sphere(_segments = 32,_location = (0,0,0)):
    bpy.ops.mesh.primitive_uv_sphere_add(
    segments=_segments,
    location = _location
    )

#３個出現させる
uv_sphere()
uv_sphere(_segments = 16,_location = (3,0,0))
uv_sphere(_segments = 3,_location = (6,0,0))
```

![スクリーンショット 2020-11-15 15.03.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/d8a8b3bc-1abf-e2d8-8e30-b510a938c37b.png)

---



###立方体を1列に並べていく関数をつくる

```.py
import bpy

#好きな場所から好きな個数の立方体を1列に出現させる関数の定義
#引数にデフォルトの値を代入する
def cube_line_up(start_position = (0,0,0),num = 2,distance = 2):
    for i in range(0,num * distance + 1,distance):
        bpy.ops.mesh.primitive_cube_add(
        #X軸方向に並べていく
        location=(start_position[0] + i,start_position[1],start_position[2])
        )

#自分で定義した関数cube()を呼び出す
cube_line_up()
cube_line_up(start_position = (0,-4,0),num = 10,distance = 5)
cube_line_up(start_position = (0,-8,0),num = 4,distance = 3)

```

![スクリーンショット 2020-11-15 14.23.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/bbd2388e-5a8f-dfaf-4c42-b5e983f6bb74.png)


###マテリアル(ガラス)を設定する関数をつくる


```.py
import bpy

#立方体を出現させる関数の定義
def cube():
    bpy.ops.mesh.primitive_cube_add()

#マテリアルの設定をする関数の定義
def material(name = 'material',color = (0, 0, 0, 1)):
    material_glass = bpy.data.materials.new(name)
    #ノードを使えるようにする
    material_glass.use_nodes = True
    p_BSDF = material_glass.node_tree.nodes["Principled BSDF"]
    #0→BaseColor/7→roughness(=粗さ)/15→transmission(=伝播)
    #default_value = (R, G, B, A)
    p_BSDF.inputs[0].default_value = color
    p_BSDF.inputs[7].default_value = 0
    p_BSDF.inputs[15].default_value = 1
    #オブジェクトにマテリアルの要素を追加する
    bpy.context.object.data.materials.append(material_glass)

cube()
material(name = 'Red',color = (1, 0, 0, 1))
```

![スクリーンショット 2020-11-15 16.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/88a7173e-9304-5b3a-3b4b-057874f244cf.png)

![スクリーンショット 2020-11-13 19.19.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/c9688d12-d586-a5f2-7830-7b3f2810fad5.png)

###マテリアル(金属)を設定する関数をつくる


```.py
import bpy

#立方体を出現させる関数の定義
def cube():
    bpy.ops.mesh.primitive_cube_add()

#マテリアルの設定をする関数の定義
def material(name = 'material',color = (0, 0, 0, 1)):
    material_glass = bpy.data.materials.new(name)
    #ノードを使えるようにする
    material_glass.use_nodes = True
    p_BSDF = material_glass.node_tree.nodes["Principled BSDF"]
    #0→BaseColor/4→Metallic(=金属)/7→Roughness(=粗さ)
    #default_value = (R, G, B, A)
    p_BSDF.inputs[0].default_value = color
    p_BSDF.inputs[4].default_value = 1
    p_BSDF.inputs[7].default_value = 0
    #オブジェクトにマテリアルの要素を追加する
    bpy.context.object.data.materials.append(material_glass)

cube()
material(name = 'Blue',color = (0, 0, 1, 1))
```

![u.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/c7c7b8b8-0d60-b309-b212-411d147ab4c7.png)


#3.英単語

|英単語|訳|
|:--|:--|
|function|関数|
|context|文脈/環境|
|append|追加する|
|default|既定の|
|add|追加する|
|distance|距離|
|inputs|取得する|
|principled|原理、原則の|
|line up|並べる|
|segments|部分/区切り|