[Blender×Python]   大量のスザンヌをきれいに並べよう!!

#目次

0.スザンヌを1つ出現させる
1.スザンヌを1列に並べる
2.スザンヌを2次元的に並べる
3.スザンヌを3次元的に並べる
4.サンプルコード

#0.スザンヌを1つ出現させる

前回の記事で紹介したスザンヌを1つ出現させるコードです。
今回はこれを応用していきます。

```.py
import bpy

bpy.ops.mesh.primitive_monkey_add(
      size=2,
      enter_editmode=False,
      align='WORLD',
      location=(0, 0, 0),
      scale=(1, 1, 1)
      )
```

一見長いように見えますが、**抽象化して情報を圧縮し記号化していく**ことで、シンプルに考えることができるという話でした(↓)

``===>primitive_monkey_add(□,□,□,□,□)``

コードの意味:スザンヌ出現させる。その時に位置とか大きさを変えたりもできる。


※ちなみにimportは、ライブラリ(誰かが作ってくれた便利なコードの集まり)を使えるようにするためのものです。

---

#1.スザンヌを1列に並べる

◯**forループ**という仕組みを使った反復処理をします。
反復処理を理解するポイントは、

**処理を行う回数**
と
**処理にともなって変化する数値**

を**別々に考える**ということです。

今は、よくわからないと思いますが大丈夫です !!



##1-0.x座標を1ずつずらして配置する

◯ポイントは、処理にともなって変化する数値が1ずつ増えていくところです。

```.py
import bpy

# iは、 0→1→2→3→4
for i in range(0,5):
    bpy.ops.mesh.primitive_monkey_add(
      size=2,
      enter_editmode=False,
      align='WORLD',
      #注目↓
      location=(i, 0, 0),
      scale=(1, 1, 1)
    )
```

上のコードは記号化(抽象化)すると、

``i → 0,1,2,3,4 :
    ===>primitive_monkey_add(□,□,□,□,□)``

のようにかけます。

意味 : 
iが処理を繰り返す度に**1ずつ増えていく**。
iが、**0 <= i < 5**を満たすならば、スザンヌを出現させる処理を行う。
そしてx座標の値にiの値を代入する。

---

処理の回数は5回
処理にともなって変化する数値は0→1→2→3→4となります。

これを実行すると下の写真のようになります。なんか可愛い..??

![スクリーンショット 2020-11-11 14.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/b14ce9b9-2a82-1c09-6a7f-a132df61308c.png)



---

◯Point:**range(どこから,どこまで)**
反復処理の範囲を決めるために使います。

---

##1-1.x座標を3ずつずらして配置する(Part1)

◯Pointは、スザンヌのx座標が**i * 3**と書かれている部分です。
*という記号はかけ算の記号です。

```.py
import bpy

# iは、 0→1→2→3→4
for i in range(0,5):
    bpy.ops.mesh.primitive_monkey_add(
      size=2,
      enter_editmode=False,
      align='WORLD',
      #注目↓
      location=(i * 3, 0, 0),
      scale=(1, 1, 1)
    )
```

![スクリーンショット 2020-11-11 14.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/729ac720-1db7-6980-b747-6e6574e0645f.png)



スザンヌのx座標は、i * 3となります。
つまり、
処理の1回目(i = 0)　→　**i * 3 = 0**
処理の2回目(i = 1)　→　**i * 3 = 3**
処理の3回目(i = 2)　→　**i * 3 = 6**
処理の4回目(i = 3)　→　**i * 3 = 9**
処理の5回目(i = 4)　→　**i * 3 = 12**




##1-2.x座標を3ずつずらして配置する(Part2)

◯ポイントは、range( )の中です。

```.py
import bpy

# iは、 0→3→6→9→12
for i in range(0,13,3):
    bpy.ops.mesh.primitive_monkey_add(
      size=2,
      enter_editmode=False,
      align='WORLD',
      #注目↓
      location=(i, 0, 0),
      scale=(1, 1, 1)
    )
```

![スクリーンショット 2020-11-11 14.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/1f703376-f1c0-4115-5074-1af0676b6061.png)


range( )は、``range(最初の値,最後の値,ステップ)``のようにして、
最初の数値から最後の数値までの範囲の中で数値を**何個飛ばしにするか**を決めることができます。

つまり、``for i in range(0,13,3):``は、0から3つおきに数値を選んで i に代入していくことをi < 13の範囲で繰り返すということです。
⬇️
**0** 1 2 **3** 4 5 **6** 7 8 **9** 10 11 **12**


処理の1回目　→　**i = 0**
処理の2回目　→　**i = 3**
処理の3回目　→　**i = 6**
処理の4回目　→　**i = 9**
処理の5回目　→　**i = 12**


※range(0,5)は実は、range(0,5,1)で、1が省略されていると考えることができますね。

---

#2.スザンヌを2次元的に並べる

◯ポイントはforループの中に**別のforループが入っている**ところです。

```.py
import bpy

# iは、 0→3→6→9→12
for i in range(0,13,3):
    for j in range(0,13,3):
        bpy.ops.mesh.primitive_monkey_add(
          size=2,
          enter_editmode=False,
          align='WORLD',
          #注目↓
          location=(i, j, 0),
          scale=(1, 1, 1)
        )
```

※　**:**　という記号は条件文はここで終わりだよということを示しています。

![スクリーンショット 2020-11-11 16.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/5f2255d4-78a3-641b-ae6f-4eae281ff660.png)


記号化(抽象化)すると、

```
i = 0→3→6→9→12:
    j = 0→3→6→9→12:
        ===>primitive_monkey_add(□,□,□,□,□)
```

のようにかけます。

これは、

```
( i , j ) = (0,0),(0,3),(0,6),(0,9),(0,12),
            (3,0),(3,3),(3,6),(3,9),(3,12),
            (6,0),(6,3),(6,6),(9,9),(12,12),
            (9,0),(9,3),(9,6),(9,9),(9,12),
            (12,0),(12,3),(12,6),(12,9),(12,12)
```

ということです。





---

#3.スザンヌを3次元的に並べる

◯先ほどの応用です。

```.py
import bpy

for i in range(0,13,3):
    for j in range(0,13,3):
        for k in range(0,13,3):
            bpy.ops.mesh.primitive_monkey_add(
              size=2,
              enter_editmode=False,
              align='WORLD',
              #注目↓
              location=(i, j, k),
              scale=(1, 1, 1)
            )
```

![スクリーンショット 2020-11-11 17.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/ca9928e7-1919-3cd9-5875-19f43b4ff658.png)







#4.サンプルコード

◯サンプルコードだけをまとめました。

####4-0.スザンヌを1つだけ出現させるコード

```.py
import bpy

bpy.ops.mesh.primitive_monkey_add(
      size=2,
      enter_editmode=False,
      align='WORLD',
      location=(0, 0, 0),
      scale=(1, 1, 1)
      )
```

####4-1.スザンヌを1列に並べるコード(1ずつずらす)

```.py
import bpy

# iは、 0→1→2→3→4
for i in range(0,5):
    bpy.ops.mesh.primitive_monkey_add(
      size=2,
      enter_editmode=False,
      align='WORLD',
      #注目↓
      location=(i, 0, 0),
      scale=(1, 1, 1)
    )
```

####4-2.スザンヌを1列に並べるコード(3ずつずらす:Part1)

```.py
import bpy

# iは、 0→1→2→3→4
for i in range(0,5):
    bpy.ops.mesh.primitive_monkey_add(
      size=2,
      enter_editmode=False,
      align='WORLD',
      #注目↓
      location=(i * 3, 0, 0),
      scale=(1, 1, 1)
    )
```

####4-3.スザンヌを1列に並べるコード(3ずつずらす:Part2)

```.py
import bpy

# iは、 0→3→6→9→12
for i in range(0,13,3):
    bpy.ops.mesh.primitive_monkey_add(
      size=2,
      enter_editmode=False,
      align='WORLD',
      #注目↓
      location=(i, 0, 0),
      scale=(1, 1, 1)
    )
```

####4-4.スザンヌを2次元的に並べるコード

```.py
import bpy

# iは、 0→3→6→9→12
for i in range(0,13,3):
    for j in range(0,13,3):
        bpy.ops.mesh.primitive_monkey_add(
          size=2,
          enter_editmode=False,
          align='WORLD',
          #注目↓
          location=(i, j, 0),
          scale=(1, 1, 1)
        )
```
####4-5.スザンヌを3次元的に並べるコード

```.py
import bpy

for i in range(0,13,3):
    for j in range(0,13,3):
        for k in range(0,13,3):
            bpy.ops.mesh.primitive_monkey_add(
              size=2,
              enter_editmode=False,
              align='WORLD',
              #注目↓
              location=(i, j, k),
              scale=(1, 1, 1)
            )
```

####4-6.円形に並べるコード

```.py
import bpy
import math

#変数に数値を代入する
#数値の変更を簡単にするため
n = 12
r = 10.0
for i in range(0, n):
    rad = 2 * math.pi * i /n  # 角度計算2π i /n
    x = r * math.cos(rad) # x座標計算 半径*cosθ
    y = r * math.sin(rad) # y座標計算 半径*sinθ
    
    bpy.ops.mesh.primitive_monkey_add(
              size=2,
              enter_editmode=False,
              align='WORLD',
              #注目↓
              location=(x, y, 0),
              scale=(1, 1, 1)
            )
```

![スクリーンショット 2020-11-11 17.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/38baee38-c391-a87c-9ad4-6290ad9d16c2.png)



####4-7.渦状に並べるコード

```.py
import bpy
import math

n = 144
r = 10.0
for i in range(0, n):
    rad = 2 * math.pi * i /24  # 角度計算2π i /24
    x = (r * i)/10 *  math.cos(rad) # x座標計算 半径*cosθ
    y = (r * i)/10 *  math.sin(rad) # y座標計算 半径*sinθ

    bpy.ops.mesh.primitive_monkey_add(
              size=2,
              enter_editmode=False,
              align='WORLD',
              #注目↓
              location=(x, y, 0),
              scale=(1, 1, 1)
            )
```

![スクリーンショット 2020-11-11 18.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/fc49af61-d86d-6566-acd3-6343e08c124b.png)







####4-8.螺旋をつくるコード

```.py
import bpy
import math

n = 144
r = 10.0
for i in range(0, n):
    rad = 2 * math.pi * i /12  # 角度計算2π i /12
    x = r * math.cos(rad) # x座標計算 半径*cosθ
    y = r * math.sin(rad) # y座標計算 半径*sinθ
    
    bpy.ops.mesh.primitive_monkey_add(
              size=2,
              enter_editmode=False,
              align='WORLD',
              #注目↓
              location=(x, y, i),
              scale=(1, 1, 1)
            )
```


![スクリーンショット 2020-11-11 18.10.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/a840b71e-dae5-4e00-af5a-e7e69f481873.png)