鷲獅子通信

about Blender and modeling

Add-on開発②_Add-on Manager

2つ目のBlenderアドオン、Add-on Managerを公開しました。

https://github.com/3str6/addon_manager

機能についてはREADMEに書いてある通りです。

 

前回のWorkspace Importer, 今回のAdd-on Managerの作成経緯について書きます。

Workspace Importer

github.com

このアドオンは自分が業務でBlenderを使う時用に作成しました。最近Blenderデータをスタッフ間で頻繁にやりとりするのですが、他スタッフのデータを開いた後に画面レイアウト(=Workspace)を毎回自分の作業に適した配置に直すのが地味に面倒くさいんですよね…。

勿論Blenderの機能「UIをロード(Load UI)」をオフにすれば自分のWorkspace設定でデータを開くことができますが、そうすると今度は自分が保存するデータを個別レイアウトで保存できなくなります。他人のデータは自分のレイアウトで開きたい、自分のデータは独自のレイアウトで保存したいというジャイアニズムによって生まれたのがこのアドオンです。

つまりこのアドオン、個人ユーザーにはたぶん全く無意味なんですよね。他の人のBlendデータを開かないなら一生要らないアドオンです...。

 

 Blenderは地味に色んな設定がシステム設定ではなくシーン依存の設定だったりするので戸惑います。まあ常に誰でもそのデータの最適設定で開くことができる、という思想は確かに素晴らしいと思います。データを開いたときに、灰色Tポーズの状態よりレンダリング済みのアクションついた状態を見せられる方が魅力的です。

 

最近の自分のレイアウトはこんな感じです。

Layout(検証用)f:id:igogo:20200524173338j:plain
Modeling

f:id:igogo:20200524173342j:plain

Sculpting

f:id:igogo:20200524173347p:plain

Scripting

f:id:igogo:20200524173352p:plain

 

Add-on Manager

github.com

これもどちらかというと業務用のアドオンです。

業務で使ってるやつはまたちょっとアドオン表示の処理が違います。今回公開している方が汎用性高いです。

 

このアドオンの目的は、自作スクリプトの管理です。

リガーの方はわかると思うのですが、業務でDCCツール使うには作業効率化のためにがんがんコードを書かなくちゃいけないんですよ。手作業は悪い文明。

Blenderでそのスクリプトを動かすのに最適な形なのは、今のところやはりアドオン形式という認識です。もちろんText Editorに張り付けて実行もできますが、BlenderのText Editorは個人的に使いにくいです…。

そしてスクリプトを全部アドオン化していくとBlenderのUIがどんどん埋まっていきます。リギング作業の補助ツールに最適な位置はサイドバーという認識ですが、ここのタブとパネルがじわじわ増えていきます。

 

そのため、アドオンの表示/非表示を手軽に切り替えられるようにしたい→

→でもFilter Add-onsは使いにくいしWorkspace毎の設定である→

→シーン設定の表示/非表示ではなく共通設定の有効化/無効化を切り替えよう...→

の結果としてこのアドオンが生まれました。

 

Filter Add-ons君がもう少し優秀だったらよかったのですが。

開幕Import 〇〇〇シリーズが並んでるのが使い辛いです。だれもWorkspace毎にImport データ形式の表示/非表示なんて設定しないでしょう...。するんですかね?

Filter Add-onsとWorkspaceの検証で確かめた事実は以下です。

・Workspaceの設定はデータに保存される(データ毎の設定である)

・余分なWorkspaceを削除するとデータサイズが小さくなる(784KB→519KB)

・現在activeなWorkspace以外のWorkspaceもデータに保存されている

・Add Workspace > Genaral > ...はそのデータのworkspaceではなく、startupのworkspaceが読み込まれている

・Filtering設定はアドオンの有効化/無効化ではなく表示/非表示を設定している

・Filteringのリストに表示されるのは有効化されたアドオンだけ

・Filtering設定はWorkspace毎の設定である

・大量のアドオンを有効化しているとBlenderの起動が遅くなる(体感)

Filter Add-onsがMode表示ではなくフォルダ事の表示であれば、自作スクリプトの管理にはぴったりでした。こっちもアドオン化するかもしれません。現在のAdd-on Managerは有効化/無効化そのものを操作するため、動作中のアドオンを無効化してしまった時のエラーがちょっと怖いんですよね(Auto Rig Proとか)。

 

終わりに:アドオン開発について

Workspace ImporterもAdd-on Managerも、機能としては小さいしょうもないものです。このアドオン自体を使ってほしいというよりは、似たものを作ろうとしている人のショートカットか踏み台になればなあ、という気持ちで公開しました。私ももっと便利なアドオンが欲しいので...。

これからもそういう気持ちでちょくちょく公開していこうと思っています。

 

また今回のアドオン開発で初めてGitHubに深緑のマークがつきました。人生初のPublic Repositryでもありますし、こういう初めの一歩的なものはなんかちょっと嬉しいです。

f:id:igogo:20200524183414p:plain


6月はモデリングやりつつリギングとスキニングを研究していきます。

 

 

Add-on開発①_restoreWorkspace

業務Blender用にアドオンを作りました。
工数は6時間です。append, link以外で外部の.blendファイルのDataBlockにアクセスする方法が未だにわかりません。 github.com

機能

f:id:igogo:20200517142721p:plain
Add Workspace :現在のシーンにstartup.blendに保存されているWorkspaceを追加します。
Delete Others :現在activeになっている以外のWorkspaceをすべて削除します。

ソースコード

workspace_manager.py

bl_info = {
    "name": "Restore Layout",
    "author": "gogo",
    "version": (0, 0, 1),
    "blender": (2, 82, 0),
    "description": "Restore Layout from startup file.",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "category": "Development"
}

import bpy
from bpy.props import (
    FloatProperty,
    BoolProperty,
    EnumProperty,
    PointerProperty,
    StringProperty,
)
import mathutils
import os


def get_armature_callback(scene, object):
    return object.type == 'ARMATURE'


def get_layout_list_callback(scene, context):
    items = []

    filepath = os.path.join(bpy.utils.resource_path('USER'), "config\\startup.blend")
    # link startup.file
    with bpy.data.libraries.load(filepath, link=True) as (data_from, data_to):
        data_to.workspaces = data_from.workspaces

    for wk in data_to.workspaces:
        items.append((wk, wk, ""))

    return items


class MYWORKSPACE_OT_restore(bpy.types.Operator):
    bl_idname = "myworkspace.restore"
    bl_label = "restore layout "
    bl_description = "restore layout"
    bl_options = {'REGISTER', 'UNDO'}
    
    def execute(self, context):
        
        propGrp = context.scene.mywrkspc

        blendfile = os.path.join(bpy.utils.resource_path('USER'), "config\\startup.blend")
        section = "\\WorkSpace\\"
        wk = propGrp.sWorkspace_list

        filepath  = blendfile + section + wk
        directory = blendfile + section
        filename  = wk

        oldList = [ws.name for ws in bpy.data.workspaces]
        bpy.ops.wm.append(
            filepath=filepath, 
            filename=filename,
            directory=directory
        )
        newList = [ws.name for ws in bpy.data.workspaces]

        if propGrp.bSetActive:
            result = list(set(newList) - set(oldList))
            context.window.workspace = bpy.data.workspaces[result[0]]
        
        return {'FINISHED'}


class MYWORKSPACE_OT_delete(bpy.types.Operator):
    bl_idname = "myworkspace.delete"
    bl_label = "delete layouts "
    bl_description = "delete layouts"
    bl_options = {'REGISTER', 'UNDO'}
    
    
    def execute(self, context):
        propGrp = context.scene.mywrkspc
        bpy.ops.ed.undo_push()
        workspaces = [ws for ws in bpy.data.workspaces if ws != context.workspace]
        bpy.data.batch_remove(ids=workspaces)
        bpy.ops.ed.undo_push()
        
        return {'FINISHED'}


class MYWORKSPACE_PT_restore(bpy.types.Panel):
    bl_idname = "MYWORKSPACE_PT_restore"
    bl_label = "Restore Workspace"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    bl_category = "Tool"

    def draw(self, context):
        layout = self.layout
        propGrp = context.scene.mywrkspc
        layout.prop(propGrp, property="sWorkspace_list", text="Layout")
        layout.prop(propGrp, property="bSetActive", text="Set Active")
        
        layout.operator(MYWORKSPACE_OT_restore.bl_idname, text="Restore")
        layout.operator(MYWORKSPACE_OT_delete.bl_idname, text="Delete Other Layout")


class MYWORKSPACE_Props(bpy.types.PropertyGroup):
    sWorkspace_list: EnumProperty(
        name="Handle Type",
        description="Handle Type",
        items=get_layout_list_callback,
    )
    bSetActive: BoolProperty(
        name="Set Active",
        description="Set the appended workspace active",
        default=True,
    )


classes = (
    MYWORKSPACE_Props,
    MYWORKSPACE_OT_restore,
    MYWORKSPACE_OT_delete,
    MYWORKSPACE_PT_restore,
)


def register():
    for i in classes:
        bpy.utils.register_class(i)
    
    bpy.types.Scene.mywrkspc = PointerProperty(type=MYWORKSPACE_Props)


def unregister():
    del bpy.types.Scene.mywrkspc
    for i in classes:
        bpy.utils.unregister_class(i)

公式の代替機能

  • File > Open... > Option_Load UI
  • Edit > Preferences > File > Load UI
  • Add Workspace...

課題

現在Add, DeleteともにUndo(Ctrl+Z)が効きません。 手動でAppendしたデータもUndoで消せないため、Blenderの仕様という認識です。

頭部の検証②

キャラ作成でまた輪郭に悩んだので模写に挑戦してみました。

模写させて頂いたのはさくらもちさん(https://twitter.com/sakuramochiJP)のキャラです。どのキャラも輪郭がきりっとしててどの角度からでもかっこいいです。

今回は頬下から顎に入るラインと、目から頬にかけての構造、目から鼻先・口先までの構造に注意してみました。

 

参考

https://twitter.com/sakuramochiJP/status/1151923848884834304

結果

f:id:igogo:20200514211325p:plain

f:id:igogo:20200514211349p:plain

f:id:igogo:20200514211407p:plain

f:id:igogo:20200514211343p:plain

f:id:igogo:20200514211332p:plain


気づいたこと

 ・目尻→頬の形状が少しわかった

・目は意外と顔の中に埋まっている

・まぶたは厚めに作ると目っぽくなる

・自分は鼻と口を前に出し過ぎるのでもう少し引いて置く

・まぶたはパックマンみたいな球の形状で作る

・眉間を下げて作るくせがあるので注意

・眉から目尻にかけては頭蓋骨の眼窩を意識する

 

モデリング_zero_T01

VRアバターモデリングtake1(4/25-4/29)の振り返り。

 

作りたいもの

スタイライズドとセルルックの中間くらいのデフォルメモデル。

能面型の造形ではないモデルを作りたい。

 

WIP

f:id:igogo:20200429134754p:plain

f:id:igogo:20200429134805p:plain

f:id:igogo:20200429134717p:plain

f:id:igogo:20200429134728p:plain

f:id:igogo:20200429134737p:plain

f:id:igogo:20200429134743j:plain

 

参考にしたもの

"Positive Thoughts" by Lechar .

https://www.artstation.com/artwork/gJr0km

思い切った輪郭のデフォルメがかっこよい。

GUILTY GEAR Xrd開発スタッフが送るアニメ調キャラモデリングTIPS』by アークシステムワークス株式会社

https://www.slideshare.net/ASW_Yokohama/guilty-gear-xrdtips-124324946

定番。

気づいたこと

  • 顔に違和感があるときは、顔の基本構造を守っていないことが多い
  • 適切にそれっぽく構造を分けられると分かりやすくなる気がする
  • 顔の傾きで正面顔の決まり方が異なる
  • 自分は正面顔の目の見え方を立体としてイメージできていない
  • 目・鼻口・あごのラインで綺麗な三角錐が作れると斜め顔がかっこよくなるかもしれない

 

没にした理由

スタイライズドらしい造形を追うあまり、当初作りたいと考えていた子供らしいまるい輪郭のデフォルメを見失ったため。

 

モデリングする前にやること

  • 正面顔をどの角度で作るのかを決める
  • 正面顔のデザインを画像で作成する
  • 理想とする造形モデルのデータを集める

 

ワークフロー①_作業工程の作成と管理

みんな作業工程の作成と実行ってどうやって管理してるんですかね。

ここで意味する作業工程とは、「○○をやるぞ」→「○○ができた」間までのすべての行動、とします。みんな作業工程をどのように考えだして具体的な作業項目に落とし込み、実行しているんでしょうか。

 

今回はひとまず自分の作業工程管理の方法をまとめます。

 

自分の管理方法

自分は計画立てと実行を同時に行うのが苦手です。

そのためいったん思いつく作業工程を書き出してから、1つずつ実行して完了させる、という作業を繰り返しています。シンプルに書くと以下です。

  • 作業工程を作成し、完了/未完了のチェックを表示する
  • 作業工程は完全ではないため、随時修正・並び替えを行う

具体的なフローは以下です。

  1. Windowsの付箋アプリを呼び出して画面の右上に設置する
  2. やることを□をつけて箇条書きする
  3. 優先度順に並び変えたりネスト(階層化)したりする
  4. 終わったら□を■に変更する
  5. 1~4を繰り返して作業完了まで進める。

f:id:igogo:20200411115447p:plain

画面構成

 

フローの見直し

このフローの良い点は

  • 常に作業工程が視界に入っているので、現在地点と進捗を把握しやすい
  • 付箋アプリは手軽に呼び出したり書き直したりできる

悪い点は

  • チェックマークと階層を手動で入力する必要がある(ショートカットがない)
  • 終了した項目を手動で範囲選択して削除する必要がある

です。まあ手動で□■打つのが結構面倒なんですよね。

 

そもそも作業工程を毎回頭で考えて新規作成していること自体が問題な気もします。

もっとパターン化したら楽になるのかな?まあでも検証期(新しいこと勉強するとき)はどうしても自分で考えて作る必要があるので、今は仕方ないかなと思ってます。

慣れたらちゃんとパターン化したい。

 

次回

作業工程管理に使えるToDoリストのアプリを探す

 

キャラデザ練習②_交通整理員

交通整理員の装備と呼称をまとめる。

色や装備が人によって異なる。ヘルメットにステッカー貼ったり、着崩したり、インナー着たりなど見てて楽しい。

調べたこと

□道路工事中に交通誘導してる人

 =交通整理員

□ヘルメット

 =工事ヘルメット、警備ヘルメット(黄色、白、青)

□ライト

 =ヘッドライト(黒)

□制服

 =作業服(紺、灰緑、黒) 

ライトセーバー

 =誘導棒(赤)

□反射するベストみたいなやつ

 =安全ベスト、反射ベスト(白、蛍光色_黄緑、紺地に白、蛍光色_黄緑)

□手袋

 (白)

□靴

 安全靴、長靴(紺、白、黒)

f:id:igogo:20200402074143p:plain

f:id:igogo:20200402074413p:plain

f:id:igogo:20200402074139p:plain

脚の関節

キャラデザ練習①_髪形の描き方

 

髪をモデリングするの苦手なんですよね。特に短髪。

長髪だと毛束で色々隠せて楽なんですけど、短髪はちゃんと頭蓋骨の形状から考えて髪を配置したり、そもそも配置すべき髪の本数が多かったりでつらいです。

今日は短髪の描き方を練習します。

 

練習テーマ

Faux Hawk, Spiky Headのようにサイドとバックが短くてトップにボリュームがある髪形が好きです。海外デフォルメキャラの1パターンとしてDeviant Artでよく目にします。

後頭部の形状と耳がはっきり見えるところに少年らしさがあって、毛先の描き方で犬みたいなモフモフ感が出せるところが最高です。

 

 

f:id:igogo:20200330001416p:plain

(画像中にFaux Haxkと書いてますが正しくはFaux Hawkです;)

f:id:igogo:20200330001418p:plain

f:id:igogo:20200330001422p:plain

f:id:igogo:20200330001428p:plain



調べたこと:

[髪型の名称]

53 Absolutely Stylish, Trendy, and Cute Boys Hairstyles for 2020
https://www.mens-hairstylists.com/trendy-cute-boys-hairstyles/

Mohawk
Faux Hawk
Undercut Boys Hairstyle
Crew Cut
The Spike, Spiky Hair

 

faux=偽物の、人造の

--------------------------------------------------------------------------------

次:

人体関節について