Pythonを使ってBlenderでできる事を、出題->解答の形式でまとめています。
はじめに
Blenderってたまに面倒臭いですよね?
Pythonで自動化しちゃいましょう!
レシピ一覧
3D操作
- 一辺の大きさが1の立方体を追加する ★☆☆☆☆
- デフォルトキューブをz方向に1動かす ★☆☆☆☆
- オブジェクトの名前にメッシュ名を合わせる ★★☆☆☆
- メッシュの名前を「MESH_オブジェクト名たち」にする★★★☆☆
- シーン内の全てのメッシュオブジェクトの原点を変更する★★★★☆
- 「数字->新名」の対応を元に、「Bone_L.数字」を「新名_L」に改名する(正規表現) ★★★★★
マテリアル操作
使い方
Q&A
Q. Blenderのバージョンは?
Blender2.79b用、Blender2.80用のコードをそれぞれ記載しています。
Blender2.80のコードはない場合もあります。
Q. Pythonのバージョンは?
Blender2.79bはpython3.?を使います。
Blender2.80はpython3.?を使います。
Q. 出題はどうやって使うの?
解いてもいいし、さっさと答えを見てもいいです。
Q. どの出題をやったらいいの?
難易度やハッシュタグ(例:#メッシュ
)を参考にして下さい。
ページ内検索とか便利です。
Q. OOのサンプルコードが欲しい
Qiitaコメント欄や私のツイッターアカウント(@KTakahiro1729)でリクエストを受け付けています。
できるとも限りませんし、作成物は全てここで公開しますが、それでよければお気軽にどうぞ。
Pythonの難易度
各出題には、Python文法の難易度が★☆☆☆☆~★★★★★で表されています。
下にある各難易度のサンプルコードが理解できたら、文法上は問題ないでしょう。
★☆☆☆☆のサンプルコード
a = (4 - 1) * -1
print("aは", a + 1) # 嘘付きな出力
b = str(a)
c = min(len(b),abs(a))
d = [a, b, c]
e = {"整数": (a,abs(a)), "文字列": b}
print(d, d[1],
list(e.keys()), e["文字列"][0])
import datetime as d
print(d.datetime.now())
- 数値計算
- 変数への代入
- 関数の使用
- printを使った出力
- コメント
- 型の変換
- リスト、辞書、タプルの利用
- プロパティー、メソッドの利用
- ライブラリーのインポート
★★☆☆☆のサンプルコード
def fizzbuzz(i):
"""数字をもらうとfizzbuzzの結果を返す。
数字というのはint"""
if type(i) == int:
pass
else:
try:
i = int(i)
except:
print("型が変")
return None
if (i % 15) == 0:
return "fizzbuzz"
elif not (i - (i // 5)*5):
print(i)
return "buzz"
elif 1- bool(i % 3):
return "fizz"
else: return str(i)
while True:
max_i = input("最大値")
if not (len(max_i)):
continue
max_i = int(max_i)
break
result = []
for i in range(1,max_i + 1):
result.append(fizzbuzz(i))
print(",".join(result))
- 関数の作成
- 複数行コメント
- for文
- if-elif-else文
- while文
- try-except文
- break-continue文
- 標準入力
- 型の確認
- 高度な数値計算(~数IIBレベル)
★★★☆☆のサンプルコード
import random
class Character():
def __init__(self,name, hp=20):
self.name = name
self.hp = hp
self.atk = 10
self.isAlive = True
def calc_damage(self):
return int(self.atk * random.random())
def attack(self, target):
damage = self.calc_damage()
target.hp -= damage
print("{0} attacked {1} with {2} so {3} left".format(self.name, target.name, damage, target.hp))
if target.hp <= 0:
target.die()
def die(self):
self.isAlive = False
print(self.name, "has died")
class Hero(Character):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.atk = 20
def introduce(self):
print ("I'm ",self.name)
class Monster(Character):
pass
name = input("Please input name: ")
player = Hero(name)
player.introduce()
monster = Monster("monster1", 10)
turn = (player, monster)
while monster.isAlive and player.isAlive:
turn[0].attack(turn[1])
turn = turn[::-1]
print("".join(["完" if i == 5 else "=" for i in range(20) if i < 12]))
- オブジェクト指向
- ファイル入出力
- format
- リスト内包表記
- 三項演算子
★★★★☆のサンプルコード
- 細かめな仕様の把握
- lambda関数
- デコレーター
- など……
- numpy, pandasの基礎的な利用
- 数IIBより高度な数学の知識
- 行列
- 基本的なコンピューターの知識
- .csv
- ファイルのパス
★★★★★のサンプルコード
- ★★★★☆に含めるのに気がひけるもの
- メタプログラミング
- 高度なコンピューターの知識
- 抽象構文木
- ソケット通信
ただし、★★★★☆の知識だけで分かるように簡単な解説を加えています。
ライセンス
ソースコード
GPLのライブラリー(bpyとかbmeshとか)をインポートしている場合は、当然GPLです。
その他は基本的にMITライセンスです。
本文・画像・サンプルファイルなど
ソースコード以外はCC0です。(例外は明記します)
どこかに使いたければ、勝手に使ってください。
編集リクエスト
編集リクエストは歓迎しますが、その内容には上記ライセンスが適用される事を了承したものと見なします。