1. KTakahiro1729

    No comment

    KTakahiro1729
Changes in body
Source | HTML | Preview

Pythonを使ってBlenderでできる事を、出題->解答の形式でまとめています。

はじめに

Blenderってたまに面倒臭いですよね?
Pythonで自動化しちゃいましょう!

レシピ一覧

レシピ一覧用ページ

3D操作

使い方

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("完")
  • オブジェクト指向
  • ファイル入出力

★★★★☆のサンプルコード

  • 細かめな仕様の把握
    • リスト内包表記
    • lambda関数
    • デコレーター
    • など……
  • numpy, pandasの基礎的な利用
  • 数IIBより高度な数学の知識
    • 行列
  • 基本的なコンピューターの知識
    • .csv
    • ファイルのパス

★★★★★のサンプルコード

  • ★★★★☆に含めるのに気がひけるもの
    • メタプログラミング
  • 高度なコンピューターの知識
    • 抽象構文木
    • ソケット通信

ただし、★★★★☆の知識だけで分かるように簡単な解説を加えています。

ライセンス

ソースコード

GPLのライブラリー(bpyとかbmeshとか)をインポートしている場合は、当然GPLです。
その他は基本的にMITライセンスです。

本文・画像・サンプルファイルなど

ソースコード以外はCC0です。(例外は明記します)
どこかに使いたければ、勝手に使ってください。

編集リクエスト

編集リクエストは歓迎しますが、その内容には上記ライセンスが適用される事を了承したものと見なします。