ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Blender】Blender2.8でレンダリングの背景を360度画像に設定&画像として出力する方法

 今回はBlender2.8でレンダリング時の背景を360度画像に設定&出力する方法です。

 Blender2.8で説明していきますが、基本的にはBlender2.79でも同じ方法でできます。詳しいやり方は参考資料のサイト様を参照してください。

 では始めます。


1:レンダリングの背景を360度パノラマに設定する
 Blender2.8を起動させたら、「World」タブを開いて「Color」の項目の横にある○を左クリックします。
f:id:rikoubou:20190125170558p:plain

 なんでもよいですが、今回は「Brick Texture」を選択します。(Colorの項目に出てくる他の項目でも背景を設定できます)
f:id:rikoubou:20190125172002p:plain

 Colorが「Brick Texture」になり表示される項目が変更されますが、とりあえず値は変更せずそのままにします。
f:id:rikoubou:20190125172140p:plain

 この状態で3D Viewの右上にある「Rendered」ボタンを左クリックすると、以下のように背景がレンガ模様になります。
f:id:rikoubou:20190125172343p:plain

 マウスの中ホイールをドラッグしながらグリグリ画面を動かすと、背景もいい感じに動きます。
f:id:rikoubou:20190125172629g:plain

 これで360度の背景を設定できました。


2:Blenderで360度画像を出力する
 背景を360度のパノラマに設定できたので、これを画像として出力します。

「Render」タブを開いて「Render Engine」のプルダウンから「Cycles」を選択して、Cyclesレンダーに変更します。
f:id:rikoubou:20190125173308p:plain

 Cyclesレンダーに変更後、Cameraを選択した状態で「Camera」タブを開き、「Type」のプルダウンから「Panoramic」を選択します。
f:id:rikoubou:20190125173722p:plain

「Panoramic」にすると表示される項目が変更されるので「Panorama Type」を左クリックします。
f:id:rikoubou:20190125173919p:plain

 出てきたプルダウンの中から「Equirectangular」を選択します。
f:id:rikoubou:20190125174054p:plain

 これで360度でのレンダリング出力設定ができたので、上部メニューの「Render」→「Render Image」で画像としてレンダリング出力します。 
f:id:rikoubou:20190125174232p:plain

 レンダリング結果は以下のようになります。
f:id:rikoubou:20190125174457p:plain

 あとはいつものようにメニューの「Image」→「Save As...」から画像を保存します。
f:id:rikoubou:20190125174546p:plain

 出力した画像は以下のようになります。
f:id:rikoubou:20190125174753p:plain


3:レンダリングの背景を任意の360度画像に設定する
 360度画像が出力できたので、今度はその画像を読み込んで360度背景に設定してみます。

 先ほどと同じように「World」タブを開いて「Color」の項目の横にある○を左クリックします。
f:id:rikoubou:20190125170558p:plain

 今回は「Enviroment Texture」を選択します。
f:id:rikoubou:20190125170821p:plain

 項目が変更されるので「Open」ボタンを左クリックして任意の360度画像を開きます。
f:id:rikoubou:20190125170959p:plain

 すると以下のように360度画像を背景に設定することができます。
f:id:rikoubou:20190125175311p:plain


 以上がBlender2.8で背景を360度画像に設定&出力する方法になります。

 色々使い道があるかと思うので、この方法を使って何か作ってみたいです。


・参考資料

【python】クラスとファイル分け

 今まで色々とpythonを使ってソースコードを書いてきましたが、処理を別ファイルに分けたりクラスに分けたりということを特に意識していませんでした。

 なので今回はpythonでの「クラスとファイル分け」についての備忘録です。

 では始めます。


0:テスト用コード
 とりあえず今回は以下の適当なコードを使ってクラス分けとファイル分けを行なっていきます。

・main.py

#
# テストコード
#
def main():
	print("---start---")

	while True:
		addend1 = input("input the addend1 : ")
		if (addend1 == "end"):
			break

		addend2 = input("input the addend2 : ")
		result = mySum(addend1, addend2)

		showSum(addend1, addend2, result)

	print("---end---")

def mySum(add1, add2):
	return int(add1) + int(add2)

def showSum(add1, add2, result):
	print(str(add1) + " + " + str(add2) + " = " + str(result))

if __name__ == '__main__':
    main()

1:クラス分け
 pythonでのクラスの書き方は以下の通りです。

#
# クラスの書き方
#
class ClassName():
	def __init__(self):
		# コンストラクタの何かしらの処理

	def func1(self, x, y):
		# 何かしらの処理

	def func2(self, x, y, z):
		self.func1(x, y, z)
		# 何かしらの処理

	# 以下略

 これだけ見れば大体わかるかとは思いますが、「class ClassName():」のところがクラス名の定義です。「def __init__(self):」がコンストラクタで、そのあと「def func1(self, x, y):」と「def func2(self, x, y, z):」がクラスが持つ関数になります。

 全ての関数に書かれている引数のselfはインスタンス自身を指しており、クラス内の関数を使う場合には「self.関数名」のようにして呼び出します。

 かなり雑な説明をしましたが、これでクラス分けの方法がわかったので、テストコードをクラス分けしてみます。

 クラス分けすると以下のようになります。

・main.py

#
# テストコード2
#

# クラス分け
class SumClass():
	def __init__(self):
		print("init end")
	
	def sumLoop(self):
		while True:
			addend1 = input("input the addend1 : ")
			if (addend1 == "end"):
				break

			addend2 = input("input the addend2 : ")
			result = self.mySum(addend1, addend2)

			self.showSum(addend1, addend2, result)

	def mySum(self, add1, add2):
		return int(add1) + int(add2)
	
	def showSum(self, add1, add2, result):
		print(str(add1) + " + " + str(add2) + " = " + str(result))

# メイン関数
def main():
	sumInstance = SumClass()
	print("---start---")
	sumInstance.sumLoop()
	print("---end---")

if __name__ == '__main__':
    main()


2:ファイル分け
 クラス分けができたので、今度は処理を別ファイルに分ける方法です。

 main.pyのSumClass部分を切り出して「sumClass.py」というファイル名で保存します。

・sumClass.py

#
# sumClass.py
#
class SumClass():
	def __init__(self):
		print("init end")
	
	def sumLoop(self):
		while True:
			addend1 = input("input the addend1 : ")
			if (addend1 == "end"):
				break

			addend2 = input("input the addend2 : ")
			result = self.mySum(addend1, addend2)

			self.showSum(addend1, addend2, result)

	def mySum(self, add1, add2):
		return int(add1) + int(add2)
	
	def showSum(self, add1, add2, result):
		print(str(add1) + " + " + str(add2) + " = " + str(result))

 main.pyと同じ階層に「sum」という名前でフォルダを作成し、そのsumフォルダ内に「sumClass.py」を移動させます。
f:id:rikoubou:20190121164125p:plain

 次にmain.pyからsumClass.pyを呼び出す方法ですが、以下のように記述します。

from sum import sumClass as sc

「from」の後に記述するのがpythonの現在位置から呼び出したいフォルダの相対パスです。
「import」の後に記述するのが呼び出すpythonのファイル名、そして「as」の後に記述するのが呼び出すファイルを使いやすくするために新たに名付けた名前です。

 この一文を訳すと「実行するpythonファイルと同じ階層にあるsumというフォルダの中にあるsumClass.pyというファイルをscという名前で使う」という感じです。

 このimportの書き方は以下のページがわかりやすいので参照してください。

 これで外部ファイルの読み込み方法がわかったので、main.pyを以下のように修正します。

・main.py

#
# テストコード3
#
from sum import sumClass as sc # この文を追加して読み込み

# メイン関数
def main():
	sumInstance = sc.SumClass() # scという名前にしたのでそこでインスタンス関数を呼び出す
	print("---start---")
	sumInstance.sumLoop()
	print("---end---")

if __name__ == '__main__':
    main()

 これでクラスとファイル分けができました。


 以上がpythonのクラスとファイル分けの方法です。

 かなり雑ですし色々足りないとは思いますが、ざっくりやる方法ということで。


・参考資料

【Blender】Blender2.8での日本語化設定方法

 そういえばまだBlender2.8の日本語化をやっていなかったのとBlender2.8で場所が変わったりなど色々していたので、その備忘録です。

 では、始めます。


・Blender2.8の日本語化
 Blender2.8を起動させたら上部メニューにある「Edit」→「Preferences」を左クリックします。
f:id:rikoubou:20190116152252p:plain

 以下のように設定画面が表示されます。
f:id:rikoubou:20190116152351p:plain

 左側の「Interface」タブを選択し、「Text」を左クリックして出てきた中にある「Transrate UI」にチェックを入れます。
f:id:rikoubou:20190116152519p:plain

「Language」のプルダウンを左クリックすると言語の一覧が出てくるので「Japanese(日本語)」を左クリックします。
f:id:rikoubou:20190116152723p:plain

 プルダウンから言語を設定したら、以下のように一番下以外のものにチェックを入れます。
f:id:rikoubou:20190116153026p:plain

 すると以下のように日本語の表示になるので、設定を保存したい場合は左下にある「Save Preferences」ボタンを左クリックすると保存されます。
f:id:rikoubou:20190116153152p:plain


 以上がBlender2.8での日本語化の方法です。

 自分は基本的に英語のインターフェースのまま使っていますが、日本語化した方がわかりやすかったり、また一度日本語化することで「日本語を入力/表示できるようになる」という利点があるので、一度はやっておいた方がいいかと思います(自分も一度日本語化してまた元に戻しました)。

 また参考資料として見つけたBlender2.8の日本語化の方法と、最新版では微妙に変更があったようなので今回記事にした次第です。


・参考資料

【python/OpenCV】OpenCVで動画ファイルの読み込みと保存の方法

 今までpythonOpenCVを使ってWebカメラや静止画の加工などはやっていましたが、動画ファイルを扱ったことがなかったのでその備忘録です。(※ちなみにOpenCVでは音声は扱えません)

 OpenCVpythonの他にどうやらopencv_ffmpegを入れてないと使えないようなので、そこは各自で入れておいてください。

 では始めます。


1:動画ファイルの読み込み
 OpenCVで動画の読み込みを行うには以下の記述でできます。

import cv2

video = cv2.VideoCapture("./movie/test.mp4") # 引数がファイルパス
ret, frame = video.read() # 1フレーム読み込み

 基本的にWebカメラを扱う時と同じ感じで、引数にファイルパスを指定してあげるだけです。
 フレームごとの読み込みもread関数で行えばよいです。

 また動画の各情報も以下のようにして取得できます。

width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) # 動画の画面横幅
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 動画の画面縦幅
frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) # 総フレーム数
frame_rate = int(video.get(cv2.CAP_PROP_FPS)) # フレームレート(fps)

 この他にも取得できる情報は色々あるようなので、参考資料にあるサイト様を参照してください。


2:動画ファイルの保存
 動画の読み込み方法がわかったので次は動画ファイルとしての保存方法です。
 その方法は以下の記述でできます。

import cv2

frame_rate = 24.0 # フレームレート
size = (640, 480) # 動画の画面サイズ

fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # ファイル形式(ここではmp4)
writer = cv2.VideoWriter('./result/outtest.mp4', fmt, frame_rate, size) # ライター作成

ret, frame = video.read()
writer.write(frame) # 画像を1フレーム分として書き込み

writer.release() # ファイルを閉じる

「cv2.VideoWriter_fourcc」関数でファイル形式を指定します。大体mp4形式しか使わないとは思います。

「cv2.VideoWriter」関数でファイルとして保存するライターを作成します。第一引数が保存ファイルパス、第二引数がファイル形式、第三引数がフレームレート、第四引数が画面サイズとなっています。

 ライターに1フレーム分として書き込む時は「write」関数の引数に画像を指定してやればOKです。


3:サンプル
 動画の読み込みと保存方法がわかったので適当に元の動画のコピーを作成するサンプルを作りました。

・movieTest.py

import cv2

print("---start---")

#動画ファイルを読み込む
video = cv2.VideoCapture("./movie/test.mp4")

# 幅と高さを取得
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = (width, height)

#総フレーム数を取得
frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))

#フレームレート(1フレームの時間単位はミリ秒)の取得
frame_rate = int(video.get(cv2.CAP_PROP_FPS))

# 保存用
fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
writer = cv2.VideoWriter('./result/outtest.mp4', fmt, frame_rate, size)

for i in range(frame_count):
    ret, frame = video.read()
    ### ここに加工処理などを記述する ###
    writer.write(frame)

writer.release()
video.release()
cv2.destroyAllWindows()

print("---end---")

 以上がOpenCVで動画ファイルの読み込みと保存の方法です。

 動画のファイルを1フレームずつ読み込んだあとに、何かしらの処理をしてライターの引数に渡してやれば動画を加工することもできそうです。動画を扱って何か作ってみるのもいいかもですね。


・参考資料

【Blender】Blender2.8で輪郭線のみを抽出した画像の作成方法

 色々とBlender2.8をいじってみています。

 今回はタイトル通り、Blender2.8で輪郭線のみを抽出していく方法です。

 では始めます。


1:FreeStyleで輪郭線を出す
 対象オブジェクトはなんでもいいのですが、Blender2.8を起動させてとりあえずスザンヌを用意します。
f:id:rikoubou:20190110162713p:plain

 輪郭線を出したい場合は、以下のように「Render」タブを左クリックで開いて一番下にある「FreeStyle」にチェックを入れます。
f:id:rikoubou:20190110163006p:plain

 この状態で上部メニューの「Render」→「Render Image」を選択して画像としてレンダリングしてみます。
f:id:rikoubou:20190110163400p:plain

 以下のように輪郭線がレンダリング時に出ていることがわかります。
f:id:rikoubou:20190110163440p:plain


2:対象オブジェクトを透過させる
 次に対象のオブジェクトを透過します。

 対象のオブジェクトを選択した状態で「Material」タブを左クリックで開き「New」ボタンを左クリックします。
f:id:rikoubou:20190110164414p:plain

 するとMaterialが追加されます。
f:id:rikoubou:20190110164519p:plain

Surface」の項目の中にある「Surface」を左クリックして「Transparent BSDF」を選択します。
f:id:rikoubou:20190110164731p:plain

 その後「Settings」の項目の中にある「Blend Mode」のプルダウンから「Alpha Blend」を選択します。
f:id:rikoubou:20190110175454p:plain

 その状態で画面上部の「Rendered」のボタンを左クリックすると、以下のようにオブジェクトが透明になります。
f:id:rikoubou:20190110175936p:plain

 ここまでできたら、先ほどと同じように画像としてレンダリングしてみると、以下のように輪郭線のみが出力されます。
f:id:rikoubou:20190110180405p:plain


3:背景を透過させる
 背景を透過させておきたい場合もあるので、次はレンダリング時の背景を透過させます。

「Render」タブの「Film」の項目の中にある「Alpha」のプルダウンから「Transparent」を選択します。
f:id:rikoubou:20190110180842p:plainf:id:rikoubou:20190110180911p:plain

 同じように画像としてレンダリングしてみると、イラストソフトなどを使い慣れている方ならわかると思いますが、以下のように背景が透過された画像出力できます。
f:id:rikoubou:20190110181150p:plain

 あとはレンダリングした画面の上部メニューにある「Image」→「Save As...」で画像として保存できます。
f:id:rikoubou:20190110181440p:plain


 以上がBlender2.8で輪郭線のみを抽出した画像の作成方法です。

 イラストの素材にする場合など、色々使えるかと思います。


・参考資料

【Blender/python】Blender2.8でちょっとした自作アドオンを作ってみた

 まだまだリリースは先なBlender2.8ですが、ベータ版が公開されてからはだいぶ安定して使えるようになってきている感じがあります。

 そんな中、ちょっとBlender2.8でアドオンを作ってみるか、と思い立って作ってみたのでその備忘録です。

 基本的にはBlender2.79でアドオンを作ったことある人向けで書きますが、最後にBlender2.79時代のアドオン作成備忘録の記事も載せておくのでわからない場合はそちらも参照してみてください。

 では始めます。


1:Blender2.8のBlender Python API Documentation
 まだ開発中のBlender2.8ですが、アドオンに必要なPython APIについてはほぼほぼ確定しているようです。

 すでにBlender2.8のPython API Documentationができているので、詳しいAPIの内容は以下を参照してください。


2:Blender2.79とBlender2.8でのアドオン記述の違い
 まず前提としてBlender2.79のアドオンはBlender2.8では使えません。
 Blender2.79のアドオンをBlender2.8で使うには必ずプログラムの修正が必要になります。

・2−1:アドオンの情報部分
 アドオンの情報を記述する「bl_info」にある、対応するBlenderのバージョン部分を2.8に合わせた書き方に修正する必要があります。

bl_info = {
    "name": "hogehoge", # アドオン一覧に表示される名前
    "author": "author",  # 作者
    "version": (1, 0), # アドオンのバージョン
    "blender": (2, 80, 0), # 対応するBlenderのバージョン(ここが「(2, 79, 0)」のような記述だとエラーになる)
    "location": "",
    "description": "hogehogehoge", # アドオンの説明
    "warning": "",
    "support": "TESTING", # アドオンの分類
    "wiki_url": "",
    "tracker_url": "",
    "category": "Material" # カテゴリー
}

・2−2:モジュールの登録/解除部分
 Blender2.79までは以下のような書き方でモジュールを登録/解除していました。

・旧モジュール登録/解除

import bpy

# アドオンについての説明
bl_info = {
    # 省略
}

# アドオンのクラス
class Hoge(bpy.types.Operator):
    # 省略

    def execute(self, context):
        # 省略
        return {'FINISHED'}

# メニューを構築する関数
def menu_fn(self, context):
    self.layout.separator()
    self.layout.operator(Hoge.bl_idname)


# アドオン有効化時の処理
def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_object.append(menu_fn)
    print("Add-on:ON")


# アドオン無効化時の処理
def unregister():
    bpy.types.VIEW3D_MT_object.remove(menu_fn)
    bpy.utils.unregister_module(__name__)
    print("Add-on:OFF")

# メイン関数
if __name__ == "__main__":
    register()

 アドオンのクラスを記述したあとに「def menu_fn(self, context):」部分で追加するメニュー部分を、「def register():」でアドオン有効化時の処理、「def unregister():」でアドオン無効化時の処理を記述するという書き方でした。

 Blender2.8ではその記述の仕方が一新され、以下のようにより記述しやすくなりました。

・新モジュール登録/解除

import bpy

# アドオンについての説明
bl_info = {
    "name": "sample: add-onTest",
    "author": "ssss",
    "version": (2, 0),
    "blender": (2, 80, 0),
    "location": "location",
    "description": "sample",
    "warning": "warning",
    "support": "TESTING",
    "wiki_url": "http://hogehoge.com",
    "tracker_url": "http://hogehoge2.com",
    "category": "Object"
}

# UI(ボタンを構築するクラス)
class UI(bpy.types.Panel):
  bl_label = "add sphere panel"
  bl_space_type = "VIEW_3D"
  bl_region_type = "UI"
  
  def draw(self, context):
    self.layout.operator("add_sphere_object.button")

# アドオンのクラス
class AddSphere(bpy.types.Operator):
    bl_idname = "add_sphere_object.button" # ID
    bl_label = "Add Sphere" # メニューに追加されるラベル
    bl_description = "Add Sphere" # 関数の説明
    bl_options = {'REGISTER', 'UNDO'} # 処理の属性

    def execute(self, context):
        bpy.ops.mesh.primitive_ico_sphere_add()
        print("Add Sphere End") # コンソールにログ出力
        self.report({'INFO'}, "Add Sphere End")
        return {'FINISHED'}

# クラスをまとめる
classes = (
  UI,
  AddSphere
)

# まとめたクラスを一度に登録
register, unregister = bpy.utils.register_classes_factory(classes)

 クラスをまとめて「classes = (クラス名, クラス名...)」として、それを「register, unregister = bpy.utils.register_classes_factory(classes)」とすることで一気にクラスを登録します。
 この書き方をすることでかなり短い行数で記述することができるようになっています。

 これらの他にもいくつか変更点があるようですが、全体に影響する大きな変更はこの2点ぐらいです。

 他の変更は以下のページにまとめられているので各自で確認するようにしてください。


3:自作したアドオン
 今回Blender2.8で自作したアドオンは以下になります。アドオンの内容としては「グリースペンシルでのMaterialのStrokeの色をFillの色にコピーする」というものです。
 コピペして「copyStrokeColorToFillColor.py」のファイル名で保存してからアドオンとしてBlenderにインストールすれば使えます。コピペが面倒な場合は記事の後の方でファイルのダウンロードリンクを貼っておくのでそこからダウンロードしてみてください。

・copyStrokeColorToFillColor.py

#
# グリースペンシルのMaterialのStrokeの色を
# Fillの色にコピーするアドオン
#
import bpy

bl_info = {
    "name": "Copy Stroke color to Fill color", # アドオン一覧に表示される名前
    "author": "whip",  # 作者
    "version": (1, 0), # アドオンのバージョン
    "blender": (2, 80, 0), # 対応するBlenderのバージョン
    "location": "",
    "description": "copy Stroke color to Fill color", # アドオンの説明
    "warning": "",
    "support": "TESTING", # アドオンの分類
    "wiki_url": "",
    "tracker_url": "",
    "category": "Material" # カテゴリー
}

# UIに関するクラス
class CopyColorUI(bpy.types.Panel):
  bl_label = "Copy Stroke color to Fill"
  bl_space_type = "PROPERTIES"
  bl_region_type = "WINDOW"
  bl_context = "material"
  
  def draw(self, context):
    self.layout.operator("copy.button") # ボタンを作成

# ボタンに関するクラス
class CopyColor(bpy.types.Operator):
  bl_idname = "copy.button"
  bl_label = "copy color"
  bl_options = {'REGISTER', 'UNDO'} # オブション
  
  # ボタンが押された時に実行される処理
  def execute(self, context):
    # 色をコピー
    lineColor = bpy.context.object.active_material.grease_pencil.color
    bpy.context.object.active_material.grease_pencil.fill_color = lineColor
    self.report({'INFO'}, "copy end") # Blenderのログに出力
    return{'FINISHED'}

# クラスをまとめる
classes = (
  CopyColorUI,
  CopyColor
)

# まとめたクラスを一度に登録
register, unregister = bpy.utils.register_classes_factory(classes)

 アドオンのインストールが済んだら「Preferences」画面の「Add-ons」→「Testing」タブを開くと「Copy Stroke color to Fill color」というのがあるはずなので、それにチェックを入れます。
f:id:rikoubou:20190109173841p:plain

 これでアドオンが有効になります。

 アドオンが有効な状態だと、2D Animationタブを開いた画面の「Material」の項目の最後に「Copy Stroke color to Fill」という項目が追加され、その中に「copy color」ボタンが表示されます。
f:id:rikoubou:20190109174242p:plain

 使い方としては、例えば以下のようにStrokeの色とFillの色が違っている状態でこの「copy color」ボタンを押すとFillの色がStrokeの色と同じになります。(アルファ値も同じになります)
f:id:rikoubou:20190109174648p:plainf:id:rikoubou:20190109174701p:plain


 以上が今回Blender2.8で作成してみたアドオンになります。
 ボタンの追加方法とかはまた色々と面倒になるかと思うので、後々記事にでもしようと思います。

 今回作成したアドオンのファイルは以下からダウンロードできるので、ご自由にどうぞ。


・参考資料


・Blender2.79時代のアドオン関連記事

【Blender】Blender2.8でのアドオン追加方法

 Blender2.8ではUIも色々変わっています。

 基本的にはBlender2.79の時と変わりませんが、今回はBlender2.8でのアドオン追加方法を説明していきます。


・Blender2.8でのアドオン追加方法
 Blender2.8では「Edit」に「Preferences」が移動しているので、「Edit」→「Preferences」を左クリックします。
f:id:rikoubou:20190109175729p:plain

 あとは今まで通り「Add-on」のところを左クリックすると見慣れた画面になります。
 アドオンを追加するには「Install」ボタンを左クリックします。
f:id:rikoubou:20190109181456p:plain

 するとアドオンファイル選択ができるので、ファイルを選択して「Install Add-on from File」ボタンを左クリックします。
f:id:rikoubou:20190109181402p:plain

 インストールできたら一覧にアドオンが追加されているので、対象のアドオンにチェックを入れて有効化します。
 Blenderを再起動させても有効化させたい場合は「Save Preferences」ボタンを左クリックして設定を保存します。
f:id:rikoubou:20190109181702p:plain

 これでアドオンが使えるようになります。


 以上がBlender2.8でのアドオン追加方法です。基本的にはBlender2.79の時代と変わりませんが、UIが全く違っていて戸惑うかと思ったので備忘録として記事にした次第です。