鷲獅子通信

about Blender and modeling

モデリング:男性素体

先日故PCから救出したデータをもとに男性素体を作成しました。


よくあるポージング用のゴム人形みたいで、何かがおかしいのはわかるけどわからんといった状態です。とりあえずいったん完成とします。
次にキャラ作るときに一緒に直していこうと思います。

 

f:id:igogo:20201122221125p:plain

f:id:igogo:20201122220958p:plain

f:id:igogo:20201122221004p:plain

f:id:igogo:20201122221008p:plain

 

読書ログ:『まったくゼロのからの論理学』

大学数学を勉強したいと思ったので、まずは論理学から始めることにしました。

 

野矢茂樹, 2020, 『まったくゼロのからの論理学』, 岩波書店

f:id:igogo:20201122011745p:plain

 

論理学の基礎をわかりやすく(かつ面白く)説明してくれる本です。論理学が何かまったく知らない状態でも1週間ほどで読破できました。どの説明にも例・練習問題がたくさんあるため、自分の理解の仕方であっているかどうかをこまめに確認できます。

この本単体ですぐ何かの役に立つわけではないのですが、次の2冊目の論理学の本を読むときに手元にあると助かりそうです。

論理学をもとに考え方を整理できるようになれば、コーディングで冗長な部分を減らせそうな気がします。(for文の位置・使い方を間違えて余計に回さずにすむようになるとか)

読破メモ

理解したこと・はじめて知ったこと・ひっかかったことなど

  • 演繹(えんえき)と読む(なぜか「えんたく」だと思ってました)
  • ∧:「かつ」の意(入力変換:しゅうごう)
  • ∨:「または」の意(入力変換:または)
  • ⊃:「ならば」の意(入力変換:しゅうごう)
  • ∀:「すべて(All)」の意、Aを逆にした記号(入力変換:すべて)
  • ∃:「存在する(Exist)」の意、は、Eを逆にした記号(入力変換:存在)
  • 「ない(否定), かつ(連言), または(選言)」はコードを書く時の考え方に似ていてすんなり理解できました
  • 逆に「ならば(条件法), すべて, ある(存在する)」については初めて知る考え方で、ちょっと混乱している部分があります。
    問題27「すべての哲学者は怠け者だ」についての、∀x(Fx⊃Gx)や∃x(Fx∧Gx)あたりでよくひっかかりました。
  • 公理系, 定理, 健全性, 完全性, 不完全性公理についてはまったくの未消化です。

    でも「公理系では最初に決めた公理, 推論規則, 定義のみを使って定理を証明する」という部分はなんか面白そうだと思いました。

 

次は位相・集合に関する本を読もうと思います。

G-GEAR Vive推奨モデルPC 内蔵SSD/HDDの吸出し作業

G-GEARのVive推奨モデルから内蔵SSD, HDDを取り外してデータを吸い出した手順の記録です。

 

 

PC詳細:

G-GEAR 「Vive推奨」ゴールドモデル VG7J-B81/T
購入日:2016年7月29日
SSD: 480GB(SanDisk UltraII Series / SATA 6Gbps)
HDD: 1TB SATA 6Gbps対応(東芝製 DT01ABA100V)

f:id:igogo:20201115201847p:plain

 

①PC本体からSSD, HDDを取り外す

  1. 最初に本体右側のカバーを取り外します。
    本体背面のネジ2箇所を外し(画像赤枠)、カバーを背面側にスライドします。
    f:id:igogo:20201115194803p:plain

  2. SSD/HDDが取付されているパネルを外します。
    パネルのネジ3箇所を外し(画像赤枠)、パネルを背面側にスライドします。
    f:id:igogo:20201115194825p:plain

    パネルが外れた様子。ファンとSSD/HDDのケーブルはつながったままです。
    f:id:igogo:20201115194844p:plain

  3. HDDを外す時に邪魔になるため、先に冷却ファンを外します。
    ファンのネジ4箇所を外します。
    f:id:igogo:20201115194908p:plain

  4. SSD/HDDをパネルから取り外します。
    SSDカバーのネジ3箇所(画像赤枠)、HDDカバー側面のネジ4箇所(画像青枠)を外し、矢印の方向にスライドします。
    f:id:igogo:20201115194924p:plain

    SSD/HDDをパネルから外した様子。またケーブルがつながっています。
  5. f:id:igogo:20201115194953p:plain

  6. SSD/HDDからSATAケーブルを取り外します。
    SSD/HDDの面と並行な向きに引っ張ります。
    f:id:igogo:20201115194946p:plain

    これで取り外し作業は完了です。
    f:id:igogo:20201115195413p:plainf:id:igogo:20201115195427p:plain

 

②取り出したSSD, HDDを他PCに接続しデータをコピーする

  1. SSD/HDDアダプタを用意します。
    今回は別のノートPCに移すため、USB3.0対応のLogitecのアダプタを購入しました。
    f:id:igogo:20201115195309p:plain
    f:id:igogo:20201115195330p:plain
    アダプタ詳細:https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%83%86%E3%83%83%E3%82%AF-USB3-0-SATA%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF-%E3%83%87%E3%83%BC%E3%82%BF%E7%A7%BB%E8%A1%8C%E3%82%BD%E3%83%95%E3%83%88-LGB-A35SU3/dp/B077Z81HS9

  2. 他PCにSSD, HDDをアダプタで接続しデータをコピーして完了です。

f:id:igogo:20201115195348p:plain

f:id:igogo:20201115195455p:plain

 

手の検証①

アナトミー勉強シリーズ。

作ったもの

f:id:igogo:20200716090954p:plain f:id:igogo:20200716091000p:plain f:id:igogo:20200716091005p:plain f:id:igogo:20200716091009j:plain

Stefano Lanza さんの手のスケッチの模写
studyt.co

f:id:igogo:20200716090950j:plain f:id:igogo:20200716091014j:plain f:id:igogo:20200716091018j:plain

何もを課題・ゴールとしてつくったか

  • 正しい手の形状を理解する
  • 以下と同様にランドマークが分かる男性手のモデルを作る https://t.co/PcJ8f2u4Ho?amp=1

学んだこと

今回からワークフローに追加です。 - 形状変更にShape Keyを使う - 形状変更にNon DyntopoでSculptを使う
BlenderのSculptはdetailよりもdeform目的で使うのが現状向いてそうですね。
detailはZBrushにおまかせということで...。

胴体の検証①

アナトミーを勉強するため男性トルソをモデリングしました。

作ったもの

f:id:igogo:20200624074241p:plain

f:id:igogo:20200624074246p:plain

f:id:igogo:20200624074252p:plain

f:id:igogo:20200624074226p:plain

f:id:igogo:20200624074231p:plain

f:id:igogo:20200624074236p:plain

何を課題・ゴールとしてつくったか

当初は以下の予定でした。

  • 課題:男性の胴体のアナトミーを確認する
  • ゴール:スカルプト状態で全ランドマークができている
  • やらないこと:美しいトポロジーレンダリング

達成したことは以下の通りです。

  • 課題(達成):男性の胴体のアナトミーを確認した
  • ゴール:トポロジー状態でランドマークのシルエットとフォルムができている
  • やったこと:頑張ったトポロジー、Cyclesによるレンダリング

 予定変更の理由は、意外とWIP画像に反応した方がいらしゃったからです。みんなトポロジーが見たかったのかもしれないと思いトポロジーも真面目に整理しました。△残ってるけど気にしないでね…。

トポロジー

久しぶりに真面目にトポロジーについて考えた気がします。斜めの流れと水平の流れが合流するところでいつも△を消せないんですよね。自分の頭からは解決方法が生まれ無さそうなので他人のモデルを集めて勉強してきます。

今回は途中で線を減らすやり方も復習しました。

f:id:igogo:20200624075810p:plain

Cycles Rendering

以下の動画を参考にしてみました。が、文字が小さいのと、2.7⇔2.8間でVoronoi Textureの仕様が変わったため途中までで終わりました。

まずライトの色や大きさ、背景オブジェクトの設置から何が最適なのかわからず迷います。リグ勉強が終わったら、どこかでまとめてがつんとレンダリングを勉強します。

www.youtube.com

 

 新しく生まれた課題

今回の取り組みで生まれた課題は以下です。

 まとめ

スカルプトを今回で克服できなかったのは残念ですが、アナトミーについて考えるよい時間になりました。ずっとやってみたかったCyclesレンダリングにもとりあえず手出しできました。今のメインの課題はリギング/スキニングですが、他の工程も1つずつ基本を学んで攻略していきたいと思います。

 

次回はリギング記事の予定です。

ワークフロー②_スキニング環境

最近作成したBlenderスキニング環境を紹介します。

一言で説明するとLazyWeightToolアドオンを使います。以上。
で終わるくらいにLazyWeightToolを中心としたフローです。

LazyWeightTool

bookyakuno.com

忘却野さんが販売されているウェイトペイント用のアドオンです。¥1,800。

選択頂点に直接指定した値を設定できるのが便利です。他Operatorや選択のサポートも厚く超救われてます。
スキニングで大事なのは知識よりも優秀なツールを持っているかどうかだと思います。
このアドオンは多くのユーザーを救うと思います。

 

メインフロー

現在はマスクモードとWeight Gradientを中心に組み立てています。

  1. Armature→Meshの順で選択してWeightPaintModeに入る
    (Armatureを選択するのはPoseModeも併用するため)

  2. 頂点マスクモードで頂点を選択する

  3. Weight Gradientを使ってグラデーションを付ける

  4. Normalizeで正規化する

  5. Level(Gain:1.05/0.95)でグラデーションの強さを調整する
     

Workspace

f:id:igogo:20200606115611p:plain 普通の構成です。

  • LazyWeightToolを拡げるために3D Viewportを広く取ります。

  • いくつかポーズを登録しておくとウェイトの確認に便利なためTimelineも。

  • あとは選択オブジェクトを確認するためのOutlinerと、アクティブな頂点グループを確認するためのProperties Shelfです。
     

LazyWeightToolへの機能追加

f:id:igogo:20200606115627p:plain

こちらは少しユニークです。
WeightPaintModeで必要な操作があるため、アドオンとしてまとめて追加しました。
機能は以下の3つです。

Reset Pose

すべてのPoseBoneの変形をリセットします。Weight Paint Modeだと1つずつ選択してAlt+RGSしないといけないので若干面倒でした。

Toggle View

f:id:igogo:20200606115619p:plain Weight Paint Mode時にViewport Shadingをウェイトが塗りやすい設定に変更します。手動で毎回切り替えるのが面倒だったので。

Curve Editor

Draw ToolのCurve Editorです。このカーブはDraw Tool時にしか表示されないので、マスクモード中(Select Tool時)でも操作できるように追加しました。頂点選択→カーブ設定→Weight Gradientを切り替えなしにできて楽です。

コード

だいぶ自分特化なツールですが、必要な方は自由に改造して使ってください。

bl_info = {
    "name": "ui main plus",
    "author": "",
    "version": (0, 0, 1),
    "blender": (2, 82, 0),
    "description": "ui main plus",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "category": "3D View"
}


import bpy


class LAZYWEIGHT_OT_plus_reset_all_pose(bpy.types.Operator):
    bl_idname = "lazyweight.plus_reset_all_pose"
    bl_label = "Lazy Weight Plus "
    bl_description = "Lazy Weight Plus"
    bl_options = {'REGISTER', 'UNDO'}

    @classmethod
    def poll(cls, context):
        return (context.mode == 'PAINT_WEIGHT' and context.active_pose_bone) or (context.mode == 'POSE')

    def execute(self, context):
        bpy.ops.pose.select_all(action='SELECT')
        bpy.ops.pose.transforms_clear()
        bpy.ops.pose.select_all(action='DESELECT')
        return {'FINISHED'}


class LAZYWEIGHT_OT_plus_toggle_view(bpy.types.Operator):
    bl_idname = "lazyweight.toggle_view"
    bl_label = "Lazy Weight Plus "
    bl_description = "Lazy Weight Plus"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        if context.mode == 'PAINT_WEIGHT':
            context.space_data.shading.type = 'WIREFRAME'
            context.scene.tool_settings.vertex_group_user = 'ACTIVE'
            context.space_data.overlay.show_wpaint_contours = True
            context.space_data.shading.show_xray = True
            context.space_data.shading.xray_alpha = 0.9
            context.space_data.shading.xray_alpha_wireframe = 0.95
        else:
            context.space_data.shading.type = 'SOLID'
            context.space_data.shading.light = 'STUDIO'
            context.space_data.shading.show_xray = False

        return {'FINISHED'}


class LAZYWEIGHT_PT_plus_main(bpy.types.Panel):
    bl_label = "Lazy Weight Tool+"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    bl_category = "Item"

    def draw(self, context):
        workspace = context.workspace
        layout = self.layout
        row = layout.row(align=True)
        row.operator(LAZYWEIGHT_OT_plus_reset_all_pose.bl_idname, text="Reset Pose")
        row.operator(LAZYWEIGHT_OT_plus_toggle_view.bl_idname, text="Toggle View")
        
        layout.use_property_split = True
        layout.use_property_decorate = False


class LAZYWEIGHT_PT_plus_curve(bpy.types.Panel):
    bl_label = "Falloff"
    bl_parent_id = "LAZYWEIGHT_PT_plus_main"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    bl_category = "Item"
    bl_options = {'DEFAULT_CLOSED'}

    @classmethod
    def poll(self, context):
        return context.mode == 'PAINT_WEIGHT'

    def draw(self, context):
        layout = self.layout
        settings = context.tool_settings.weight_paint
        brush = settings.brush

        if brush is None:
            return

        col = layout.column(align=True)
        row = col.row(align=True)
        row.prop(brush, "curve_preset", text="")

        if brush.curve_preset == 'CUSTOM':
            layout.template_curve_mapping(brush, "curve", brush=True)

            col = layout.column(align=True)
            row = col.row(align=True)
            row.operator("brush.curve_preset", icon='SMOOTHCURVE', text="").shape = 'SMOOTH'
            row.operator("brush.curve_preset", icon='SPHERECURVE', text="").shape = 'ROUND'
            row.operator("brush.curve_preset", icon='ROOTCURVE', text="").shape = 'ROOT'
            row.operator("brush.curve_preset", icon='SHARPCURVE', text="").shape = 'SHARP'
            row.operator("brush.curve_preset", icon='LINCURVE', text="").shape = 'LINE'
            row.operator("brush.curve_preset", icon='NOCURVE', text="").shape = 'MAX'

        col.separator()
        row = col.row(align=True)
        row.use_property_split = True
        row.use_property_decorate = False
        row.prop(brush, "falloff_shape", expand=True)


classes = (
    LAZYWEIGHT_OT_plus_reset_all_pose,
    LAZYWEIGHT_OT_plus_toggle_view,
    LAZYWEIGHT_PT_plus_main,
    LAZYWEIGHT_PT_plus_curve,
)


def register():
    for i in classes:
        bpy.utils.register_class(i)


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

次回もスキニング関連の予定です。

 

スキニング練習①_Kantoku

某監督のファンアートです。

大黒帽子が似合いすぎてたのと、ちょっとBlenderでやってみたいことがあったので作成しました。

作ったもの

f:id:igogo:20200606090407p:plain

f:id:igogo:20200606090419p:plain

f:id:igogo:20200606090426p:plain

 

何を課題として作ったか

今回の課題は以下2つでした。

  • Blenderのスカルプト機能を使ってみる
  • Blenderでのスキニングフローを作成する
スカルプトについて

Blender内でスカルプト⇔ポリゴンモデリングの連携ができるのは非常に魅力的です。Zbrushがあるからと手を出してませんでしたが、効率化のためにと思い真面目にフローの1つとして取り入れていくことにしました。

スキニングフローについて

最近仕事の方でがっつりBlenderスキニング環境の検証をしたので、実戦で試したいと思っていたのです。今回作成した環境は、スキニングの質というよりは速さを出せることに重点を置きました。

 

やったことと参考にしたもの

スカルプト

Zbrushと感覚が違って難しいです。Dynameshと同じようにほいほいRemesh使ってたらあっという間にBlenderが落ちました。0.2mm辺りが限界です。私はPinch系をよく使うのである程度の密度が必要なのですが。全体Remeshではなく部分Remeshを使うべきなど、何らかの作法を学ぶ必要があるのかもしれません。

まだ適切なBlenderSculptのフローを見つけられていないため、Sculptの優秀なチュートリアルが出てくるのを待っています。

トポロジー

今回は以下2つのやり方を試しました

  • 新規MeshをhighモデルにSnap(面)してポリゴンを作成していく
  • スカルプト前のlowモデルをhighモデルにShrinkWrapして調整する

後者の方が圧倒的に速くて楽でした。アドオンを利用した方法もあるようなので、リトポロジー工程についてはまだまだ研究と改善の余地があります。

予め適切で綺麗なトポロジーの素体を用意しておいて、リトポロジーの時にそれを使いまわせば圧倒的に効率が良いのではと思いました。

参考

【Blender】効率的なリトポワークフロー【アドオンや機能・設定の紹介】 – 忘却まとめ

ベイク

エラーが起きて1日停滞しました。新規で画像を作成する際に、OptionのAlphaをオフ、カラーをNon-Colorにしていなかったため、NormalMapにUVの継ぎ目が表示されていました。

参考

[Blender]NormalMap(ノーマルマップ)をBake(ベイク)する | UndefinedAxis

www.youtube.com

スキニング

f:id:igogo:20200606090413p:plain

今回は特に、紐パーツをどれだけ少ないボーンで曲げられるか、且つそれが実用に耐えうるものなのかをテーマに取り組みました。その結果わかったことは以下です。

  • ウェイトの大きさのカーブが曲線であればメッシュの曲がり方も曲線になる
  • 逆にウェイトの大きさに一定の箇所があればメッシュは曲がらず直線状になり、関節でくの字に折れる
  • 紐のような長物のボーン配置は、メッシュをどのくらい自在に曲げたいか(曲線の起点がいくつか欲しいのか)によって決められる
  • 幅広グラデーションでウェイトを塗ると、他ボーンの縄張りではメッシュの歪みを起こす

 

 新しく生まれた課題

今回の作業中に、以下3つの新たな課題が生まれました。

  • スカルプトのフロー研究
  • トポロジーのフロー作成
  • 更なるスキニング力の向上

上2つが達成できれば作業効率の向上に大いに役立つでしょう。3つ目の選択肢はまだまだ自分に足りていないものです。

 

まとめ

今回はスカルプトとベイクのやり方がちょっとわかって、スキニングの環境が完成したのでよかったかな?もう1体くらいスキニング練習するかもです。

 

次回は作成したスキニング環境を紹介します。