[Blender×Python]   アニメーションのつくりかた

#目次

0.アニメーションの諸操作
1.指定した座標に物体を移動する
2.ランダムな座標に物体を移動する
3.三角関数を使ってオブジェクトを動かす
4.物体の大きさを変化させる
5.物体の位置と大きさを同時に変化させる
最後に

#0.アニメーションの諸操作

###0-1.アニメーションの作成

Scriptingを開く
↓
~.pyというふうに名前をつける
↓
コードを書いて実行ボタンを押す

![スクリーンショット 2021-01-05 10.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/3e091e60-eeb9-7b10-3953-23a977455947.png)

###0-2.アニメーションの実行

animationに移動し再生ボタンを押す

※スペースキーでも再生と停止が可能
![スクリーンショット 2021-01-05 10.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/245dd32b-9403-37bf-d7c1-f0c27134891b.png)



###0-3.アニメーションの削除

3Dviewportで、Nキーを押す
↓
キー挿入箇所(緑色)で右クリックする
↓
clear keyframeを押す
↓
Nキーを押してタブをしまう

![スクリーンショット 2021-01-05 10.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/56fd30a4-61e3-c922-bbdc-b2f963ef15d7.png)


###0-4.新規スクリプトの作成

Textボタンを押す
↓
Newボタンを押す
↓
~.pyのように名前をつける

###0-5.スクリプトを選択する

書類のような絵柄のボタンを押す
↓
スクリプトを選択する

![スクリーンショット 2021-01-05 11.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/5a83c7bf-84c9-704d-7f5a-f0aa5d6a6479.png)




#1.指定した座標に物体を移動する

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/0d0d16d8-61ab-6262-7e07-0f56193229ea.gif)


※自分がアニメーションさせたいオブジェクトは自分で3D viewportに追加してください。
追加の仕方は[Blender Pythonをはじめよう](https://qiita.com/masterkeaton12/items/fb1e5b98f7bd2354b11e)などを参考にしてください。
``bpy.ops.mesh.~~~_add()``のように1文追加するだけです。もちろんshift + Aから選んで追加しても大丈夫です。



```anim01.py
import bpy

#目標の座標を指定する
positions = (0,3,2),(4,1,6),(3,-5,1),(3,10,1),(1,8,1)
#開始時の座標を指定する
start_pos = (0,0,0)

#変数obに3D viewportにあるオブジェクトを代入する
#ob = bpy.data.objects["Cube"]のようにして特定のものを動かすことも可能
ob = bpy.context.object

#開始のフレームを指定する
frame_num = 0

#目標の座標に移動する処理を繰り返す
for p in positions:
    #開始のフレームを設定する
    bpy.context.scene.frame_set(frame_num)
    #変数locationに目標の座標の値を代入する
    ob.location = p
    #キーフレームの挿入を行う
    ob.keyframe_insert(data_path = "location",index = -1)
    #フレームを20ずらす
    frame_num += 20
```



○Point : **keyframe_insert**
キーフレームの挿入を行う関数。引数には使用する情報(data_path)、配列の形式(index)等を使用する。
indexは、

-1→ x,y,z全て
0 → x
1 → y
2 → z

のようになっており特定の軸を基準にして操作することもできる。



#2.ランダムな座標に物体を移動する

![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/ac94d3a1-684f-8738-a044-10ca4bf57298.gif)


```anim02.py
import bpy
#ランダムライブラリの中のrandint関数を使用する
from random import randint

#3Dviewportにあるオブジェクトを使用する(今回はSphere)
ob = bpy.data.objects["Sphere"]
frame_number = 0

#処理を50回繰り返す
for i in range(0,50):
    
    #第一引数から第二引数までの範囲の中からランダムに整数を選択する
    x = randint(-20,20)
    y = randint(-40,20)
    z = randint(-20,60)
    
    bpy.context.scene.frame_set(frame_number)
    ob.location = (x,y,z)
    ob.keyframe_insert(data_path = "location",index = -1)
    frame_number += 5
```



#3.三角関数を使ってオブジェクトを動かす

![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/3152f5ef-8812-ea68-6fe5-0f0627653eb3.gif)


```anim03.py
import bpy
#mathライブラリのsin関数を用意する
from math import sin

start_pos = (0,0,0)
ob = bpy.context.object
frame_num = 0

for i in range(0,50):
    bpy.context.scene.frame_set(frame_num)
    #変数locationに座標を指定する
    ob.location = (0,i,sin(i))
    ob.keyframe_insert(data_path = "location",index = -1)
    frame_num += 10
```


#4.物体の大きさを変化させる

![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/9e417925-2511-744c-7f67-689879f5f270.gif)


```anim04.py
import bpy

scales = (1,3,2),(4,1,6),(3,5,1),(3,10,1),(1,8,1)
start_pos = (0,0,0)
ob = bpy.context.object
frame_num = 0

for s in scales:
    bpy.context.scene.frame_set(frame_num)
    ob.scale = s
    #大きさの情報を元にしてキーを挿入する
    ob.keyframe_insert(data_path = "scale",index = -1)
    frame_num += 20
```


#5.物体の位置と大きさを同時に変化させる

![ezgif.com-gif-maker (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/38a1011c-b138-591e-e5c4-7c998e08a0ae.gif)


```anim05.py
import bpy
from math import sin

start_pos = (0,0,0)
ob = bpy.context.object
frame_num = 0

for i in range(0,100):
    bpy.context.scene.frame_set(frame_num)
    ob.location = (0,-i,sin(i) * 3)
    ob.scale = (1,1,1 + sin(i))
    ob.keyframe_insert(data_path = "location",index = -1)
    ob.keyframe_insert(data_path = "scale",index = -1)
    frame_num += 5
```



#最後に

読んでいただきありがとうございました。
修正点等ありましたらお気軽にご連絡ください!!