91
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

目次

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

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

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

Scriptingを開く

~.pyというふうに名前をつける

コードを書いて実行ボタンを押す

スクリーンショット 2021-01-05 10.14.36.png

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

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

※スペースキーでも再生と停止が可能
スクリーンショット 2021-01-05 10.25.46.png

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

3Dviewportで、Nキーを押す

キー挿入箇所(緑色)で右クリックする

clear keyframeを押す

Nキーを押してタブをしまう

スクリーンショット 2021-01-05 10.23.44.png

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

Textボタンを押す

Newボタンを押す

~.pyのように名前をつける

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

書類のような絵柄のボタンを押す

スクリプトを選択する

スクリーンショット 2021-01-05 11.06.26.png

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

ezgif.com-gif-maker.gif

※自分がアニメーションさせたいオブジェクトは自分で3D viewportに追加してください。
追加の仕方はBlender Pythonをはじめようなどを参考にしてください。
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

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

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

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

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

最後に

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
91
Help us understand the problem. What are the problem?