ニッチなblender手記

世の中には自分に似た人が3人いるとされています。その人達へと情報共有するために主にblenderの記事を書いていきます。

loose read about Sverchok documents (Introduction Unit 00)

Unit 00. Introduction to Blender 2.8+, the NodeView and 3DView

Sverchok Installed, what now?

設定画面のアドオンパネルで Sverchok アドオンパネルのチェックボックスにチェックがついていれば、アドオンは有効になっている。

(Sverchokの) 基本を示すためには NodeView を開いておく必要があり、(結果を確認するために) 3DViewを開いておくと便利になる。

NodeView and 3DView

blender を起動してから Sverchok を立ち上げるためには、以下の手順で専用の View を開く必要がある。

ショートカット設定などで手順を短縮することは可能

  1. Split a View:
  2. Switch a View:
  3. Make a new Tree:
  4. Adding Nodes to the View:

上記の手順は既にインストール手順のページで記載したので割愛。
以下、インストール手順では記載していなかった部分のみを記載していく。

f:id:r9aArrowhead:20201126153733p:plain f:id:r9aArrowhead:20201126153738p:plain f:id:r9aArrowhead:20201126153743p:plain

loose read about Sverchok documents (Basic)

Basics

プログラムでメッシュやジオメトリを作成したことがある方は、このセクションは読み飛ばしても問題はない。
以下の用語の意味がわからない場合は、各項目の説明を参照。

  • List
  • Index
  • Vector
  • Vertex
  • Edge
  • Polygon
  • Normal
  • Transformation
  • Matrix

上記についてはこのページにて説明していく

Sverchokは、幾何学的実体の生成と修正のために以下の用語を使用する。

上記用語については後述する。

List

視覚的なプログラミング言語として、Sverchokはテキストベースのプログラミング言語、特にPythonから多くの用語を借用している。
Sverchokはジオメトリの保存に List を使用する。 リストに格納されたアイテムは 要素(Elements) と呼ばれます。List の各要素には、一意のシーケンシャルインデックスが割り当てられます。

Sverchokpython内で3Dビジュアライズに必要な処理やデータの運用をしているということ。インストール作業でpythonのライブラリを必須とするのはこのため。

私家版解説

blenderが内部で pythonを使っているので、 Sverchok も オブジェクトの頂点管理に pythonList を用いている。 List で管理するとはどういうことかを下図のようなシンプルな板ポリで説明する。

f:id:r9aArrowhead:20201126102818p:plain

図のコンソール画面にあるような形式でジオメトリを管理している。
Sverchok 特有のというよりは、blender によるアドオン開発や python の 仕様上そうなっているという説明。

Index

インデックスを使用すると、リストの特定の要素を素早く参照することができる。 最初の要素のインデックスは0で、最後の要素のインデックスは総要素数から1を引いた値になる。

ちなみに、一番最後を取りたい場合は -1 を指定すれば取得可能

私家版解説

これも Sverchok の解説というよりは、 pythonList の仕様の説明。

blenderでは オブジェクトの頂点は pythonList を利用して構成していることは先に記した。
ここではその List に保存されている特定の頂点だけを取得するにはどうすればよいのかを解説している。

下図のような感じで、 List のインデックスを指定すれば 特定の頂点の情報のみを取得できるこをことを示している。

f:id:r9aArrowhead:20201126102814p:plain

注意:私家版では分かりやすいように頂点を例にして示しているが、 Sverchok はもっと大きな枠を対象として説明している。 blenderでは オブジェクトやマテリアルなども List で管理されている 点には注意。

3D Geometry

Vector

ベクトル (Vector) は知っておくべき最も基本的な要素となる。
ベクトルは、多数のプロパティ(コンポーネントとも呼ばれる)を持つものとして考える。 例えば家の価格は、20以上の異なるプロパティに応じて計算されている:床面積、近所、年齢、任意のリフォーム、部屋、バスルーム、ガレージ... 要は、家はベクターのデータポイントとして見ることができる。

House_one = Vector((floor_space, neighbourhood, age, renovations, rooms, ...))

# or simply
House_one = (floor_space, neighbourhood, age, renovations, rooms, ...)

3D ジオメトリは、主にX, Y, Z, そしてWの少数のコンポーネントの集中している。 3D空間でモデルを拡大縮小したり移動したりしたことがあれば、それらの3Dポイントの位置をベクター数学で計算したことがあるはず。 3D空間の位置や点の概念は、ベクターがもつ特定の状態を説明するめに特別な名前がついているほど重要な概念となっている。 これについての詳細は後述。

ベクトルとベクトルの計算を理解することは、パラメトリックモデリングとジェネラティブデザインの不可欠な部分であり、最初に抱く印象よりも実際は簡単である。 パラメトリックモデリングやジェネラティブデザインを自分で計算する必要はないが、 Sverchok へ作成したい形となるように適切な入力を与える必要がある。 Sverchok を使う点で良いニュースは、どのようなベクター演算がどのような結果をもたらすかを理解することを、観察を通して学び、対話的に実験することで理解することができる点にある。

ベクトルを操作するための様々な方法については、後のパートで説明する。
Sverchok を使ってクールなことをしたいのであれば、時間をかけてベクターベースの数学を理解することに時間を費やす必要がある。

私家版説明

まず、 Sverchokパラメトリックモデリングを旨とするアドオンであるため、大前提として自分が望むデザインを作成したい場合は数学的知識を必要とする。

これが示すところは、数学はよくわからないけど Sverchokパラメトリックモデリングをしたいと考えることは諦めろということ。

それを理解した上で、 Vector を解説。
Vector という要素がいきなりでているが、実はこの項目自身はもっと大雑把な説明でとなっている。

実はここは一言でいうなら python の 変数の説明である。プログラムでいう変数とは何かが分かっている場合はここの説明はむしろ分かりにくいし、数学方面からすればサンプルコードで混乱を招く・・・

ここでいうベクターというのは、数学におけるベクトルとは少しニュアンスが違う。
数学のベクトルというと大体の人が想起するのはが [x=1, y=2] あるいは [x=2, y=4, z=6]のような数値の組み合わせになる。

ここで説明しているベクトルは 色んな種類の要素がいっぱい詰まった箱を Vector と呼ぶ ぐらいのニュアンス。

pythonにはそもそも 数学でいう ベクトル を扱える専用機能はない

House_one = Vector((floor_space, neighbourhood, age, renovations, rooms, ...))

# or simply
House_one = (floor_space, neighbourhood, age, renovations, rooms, ...)

上記のような例を示してくれているが、要素を見れば家の何を示しているのかいまいち見えてこないのが分かる。
家の敷地面積でもなければ、住所でもない、それどころか、floor_space と neighbourhood といった性質が異なる要素をまとめて放り込んでいる。

要は下図のように、ある一つの概念には色んな要素が含まれていることを説明したいのだろう。

f:id:r9aArrowhead:20201126102830p:plain

そして後述で、 3DCGでパラメトリックモデリングをしていく上で特定のオブジェクトを構成するのに必要な要素の説明をしていく文章となっている。

Vertex

頂点は、X,Y,Zの位置を表す3つまたは4つの値で記述された3次元空間内の点。
オプションで設定可能な4番目の値は通常は影響力や重みを表す頂点の特性を表すことができ、Wとして表現する。

最大で(X, Y, Z, W)の 4 つの次元を利用するということ

簡単なPythonの例を見てみると、これが明らかになる。
次のようにすると、3つの頂点を表現することができる。
この場合、各頂点は3つの要素を持っていることとなる。

# 各々が全く関連性を持たない、3つの頂点を表現

v0 = (1.0, 1.0, 0.0) #頂点0 (X=1.0, Y=1.0, Z=0.0)
v1 = (0.5, 0.6, 1.0) #頂点1 (X=0.5, Y=0.6, Z=1.0)
v2 = (0.0, 1.0, 0.0) #頂点2 (X=0.0, Y=1.0, Z=0.0)

オプション指定可能な W に関しては記載されていない。

Blenderのメッシュオブジェクトは、リストに格納された幾何学的なデータを含んでいる。
PythonSverchok では、空のリストは [ ] として表現する。
頂点もリストに格納され、3つの頂点を持つリストは次のようになります。

# blender では一つのメッシュオブジェクトが複数の頂点を持っている場合、下のように配列 (List) として表現する
# この場合は三角ポリゴンを表現する 3 つの頂点を持つことになる
vertices = [
    (1.0, 1.0, 0.0), #頂点0 (X=1.0, Y=1.0, Z=0.0)
    (0.5, 0.6, 1.0), #頂点1 (X=0.5, Y=0.6, Z=1.0)
    (0.0, 1.0, 0.0) #頂点2 (X=0.0, Y=1.0, Z=0.0)
]

私家版説明

cgの頂点情報をプログラム視点で見た場合の解説。

独立した頂点と、1つのメッシュオブジェクトを表現する頂点では Sverchok (= python) での扱い方が違うことを説明している。

なお、ここでは (X, Y, Z, W) があると説明しているにも関わらず W に関する説明はない。
W座標は通常の頂点情報を表現する場合は利用することがないため、ここでは解説していないのだろう。

f:id:r9aArrowhead:20201126102835p:plain

Edges

エッジは2つの頂点間の結合を形成する。
エッジはメッシュオブジェクトに関連付けられたリストにも格納する。
例えば、次の例では、空のリストにエッジを格納していることを表現している。

# 一切のエッジ情報がないメッシュオブジェクトを表現
# このオブジェクトしかビューポート上にない場合は、オブジェクトがないか、頂点しか表示されていないオブジェクトとなる
edges = []

エッジを宣言したい場合は、インデックスでエッジを形成する頂点を参照する。
以下は3つの辺を作成した例。

# 3 つの頂点(頂点0, 頂点1, 頂点2)を用いてエッジを宣言
# 注意点として、それぞれの頂点の座標 (X, Y, Z) は別のところに格納されている
# このコードだけでは 頂点0 - 2 の座標までは分からない
edges = [[0, 1], [1, 2], [2, 0]]

ここでは、リストの中のリストを使ってエッジを分離している。この方法をネスティングと呼ぶ。

私家版説明

ここは Edge が頂点同士をつなげることによってプログラム上で表現されていることを説明している。

最後の ネスティング については vertex の項の説明を引きずっているため分かりにくいが、作者的には下のようになっているんだよと説明したいのだと思う。

# 上のコードを頂点とか絡めて定義すると、以下のようになる
vertices = [
    (1.0, 1.0, 0.0), #頂点0 (X=1.0, Y=1.0, Z=0.0)
    (0.5, 0.6, 1.0), #頂点1 (X=0.5, Y=0.6, Z=1.0)
    (0.0, 1.0, 0.0) #頂点2 (X=0.0, Y=1.0, Z=0.0)
]

# 頂点0から頂点1、頂点1から頂点2、頂点2から頂点0の3つのエッジを宣言
edges = [
    [vertices [0], vertices [1]],
    [vertices [1], vertices [2]],
    [vertices [2], vertices [0]]
]

f:id:r9aArrowhead:20201126102809p:plain

プログラミング界では ネスト構造 といわれる、配列の中に配列が入れ子になっている状態のこと。

Polygons

ポリゴンはエッジと同じ規則で作成されている。 主な違いは、ポリゴンには少なくとも3つのユニークな頂点が含まれていること。
ここでは、3 つまたは 4 つの頂点から作られたポリゴンのみを扱います。

一般的に 3 つの頂点は三角ポリゴン (Tris) 、4 つの頂点なら四角ポリゴン (Quads) と呼ばれる

頂点の総数が6個、最後の頂点のインデックスが5となる頂点群から3つの頂点で構成される多角形を2つを表現するには、下記のようになる。

polygons = [[0, 1, 2], [3, 4, 5]]

Blenderモデリングしていると一つのオブジェクトにTrisとQuadsが混ざるが、Sverchokのジオメトリではそれぞれに別々のリストを作成して、最後にそれらを結合した方が便利になると思う。

最初のSverchokの例のために私たちを設定する例は、次のpyhonのコードです。

# this code can be run from Blender Text Editor and it will generate a Cube.

import bpy

# define vertecies (total : 8 verts, indeies 0 - 7)
verts = [
    ( 1.0, 1.0,-1.0),
    ( 1.0,-1.0,-1.0),
    (-1.0,-1.0,-1.0),
    (-1.0, 1.0,-1.0),
    ( 1.0, 1.0, 1.0),
    ( 1.0,-1.0, 1.0),
    (-1.0,-1.0, 1.0),
    (-1.0, 1.0, 1.0)
]

edges = []  # empty list for now.

# define Quads
# faces member in tuple must set verts index number. this is not python traditional rule only blender.
faces = [
    (0, 1, 2, 3),
    (4, 7, 6, 5),
    (0, 4, 5, 1),
    (1, 5, 6, 2),
    (2, 6, 7, 3),
    (4, 0, 3, 7)
]

mesh_data = bpy.data.meshes.new("cube_mesh_data")
mesh_data.from_pydata(verts, edges, faces)
mesh_data.update()

cube_object = bpy.data.objects.new("Cube_Object", mesh_data)

scene = bpy.context.scene
scene.objects.link(cube_object)
cube_object.select = True

上のコードからジオメトリだけを抽出すれば、残るのは以下のようなコードとなる。

v0 = (1.0, 1.0, -1.0)
v1 = (1.0, -1.0, -1.0)
v2 = (-1.0, -1.0, -1.0)
v3 = (-1.0, 1.0, -1.0)
v4 = (1.0, 1.0, 1.0)
v5 = (1.0, -1.0, 1.0)
v6 = (-1.0, -1.0, 1.0)
v7 = (-1.0, 1.0, 1.0)

vertices = [v0, v1, v2, v3, v4, v5, v6, v7]

polygons = [
    (vertices[0], vertices[1],vertices[2], vertices[3]),
    (vertices[4], vertices[7], vertices[6], vertices[5]),
    (vertices[0], vertices[4], vertices[5], vertices[1]),
    (vertices[1], vertices[5], vertices[6], vertices[2]),
    (vertices[2], vertices[6], vertices[7], vertices[3]),
    (vertices[4], vertices[0], vertices[3], vertices[7])
]

私家版解説

ここでは エッジでの説明の時と同じように、頂点データを使った ポリゴンの表現方法を解説している。

.8x以降はオブジェクトの管理方法が違うのでここで説明されているコードは実はpython 2.7xまでしか通用しない。

vlender 2.8x以降でドキュメントと同じ結果を得たい場合は、以下のコードで実行する必要がある

# this code can be run from Blender Text Editor and it will generate a Cube.

import bpy

# define vertecies (total : 8 verts, indeies 0 - 7)
verts = [
    ( 1.0, 1.0,-1.0),
    ( 1.0,-1.0,-1.0),
    (-1.0,-1.0,-1.0),
    (-1.0, 1.0,-1.0),
    ( 1.0, 1.0, 1.0),
    ( 1.0,-1.0, 1.0),
    (-1.0,-1.0, 1.0),
    (-1.0, 1.0, 1.0)
]

edges = []  # empty list for now.

# define Quads
# faces member in tuple must set verts index number. this is not python traditional rule only blender.
faces = [
    (0, 1, 2, 3),
    (4, 7, 6, 5),
    (0, 4, 5, 1),
    (1, 5, 6, 2),
    (2, 6, 7, 3),
    (4, 0, 3, 7)
]

mesh_data = bpy.data.meshes.new("cube_mesh_data")
mesh_data.from_pydata(verts, edges, faces)
mesh_data.update()

cube_object = bpy.data.objects.new("Cube_Object", mesh_data)

# after blender 2.8x, objects.link must use with bpy.context.collection
# scene = bpy.context.scene
# scene.objects.link(cube_object)
# cube_object.select = True
bpy.context.collection.objects.link(cube_object)
bpy.data.objects['Cube_Object'].select_set(True)

f:id:r9aArrowhead:20201126102824p:plain

Side Effect of Defining Polygons

頂点の連鎖がポリゴンを定義し、各ポリゴンはその境界を構成する辺 (Edge) を持っている。
ポリゴンが 4 つの頂点を持つ場合、同時に4つの辺(または辺)を持つことになる。

参考サイト

Sverchok - Basics

Dive into python - List

Dive into python JP - リスト

忘却まとめ - 【Python入門 01】コピペで覚えるぱいそん【Blender】

loose install about Sverchok in windows10

本題

結構アドオンとしてはすごいんだけど、blenderしか触らない人にはインストールが難しくて最初で挫折しかねない。

f:id:r9aArrowhead:20201119174709p:plain

ここでは、使い方ではなく、Windows上での Sverchok のインストール方法を記載する。

lilnux とか Mac を使っている人は普段からコンソール使ってるし説明いらないだろの精神

Sverchokとは

パラメトリックモデリングしたりできるすんごいアドオン。
パラメトリックと聞くと分かりにくいかもしれないが、 blender上のモデリング操作をほぼ全てノードだけでできる と言い換えるとなんとなく分かるかもしれない。

分かる人には animation node のモデリング版と言えば分かるだろうか?

利用したソフトウェア

win64blender portable version:2.9.0.1

Sverchok:0.6.0.0

FreeCAD:PY3.7-win

参照

Github - Sverchok

Doc - Sverchok

Github - FreeCAD

手順

先に詳細を無視して結論だけ記載する

手順まとめ

  • blender portable version を windows上に解凍し、利用可能な状態にしておく
  • github から Sverchok の圧縮ファイルをダウンロードする
    • git使い慣れている人はgitをつかってクローンしてもいいが、ここではそういうのが苦手な人でもできる方法を対象とする
  • blender に Sverchok をアドオンとしてインストールする
  • Sverchok のための python 環境設定
    • windowsのコンソール画面でpythonの操作を行い、Sverchok が利用するソフトを blenderが利用しているpython へインストールする
  • freeCADをダウンロード、圧縮ファイルの解凍
  • blenderへインストールした Sverchok のアドオン設定画面で、 freeCAD へのパスを通す

うん、分かりにくいね

手順(イージーモード)

上の説明だけ見て分かる人はそもそもこんなこと調べないので、手順を追いながら説明していく。

blender portable version を windows上に解凍し、利用可能な状態にしておく

流石にこれは説明しなくてもいいと思うので割愛。

github から Sverchok の圧縮ファイルをダウンロードする

Github - Sverchok から、アドオンの圧縮ファイルをダウンロードする

f:id:r9aArrowhead:20201119174627p:plain

blender に Sverchok をアドオンとしてインストールする

ダウンロードしたファイルを blender のアドオン画面からインストールする。
これもまあ割愛できると思うので割愛。

Sverchok のための python 環境設定

github - Sverchok installation

上を読んで分かる人はそれでOK。以降は上の説明が分からない人向け。

blenderのポータブル版は、 blenderフォルダの中に python 環境もセットで入っている。

C:\work\blender-2.90.1-windows64\2.90\python という感じ

パーソナル版のblenderを利用する場合は、このblenderフォルダ内にあるpythonの環境を設定する必要がある。
そして、pythonをあまり知らない人にはこのpythonへの設定が一番のネックとなるので、ここからはそれを記述する。

python 触ったことある人なら、pyenvとか使いたいとか思うかもしれない

まず、windows のコンソール画面を開く。

分からない人は windows コマンドプロンプト とか windows powershell とかでググると出てくる

f:id:r9aArrowhead:20201119174646p:plain

Install pip

pip という、pythonでいうアドオン機能をインストールしてくれたりする機能をまずはインストールする。

コンソール画面で ポータブル版 blender をインストールしたパス を指定して、インストールコマンドを実行する。

/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m ensurepip
/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m pip install --upgrade pip setuptools wheel

# 例
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m ensurepip
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m pip install --upgrade pip setuptools wheel

これで pip のインストールが完了する。

この時、 下図のようなエラーが環境によっては発生する。

f:id:r9aArrowhead:20201120092911p:plain

このエラーの原因は、既に古いバージョンの pip がインストールされているが、最新版に更新できなかったために発生する。
この問題を解決するには、やはりまず古いバージョンを削除して、最新バージョンをクリーンインストールする必要がある。

/ポータブル版blenderのroot/2.xx/python/bin/python.exe  -m pip uninstall pip
/ポータブル版blenderのroot/2.xx/python/bin/python.exe  -m ensurepip
/ポータブル版blenderのroot/2.xx/python/bin/python.exe  -m pip install -U pip

# 例
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe  -m pip uninstall pip
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe  -m ensurepip
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe  -m pip install -U pip

f:id:r9aArrowhead:20201120093116p:plain

Install SciPy

次に SciPy という python で数学や物理でよく使う計算をしやすくするためのライブラリをインストールする。

/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m pip install -U scipy

# 例
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m pip install -U scipy
Install SciKit-Image

次に SciKit-Image という画像処理ライブラリをインストールする。

/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m pip install -U scikit-image

# 例
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m pip install -U scikit-image

ここでも、インストール時にpythonがエラーを表示することがある。

f:id:r9aArrowhead:20201120093435p:plain

これは既にインストールされている Pillow というライブラリが古いバージョンなので、最新版を要求する警告。
警告に従って、最新版を入れなおせばOK。

/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m pip install -U scikit-image

# 例
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m pip install -U scikit-image

f:id:r9aArrowhead:20201120093440p:plain

f:id:r9aArrowhead:20201120093447p:plain

Install Circlify

次に Circlify という円の計算、描画ライブラリをインストールする。

# バージョン指定してインストール。バージョンは警告で指定されたバージョンを記述する
/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m pip install Pillow==6.2.0

# 例
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m pip install Pillow==6.2.0
Install PyMCubes

次に PyMCubes というマーチングキューブ法に必要なライブラリをいインストールする。

# まずはCythonというpython上でC言語を実行するためのライブラリをインストールする
# これを実行するとコンソール画面に Warning が表示されるが、このワーニングはPATH変数に設定しろという内容うなので、無視してかまわない
/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m pip install -U Cython

# PyMCubesのインストール
/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m pip install -U PyMCubes

# 例
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m pip install -U Cython
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m pip install -U PyMCubes
Install Geomdl

次に Geomdl という python で NURBSやスプラインを利用するためのライブラリをインストールする。

Sverchok のドキュメントには2つのインストールコマンドが記載されているが、ここでは処理速度が速くなるように Cython を使って処理するインストール方法を選択した。

/ポータブル版blenderのroot/2.xx/python/bin/python.exe -m pip install geomdl --install-option="--use-cython"

# 例
# C:\work\blender-2.90.1-windows64\2.90\python\bin\python.exe -m pip install geomdl --install-option="--use-cython"

ここまでできればblender が使う python の環境セットアップは完了した

freeCADをダウンロード、圧縮ファイルの解凍

FreeCAD - Win Py3.7 packaging experiments から conda-0.18.3.7z をダウンロード。

f:id:r9aArrowhead:20201119174614p:plain f:id:r9aArrowhead:20201119174621p:plain f:id:r9aArrowhead:20201119174607p:plain

ダウンロードが終わったら、圧縮ファイルを解凍する。
bin/FreeCAD.exe があることを確認する。

Install FreeCAD py3lib

blender の Sverchok アドオン画面で、 ダウンロードした FreeCAD のexeファイルがある場所を指定して、 Set Path ボタンを押下する。

その後blenderを再起動すると blender 起動時に Sverchok の初期化処理も実行されて、晴れて Sverchok を利用可能となる。

f:id:r9aArrowhead:20201119174634p:plain f:id:r9aArrowhead:20201119174651p:plain f:id:r9aArrowhead:20201119174656p:plain f:id:r9aArrowhead:20201119174703p:plain f:id:r9aArrowhead:20201119174709p:plain

loose usage about hardOps (dice)

dice

Hard Ops 984.1 Neodymium - Dice

新しく実装された機能。
ループカットに近い機能で、 ループカット + α な機能。

基本操作

dice 機能を呼びだすには、 Q キーによるコンテクストメニューか Shift + Q による hardOps のパイメニューから diceを選択する。

f:id:r9aArrowhead:20201111120727p:plain

f:id:r9aArrowhead:20201111120732p:plain

f:id:r9aArrowhead:20201111120737p:plain

f:id:r9aArrowhead:20201111120742p:plain

f:id:r9aArrowhead:20201111120748p:plain

f:id:r9aArrowhead:20201111120753p:plain

diceの処理方式について

オブジェクトに対してdice処理を行う時、ベースとなる処理方法は以下の2通り存在する。

  • Knife Project (default)
  • Boolean Intersect

これらは メッシュのカットに Knifeを使うか、 boolean を使うか の違いとなっている。
メリット・デメリットはそれぞれ元の処理に依存するが、基本的に Knife で問題はない。

処理方式による差異

結果が同じようになるのなら、そもそも何が違うのかという問題が残る。

結論からいうと、 booleanは中間処理が存在する につきる。

実験に用いた構成は下図となる。

f:id:r9aArrowhead:20201111121017p:plain

これをまずは Knife Project モードで dice 処理する。

f:id:r9aArrowhead:20201111121024p:plain

f:id:r9aArrowhead:20201111121029p:plain

次に Boolean Intersect で処理する。

f:id:r9aArrowhead:20201111121035p:plain

f:id:r9aArrowhead:20201111121040p:plain

パッと見に結果は変わらない。しかし、 Boolean Intersect で処理したオブジェクトには変なゴミが残っていた。

f:id:r9aArrowhead:20201111121045p:plain

このゴミがどこから来たのか疑問に思っていると、上図の Outliner に Cutters コレクションができていることに気が付いた。
この Cutters コレクションは dice 処理中のオプション Create cutters but don't perform cut を選択した時も同じ結果になる。
つまり、 Boolean Intersect では Create cutters but don't perform cut のような中間処理が発生しているということになる。

これと同じ結果になる操作方法は以下の通り。

  • dice selected by Create cutters but don't perform cut
  • boolean: Knife

f:id:r9aArrowhead:20201111121050p:plain

f:id:r9aArrowhead:20201111121057p:plain

f:id:r9aArrowhead:20201111121103p:plain

f:id:r9aArrowhead:20201111121109p:plain

f:id:r9aArrowhead:20201111120722p:plain

この時に利用したバージョンは2.85.3だが、blender の boolean 処理はバージョン2.91で改善されている。2.91対応で実施した場合は結果も変わっている可能性がある。(後日確認予定

dice のオプション

diceを実行する時にも、操作オプションがいくつか存在する。
diceの操作オプション変更は以下の2通りで設定可能。

  • Hops Helper で設定する
  • dice 実行中に HUDから選択する

Hops Helper で設定する方法

f:id:r9aArrowhead:20201111120758p:plain

dice 実行中に HUDから選択する方法

f:id:r9aArrowhead:20201111120805p:plain

Toggle viewport rendering (O)

f:id:r9aArrowhead:20201111120833p:plain

f:id:r9aArrowhead:20201111120839p:plain

Toggle mods list (M)

f:id:r9aArrowhead:20201111120847p:plain

Show Wire (W)

f:id:r9aArrowhead:20201111120854p:plain

Smart Apply (S)

f:id:r9aArrowhead:20201111120859p:plain

f:id:r9aArrowhead:20201111120905p:plain

Twist / Smart Apply(T)

f:id:r9aArrowhead:20201111120912p:plain

f:id:r9aArrowhead:20201111120918p:plain

Adjust Segments (Shift + S)

f:id:r9aArrowhead:20201111120930p:plain

Toggle dicing per axis (X, Y, Z)

f:id:r9aArrowhead:20201111120934p:plain

f:id:r9aArrowhead:20201111120939p:plain

Create cutters but don't perform cut

f:id:r9aArrowhead:20201111120945p:plain

f:id:r9aArrowhead:20201111120949p:plain

f:id:r9aArrowhead:20201111120954p:plain

f:id:r9aArrowhead:20201111120959p:plain

f:id:r9aArrowhead:20201111121005p:plain

f:id:r9aArrowhead:20201111121010p:plain

dice の実行時オプション

f:id:r9aArrowhead:20201111120811p:plain

Dice on all axis

f:id:r9aArrowhead:20201111120816p:plain

f:id:r9aArrowhead:20201111120821p:plain

f:id:r9aArrowhead:20201111120827p:plain

create Quad Sphere by Machine3Tools

クアッドポリのみの球体オブジェクト追加機能

Machine3Tools をインストールすると、オブジェクトの新規作成に Quad Sphere が追加されている。

f:id:r9aArrowhead:20201110111013p:plain

f:id:r9aArrowhead:20201110111018p:plain

f:id:r9aArrowhead:20201110111023p:plain

この機能の便利なところは、 歪みがない球体として作成してくれるところにある。
下図のように、単純に Sub-D を利用しただけの球体ではオブジェクトの歪みが発生する。
マニュアル操作で同じような球体を作ろうとすると後処理の Cast モディファイアを適用する必要があるが、 Quad Sphere で作成したオブジェクトはどうやらここまでの処理を一括でしてくれているようできれいな球面の四角ポリゴンを作成してくれている。

f:id:r9aArrowhead:20201110111003p:plain

f:id:r9aArrowhead:20201110111008p:plain

loose usage about hardOps (hops sort tests)

主旨

hardOps の hops sort 機能の挙動が気になったのでテストしてみた結果の記事です。

本編はこっち

minorblender.hatenablog.com

ソートルール実験

読んでもルールが分からないので、観察してみることに。
観察方法は パターン網羅 で行う。
全て off の場合はソートなしと同じなので、まずは当然のように全ての条件を on にする。

テストケース1:全部のせパターン(昇順)

まずは全てのモディファイアを、 オプション設定の順序に沿って 積み上げる

f:id:r9aArrowhead:20201014140904p:plain

f:id:r9aArrowhead:20201014140910p:plain

f:id:r9aArrowhead:20201014140922p:plain

f:id:r9aArrowhead:20201014140928p:plain

f:id:r9aArrowhead:20201014140935p:plain

処理前後のスタック部分だけ抜粋。

f:id:r9aArrowhead:20201014140944p:plain

f:id:r9aArrowhead:20201014140940p:plain

上の結果から確実に判明した部分だけを記載すると、以下の通り。

  • Cast モディファイアは HardOps経由のboolean を実行すると、最初に実行する
  • boolean モディファイアは Cast モディファイアよりも後に実行する
  • Sort と Sort Lastに指定したモディファイアは、boolean モディファイアの後へとソートされている
  • Weight Normal モディファイアは最後に実行する

その他にはソートや Last Sortの On / Offで変わる可能性はあるが、全部のせからは判断できない。

テストパターン2:全部のせパターン(降順)

次は全てのモディファイアを、 オプション設定とは逆の順序に沿って 積み上げる。

f:id:r9aArrowhead:20201014140949p:plain

f:id:r9aArrowhead:20201014140955p:plain

f:id:r9aArrowhead:20201014141001p:plain

処理前後の比較

f:id:r9aArrowhead:20201014141011p:plain

f:id:r9aArrowhead:20201014141006p:plain

上の結果から確実に判明した部分だけを記載すると、以下の通り。

  • Cast モディファイアは HardOps経由のboolean を実行すると、最初に実行する
  • boolean モディファイアは Cast モディファイアよりも後に実行する
  • Sort と Sort Lastに指定したモディファイアは、boolean モディファイアの後へとソートされている
  • Weight Normal モディファイアは最後に実行する

テストパターン3:Arrayのみソート(昇順)

まずは Sort Modifier のみ確認していく。

array のソートについては以下の法則が記述されている。

sort array - ensures array is last so it shows booleans in all subparts

では実験

f:id:r9aArrowhead:20201014141016p:plain

f:id:r9aArrowhead:20201014141022p:plain

f:id:r9aArrowhead:20201014141032p:plain

f:id:r9aArrowhead:20201014141028p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • Array モディファイアは Sort と Sort Last の影響を受けて 後ろにソートされた
    • Sort Last を選択したモディファイアであっても、必ず最後になるわけではない
  • Weight Normal モディファイアは最後に実行する

テストパターン4:Arrayのみソート(降順)

テストパターン3とはモディファイアの順序を逆にして実行する。

f:id:r9aArrowhead:20201014141037p:plain

f:id:r9aArrowhead:20201014141045p:plain

f:id:r9aArrowhead:20201014141055p:plain

f:id:r9aArrowhead:20201014141050p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • Array モディファイアは Sort と Sort Last の影響を受けて 後ろにソートされた
    • Sort Last を選択したモディファイアであっても、必ず最後になるわけではない
  • Weight Normal モディファイアは最後に実行する

テストパターン5:Arrayのみソートで Sort Lastはしない(昇順)

次は Sort Last を外して Sort Modifier だけの状態にした Array モディファイアを確認していく。

f:id:r9aArrowhead:20201014141100p:plain

f:id:r9aArrowhead:20201014141107p:plain

f:id:r9aArrowhead:20201014141118p:plain

f:id:r9aArrowhead:20201014141112p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • Weight Normal モディファイアは最後に実行する

挙動から不明な点が一つ

  • Sort Last を選択していないにも関わらず、 Sort 対象となった Array モディファイアが後ろにソートされた
    • HardOpsの Array ソートルールに従えばあっているようにも見えるが・・・?

テストパターン6:Arrayのみソートで Sort Lastはしない(降順)

次は テストパターン5の逆パターン。

f:id:r9aArrowhead:20201014141122p:plain

f:id:r9aArrowhead:20201014141129p:plain

f:id:r9aArrowhead:20201014141140p:plain

f:id:r9aArrowhead:20201014141135p:plain

処理前後から確実に分かる内容は以下の通り(テストパターン5と同じ)

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • Weight Normal モディファイアは最後に実行する

挙動から不明な点が一つ(テストパターン5と同じ)

  • Sort Last を選択していないにも関わらず、 Sort 対象となった Array モディファイアが後ろにソートされた
    • HardOpsの Array ソートルールに従えばあっているようにも見えるが・・・?

テストパターン7:全てのモディファイアをソートし、 全てのモディファイアのSort Lastはしない(昇順)

テストパターン5およびテストパターン6で発生した不明点の確認ケース。
全てのモディファイアをソートする条件下でもArray モディファイアがWeigh Normal を除いた最後へと配置されるのかテスト。

f:id:r9aArrowhead:20201014141145p:plain

f:id:r9aArrowhead:20201014141152p:plain

f:id:r9aArrowhead:20201014141202p:plain

f:id:r9aArrowhead:20201014141158p:plain

処理前後から確実に分かる内容は以下の通り(テストパターン6と同じ)

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • ソートを選択したモディファイアは全て後ろにソートされた
  • Weight Normal モディファイアは最後に実行する

ここまでから推測できる内容は以下の通り

  • boolean を実行すると、 booleanモディファイアを一番最後に配置する
    • これはblenderの通常仕様と同等なので、仕様通り
  • boolean を実行した際、 Cast モディファイアがあればそれをbooleanの直前へ並び替える
    • これは HardOps のソートルール通り
  • Sort Modifier でソートを On にしているモディファイアは、 boolean の後へと回される
    • テストパターン5、テストパターン6、テストパターン7の結果から判断
    • ソート対象とした場合とそうでない場合で boolean 実行後の並び順が変わったため

テストパターン8:Sort 設定の奇数は On、偶数は Offにする、全てのモディファイアのSort Lastはしない(昇順)

テストパターン7から、ソートは モディファイアに関係なく Onならば booleanの後、Offならば移動なし となるのではないかと推測したためテスト。

ちなみに奇数をOn にしたのは、Weight Normalが偶数番号の設定だったため。 これをoff に含めた場合も順番はそのままか見たかった。

f:id:r9aArrowhead:20201014141206p:plain

f:id:r9aArrowhead:20201014141212p:plain

f:id:r9aArrowhead:20201014141222p:plain

f:id:r9aArrowhead:20201014141218p:plain

処理前後から確実に分かる内容は以下の通り(テストパターン6と同じ)

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • ソートを選択したモディファイアは全て後ろにソートされた
    • このことから、 Sortで選択したモディファイアは、 boolean モディファイアの後へソートされる と分かる
  • Weight Normal モディファイアは最後に実行する
    • Sort の選択 On / Off には関わらない

テストパターン9:全てのモディファイアをソートし、 全てのモディファイアのSort Lastはしない(順不同)

これまでのテストから、ソートを on にしたモディファイアは boolean 実行後、 boolean モディファイアの後ろにソートされるのが分かっている。
しかし、複数の対象が存在する状態でソートを実行した時に、モディファイアの並び順は実行前と同じであるかは観察できていない。

このテストパターンでは、それを確認する。

f:id:r9aArrowhead:20201014144725p:plain

f:id:r9aArrowhead:20201014144730p:plain

f:id:r9aArrowhead:20201014144739p:plain

f:id:r9aArrowhead:20201014144735p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • ソートを選択したモディファイアは全て後ろにソートされた
    • このことから、 Sortで選択したモディファイアは、 boolean モディファイアの後へソートされる と分かる
  • Weight Normal モディファイアは最後に実行する
    • Sort の選択 On / Off には関わらない
  • Cast, Weight Normal といった特殊なルールに従うモディファイアを除き、ソートを選択したモディファイアはソート前の順序を守っている
    • このことから、パネルの並びと実際のモディファイアの並びに関連性はないことが分かる

テストパターン10:Sort Modifier を Offにした上で全てのモディファイアをSort 設定をonにし、 全てのモディファイアのSort LastをOnにする(昇順)

ここまでのテストで、 Weight Normal モディファイアはソートの On / Off に関わらず、boolean 実行後は最後にソートされる ことが分かっている。

しかしこれまでは ソートの Off はパネルのみで実行してきた。
ソートを Off にする方法は Sort Modifier のチェックボックスを Off にすることでも選択できる。

このテストパターンでは、 Sort Modifier のチェックボックスを Off にした状態を観察する。
ただし、通常のUI設計から考えれば親元の sort modifiers の on にしなければ 詳細設定は参照しないはずなので、詳細設定側は全て On にする。

設定から考えれば、チェックボックス Off でもWeight Normal がソートされた場合はバグに近いわけだけど・・・

f:id:r9aArrowhead:20201014144744p:plain

f:id:r9aArrowhead:20201014144749p:plain

f:id:r9aArrowhead:20201014144753p:plain

f:id:r9aArrowhead:20201014144802p:plain

f:id:r9aArrowhead:20201014144758p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • 詳細設定で全て ON にしていたソートは、 一部の例外を除いて Sort Modifiers をOff にすると実行されない
  • sort modifiers の選択 On / Off には関わらず、Weight Normal モディファイアは最後に実行する

テストパターン11:Sort Modifier を Offにした上で全てのモディファイアをSort 設定をoffにし、 全てのモディファイアのSort LastをOffにする(昇順)

テストパターン10の結果が予想と大きく異なっているため、それの確認を行うテスト。

UI設計的には親の設定の On / Off があれば子の設定はそれに影響を受ける。
しかし、Cast および Weight Normal モディファイアは Sort Modifiers の設定に関わらずソートが発生した。

ここでのテストは、子の設定も全て off にしても上記2つのモディファイアはソートが発生するかの確認を行うためのテストとなる。

f:id:r9aArrowhead:20201014144806p:plain

f:id:r9aArrowhead:20201014144812p:plain

f:id:r9aArrowhead:20201014144817p:plain

f:id:r9aArrowhead:20201014144827p:plain

f:id:r9aArrowhead:20201014144823p:plain

処理前後から確実に分かる内容は以下の通り

  • Cast モディファイアは Sort に関わらず HardOps経由のboolean の前に配置された
  • 詳細設定で全て Off にしていたソートは、 一部の例外を除いて Sort Modifiers をOff にすると実行されない
  • sort modifiers の選択 On / Off には関わらず、Weight Normal モディファイアは最後に実行する

テストパターン12:全てのモディファイアが必ず複数個存在し、全てのモディファイアをソートし、 全てのモディファイアのSort Lastをする(昇順)

ここからは別パターンのテスト。
ソートの対象となるモディファイアが複数個存在した場合、ソートはどのような挙動をするかのテスト。

f:id:r9aArrowhead:20201014144831p:plain

f:id:r9aArrowhead:20201014144837p:plain

f:id:r9aArrowhead:20201014144847p:plain

f:id:r9aArrowhead:20201014144843p:plain

処理前後から確実に分かる内容は以下の通り

  • 多重化しているモディファイアは、一つだけがソートの対象となる
  • sort modifiers の選択 On / Off には関わらず、Weight Normal モディファイアは最後に実行する
    • このモディファイアのみ、多重化は関係ない。 存在する全ての Weight Normal モディファイアは最後に回される

もしかすると、モディファイアのスタック内に同一種が複数あることは想定していない?

loose usage about hardOps (install, SSharp, CSharp)

注意

現在進行形で記事更新中

この記事はまだ調査中の内容を含んでいるが、モチベと記憶のキューから飛び出さない内に現在までで調査した内容をメモとして残す。

概要

一言で言えば ハードサーフェイスモデリングでよく使う処理を簡略化してくれる アドオン。

そのため、ブーリアンモデリング処理やエッジ処理に特化している。
同じ作者が公開している boxcutter とは機能を相互補完するが、それぞれ単品でも操作に不自由はない。

とはいうものの、二つセットでバンドル販売されているので資金的に余裕があるなら買って損はしない。 少なくとも boxcutterの購入によって、本アドオンの CSharp 機能の利便性はかなり変わる。

注意

これは hardops の全機能を網羅的に紹介するものではなく、基本的な操作方法をその設定内容のみ記載している。
また、ブーリアンモデリングやハードサーフェイスモデリングの手法についても記載はしない。

もしこの記事を見てより高度な操作を覚えたいという場合は下記の公式リンクや紹介動画を参照することをお勧めする。

利用バージョン

0.9.86.17 (MercuryX)

販売サイト

Gumroad - Hard Ops / Boxcutter Ultimate Bundle (2.8)

Blender Market - Hard Ops / Boxcutter Ultimate Bundle

HardOps と BoxCutterのバンドル販売。個別に購入するより安く購入できる

Gumroad - HardOps

Blender Market - HardOps

参照

公式ドキュメント

youtube - HOPSCutter

利点

  • アドオンとしての歴史が長いため、基本的な操作が非常に安定している
  • ブーリアンモデリングとハードサーフェイスモデリングに必要な手続きをほぼ網羅しているため、細々としたアドオンを入れる必要がなくなる。
  • アップデートペースが早いため、最新のblender(β版にさえ)対応する
  • boolやエッジ関係の処理を一括でやってくれるので、モデリングが捗る

欠点

  • オーガニックなモデリングのアドオンとしては向かない
  • 開発者によって改良が進んでいるため、機能の追加や修正が頻繁に行われている。一見欠点のように思えないかもしれないが、頻繁なアップデートは追加・修正・削除される操作も頻繁であるためある日突然操作が変わる可能性が大きくなる
  • もはやアドオンというよりはプラグインとかblenderのフォーク版みたいな操作性となっていて、バニラ状態のblenderから大きくワークフローが変わる
  • 色んな操作をワンステップにまとめているため、本アドオンを使い慣れるとアドオンが入っていない環境で作業する際には混乱するかもしれない

その他

ツールの内容とか説明そのものではないが、 公式ドキュメント - Boolean Tipsブーリアンモデリングのコツを記載しているので一読の価値がある。

基本操作

起動方法

f:id:r9aArrowhead:20201014141551p:plain

f:id:r9aArrowhead:20201014141556p:plain

f:id:r9aArrowhead:20201014141601p:plain

f:id:r9aArrowhead:20201014141606p:plain

f:id:r9aArrowhead:20201014141611p:plain

f:id:r9aArrowhead:20201014141617p:plain

f:id:r9aArrowhead:20201014141622p:plain

f:id:r9aArrowhead:20201014141628p:plain

f:id:r9aArrowhead:20201014141633p:plain

Sharpening

hardops のシャープ処理は SSharp CSharp に大別できる。

blender固有の用語ではないので先にこれらの違いを書くと、それぞれが以下の役割となる。

  • Sharp : shortened Sharp。お手軽シャープ処理。Shading のシャープ処理。だから S(hading) Sharp
  • CSharp: コーナーのシャープ処理。だから C(orner) Sharp

SSharp と CSharp の大まかな処理の差異

双方の処理の説明が長くなるので、先に両者の差異を記載する。

共通の注意事項

どちらも処理実行後は少なからずメッシュが破壊される

これは hardops の Sharpennig がオブジェクトに対してではなく、メッシュに対して実行する仕様となっているため。 完全な非破壊作業とはならないので、特にブーリアンモデリングで作業している時は実行タイミングに注意すること。

シーケンス

以下の設定は SSharp CSharp 共に共通の設定となっており、処理内容も共通している。

  • Additive Mode
  • Sharpness
  • Global
  • Auto Smooth Angle

上記の共通処理については 本家に処理シーケンスが記載されているので、まずは原文を引用する。

  1. sharpness
  2. edge angle to witch sharpening is applied - default 30
  3. auto smooth angle
  4. value for autosmoouth angle for selected object - default
  5. additive mode
  6. ON - apply defined sharpness and keeps other already existing sharp edges
  7. OFF - clears all sharp edges before applying its own sharpness
  8. global
  9. ON - ensures the options set here will be repeated next time
  10. OFF - uncheck this to use these setting only once this instance.

日本語的には以下のようになる。なお、固有名称のそれぞれの挙動については後述。

  1. SSharp or CSharp実行
    1. それぞれの処理については、後述
  2. エッジ角度がプロパティの Sharpness に設定している角度以上の場合は エッジ立てるための設定を追加する
  3. オートスムージング実行
    1. Auto Smooting Angle で設定している値でオートスムーズを設定する
  4. additiveオプションの実行
    1. ONの場合、処理を実行する前にオブジェクトへ設定していたエッジウェイト等の情報を残したままにして、ウェイト設定を追加する。
    2. OFFの場合、処理実行前に設定していたエッジウェイト等の情報を削除し、ウェイト設定を追加する。
  5. globalオプションの実行
    1. ONの場合、 今回設定した Auto Smooth Angle を次回以降も引き継いで利用する
      1. より正確には、 Auto Smooth Angle のグローバル設定を変更する
    2. OFFの場合、今回の設定の内容は引き継がずに処理する
      1. Auto Smooth Angle のグローバル設定を変更しない

SSharp

シーケンス

SSharp のシーケンスも 本家 にて公開されている。

  • set shading to smooth from flat
  • enables autosmooth / sets angle to 60
  • marks edges as crease / sharp / seam / bevel weight based off of sharp parameter.

日本語的には以下のようになる。

  • シェーディングを smooth へ変更する
  • autosmooth -> Angle を hardops の autosmooth で設定している値にする
  • パラメータ(Sharpness)に合わせて crease / sharp / seam / bevel weight を実行する
操作

f:id:r9aArrowhead:20201014141227p:plain

f:id:r9aArrowhead:20201014141232p:plain

f:id:r9aArrowhead:20201014141237p:plain

f:id:r9aArrowhead:20201014141242p:plain

f:id:r9aArrowhead:20201014141247p:plain

f:id:r9aArrowhead:20201014141252p:plain

f:id:r9aArrowhead:20201014141258p:plain

f:id:r9aArrowhead:20201014141303p:plain

f:id:r9aArrowhead:20201014141309p:plain

f:id:r9aArrowhead:20201014141314p:plain

f:id:r9aArrowhead:20201014141319p:plain

f:id:r9aArrowhead:20201014141325p:plain

f:id:r9aArrowhead:20201014141330p:plain

f:id:r9aArrowhead:20201014141335p:plain

f:id:r9aArrowhead:20201014141340p:plain

f:id:r9aArrowhead:20201014141345p:plain

f:id:r9aArrowhead:20201014141350p:plain

f:id:r9aArrowhead:20201014141355p:plain

f:id:r9aArrowhead:20201014141400p:plain

f:id:r9aArrowhead:20201014141406p:plain

f:id:r9aArrowhead:20201014141412p:plain

プロパティ

CSharp

基本的な処置はSSharpと変わらないが、 処理の大前提としてboolモディファイアを使っているオブジェクトが対象 な点に注意。
つまりは、ブーリアンモデリングをしているオブジェクトに対して実行する機能。

シーケンス

CSharp のシーケンスも 本家 にて公開されている。
CSharp の処理は本家の画像がかなり分かりやすいのでそっちを参照した方がいい。

  • set shading to smooth from flat
  • enables autosmooth / sets angle to 60
  • marks edges as crease / sharp / seam / bevel weight based off of sharp parameter.
  • applies boolean modifiers and other non hard surface modifiers
  • adds a bevel modifier (segements: 3 / profile 0.7 / weight not angle)
  • sets menu behavior to be for objects that are bevelled via changing sstaus

f:id:r9aArrowhead:20201014141417p:plain

日本語的には以下のようになる。

  • シェーディングを smooth へ変更する
  • autosmooth -> Angle: を hardops のautosmoothで設定している値にする
  • パラメータ(Sharpness)に合わせて crease / sharp / seam / bevel weight を実行する
  • 選択したオブジェクトに boolean モディファイアを適用 (Apply) して、bool処理を確定する
    • ここでメッシュが破壊される点に注意
  • bevel モディファイアを segements: 3 / profile 0.7 / weight not angle で適用する
    • bevel モディファイアは設定で適用するかどうかを変更可能
  • sstaus を利用して CSharp を実行したオブジェクトにメニューをセットする
    • Csharpを実行した時に左下にプロパティを表示するということ
操作

f:id:r9aArrowhead:20201014140739p:plain

f:id:r9aArrowhead:20201014140744p:plain

f:id:r9aArrowhead:20201014140749p:plain

f:id:r9aArrowhead:20201014140753p:plain

f:id:r9aArrowhead:20201014140800p:plain

f:id:r9aArrowhead:20201014140805p:plain

f:id:r9aArrowhead:20201014140811p:plain

f:id:r9aArrowhead:20201014140816p:plain

f:id:r9aArrowhead:20201014140822p:plain

f:id:r9aArrowhead:20201014140828p:plain

f:id:r9aArrowhead:20201014140833p:plain

f:id:r9aArrowhead:20201014140839p:plain

f:id:r9aArrowhead:20201014140845p:plain

f:id:r9aArrowhead:20201014140852p:plain

f:id:r9aArrowhead:20201014140858p:plain

プロパティ

仕組みが同じなので Sharpenning Parameters の項目は割愛し CSharp 特有の処理のみ記載する。

Sstatus

hardops の用語の一つで、 hardOps が保持している Sharpening を実行する時にエッジウェイト等の設定、 詳しくは 公式ドキュメント - sstatus 参照。
Sstatus の全体的な内容は helper や ツールバー

f:id:r9aArrowhead:20201014141417p:plain

General Options

Workflow

https://hardops-manual.readthedocs.io/en/latest/faq/#how-do-you-use-sorting-the-sort-tickbox-doesnt-do-anything

Sharp Options

このグループに関しては図示するまでもなく公式が仕様をほぼそのまま載せている。
以下 公式ドキュメント からの引用

Sharp options pertain to markings. 
On edges meeting the "sharpness" threshold, the following edge markings will be performed. 
- crease (crease at 1 to resist sub-d) - seam (easy region selection with L in face mode) - bweight (bevel weighted workflows where bevel is able to be controlled) - sharp (shading override for sharp shading)

日本語的には以下のような感じになる。

  • Sharpening 処理実行時に Sharpness で設定している角度以上のエッジは、シャープ化する対象とみなす
  • Apply Crease は Sub-D向けにエッジを edge crease = 1.0 にする
  • Apply Seam は L (= Select Link) しやすいようにエッジを Mark Seam する
  • Apply bweight は ベベルを調整できるようにエッジを Bevel Weight = 1.0 にする
  • Apply Sharp はシャープな見た目にするために Auto Smooth を上書きする

要するに、各項目でエッジを立てるためのプロパティ on/off を切り替える

f:id:r9aArrowhead:20201014141422p:plain

f:id:r9aArrowhead:20201014141427p:plain

f:id:r9aArrowhead:20201014141434p:plain

f:id:r9aArrowhead:20201014141442p:plain

f:id:r9aArrowhead:20201014141448p:plain

f:id:r9aArrowhead:20201014141456p:plain

f:id:r9aArrowhead:20201014141503p:plain

f:id:r9aArrowhead:20201014141510p:plain

f:id:r9aArrowhead:20201014141515p:plain

hops sort

モディファイアはスタックの順番によってオブジェクトの結果が変わってくる。
hardOps は操作によってモディファイアを追加する際、モディファイアのソートを実行する機能が存在する。

f:id:r9aArrowhead:20201014141522p:plain

f:id:r9aArrowhead:20201014141527p:plain

f:id:r9aArrowhead:20201014141534p:plain

sort Last

hops sort の右側にある を押すと表示する機能。
名前の通り、 ソート処理が発生した時に、選択しているモディファイアをスタックの最後へソートする

f:id:r9aArrowhead:20201014141540p:plain

f:id:r9aArrowhead:20201014141546p:plain

ソートルール

公式ドキュメント によると、ソート対象モディファイアはそれぞれ以下のルールに従ってソートしている。

  • sort bevel modifiers - move bevel mods to bottom of stack
    • bevel モディファイアはスタックの最下段へ配置する
  • non vgroup / only vert mode bevel is left unchanged
    • 頂点グループベベルの Only Vertices がない場合はベベル(の順序)を変更しない
  • sort array - ensures array is last so it shows booleans in all subparts
    • arrayがサブパーツ全ての boolean を表示するように確保する
  • sort mirror - using modifier mirror at the end of the stack will mirror all cuts
    • 全てのカットをミラーリングするために一番最後のスタックでmirrorを使う
  • sort solidify - keeps solidify later in the stack. Off by defaults. Only used in certain situations.
    • 特定の状況でのみ、スタックの後半を維持し続ける
  • sort weighted normal - keeps weighted normal at the end of the stack (maintains shading)
    • スタックの最後でノーマルウェイトを維持する
  • sort simple deform - keeps simple deform at the end of the stack before the rest.
    • 残りのスタックの直前の位置を保持する
  • sort triangulate - keeps triangulate after boolean to allow for iterative working on an exportable mesh
  • sort decimate - moves decimate at the end of the stack (useful for rare situations)
    • スタックの最後へ移動する
  • recommended off for smart shapes and situations where the mod order is crucial.
    • モディファイアの順序が形状に影響を及ぼす場合はoffにすることを推奨する
  • sort remesh - ensures remesh is kept at the end of the stack
    • スタックの最後を保持する
  • sort cast - ensures cast is not placed after the boolean modifier
    • boolean モディファイアの後には配置されないようにする
    • しかし、 sortオプションの中に Cast モディファイアは存在しない
  • sort weld (2.82) - ensures weld is kept at the end of the modifier stack.
    • スタックの最後を保持する

うん、よくわからないね。

hops sort のテスト

テスト結果はこっちに移動しました。

minorblender.hatenablog.com

ソートルール(私家版まとめ)

テスト結果から、ソートルールは以下のようになる。

  1. HardOps を boolean を実行すると、booleanはモディファイアを一番最後へ追加する
  2. Sort Modifiers で ソートを Onにしたモディファイアは、 boolean モディファイアの後ろへ並べ替えられる。この時、ソート前の順序を基本的には維持する。
    1. 同一モディファイアのソートは1つだけがソートされる
  3. モディファイアに Cast モディファイアが存在した場合、 Sort Modifiers の On / Off に関わらずCast モディファイアは必ず boolean モディファイアの直前へ並び替えられる
  4. モディファイアに Weight Normal モディファイアが存在した場合、 Sort Modifiers の On / Off に関わらずWeight Normal モディファイアは必ずモディファイアの一番最後へ並び替えられる
    1. Weight Normal モディファイアに限り、 すべてのWeight Normal モディファイアが最後へ回される

うん、結構面倒な感じが・・・