書籍「マイクロインタラクション ―UI/UXデザインの神が宿る細部」

良いツールの要素とはなんだろうと考えた時、第一に安定性や機能の豊富さ等が挙げられると思いますが、それと同程度以上に必要な要素とは、ユーザにとっての使い易さやわかり易さなのではないかと思います。

ツールに含まれる動作一つをマイクロインタラクションと呼びます。
マイクロインタラクションは、トリガールールフィードバックループとモードの4ステップに分割して考えることができます。

トリガー : 動作が起こるきっかけ
ルール : 動作内容
フィードバック : ルールにより引き起こされる反応
ループとモード : ルールの長期的な動作

本書では、ツール設計の際、いかに良いマイクロインタラクションを設計し、ユーザーフレンドリーなツールをつくり上げるかに焦点を当てながら、既存のWebサイトやソフトウェアからGUIを抜粋し具体例として挙げ、それらの良い点と悪い点を考察します。

ツールを作るとき、理解しやすく使いやすいツールにしたいと考えるけれど、その方法に明確な指標を持てておらず、結果的にユーザの操作に対して反応がぎこちなく、分かりにくいツールになってしまう悩みを持っているような方には特にお勧めしたい一冊です。

Maya – リソースイメージを抽出

import maya.cmds as cmds
resources = cmds.resourceManager()
for resource in resources:
  saveDirPath  = "D:/MYAM_temp"
  saveFilePath = "%s/%s" % ( saveDirPath , resource )
  cmds.resourceManager( saveAs=(resource , saveFilePath ) )

ツールのGUIを作ってる時、Mayaのリソースイメージをそのまま流用したいことがある。
わざわざキャプチャしたりするのは面倒なので、上記のコマンドでごっそりイメージファイルを抜き取って、必要なアイコンを使ってしまおう。


こんな感じで簡単にアイコンを抽出出来た。

書籍「その数式、プログラムできますか?」

 論文や教科書を参考に、数式をプログラムコードに落とし込みたいと思った時、複雑な数式をコードに落としこむのは、高い数学の素養を必要とすることが多く、なかなか骨の折れる話だったりする。この本は、そんな時の一助となる書籍です。

訂正
以前書いたレビューでは、数式をプログラムコードに落としこむ方法に焦点を当てた本であると取られてしまったかもしれません。
そのため、少し補足をする必要があります。

この本は、ジェネリックプログラミングと呼ばれるプログラミング手法に焦点が当てられています。
※ジェネリックプログラミングとは、データの形式に依存しない高効率なコードを書くスタイルで、ポリモーフィズムの一種。詳しくは以下をご参照ください。
ジェネリックプログラミング-Wikipedia
C++ジェネリックプログラミング入門

数式をコードに落としこむ下りも当然登場するのですが、どちらかと言うと既存の定理の数式(アルゴリズム)をより一般化し、最適化し、結果が正しいことを証明し、コードに落としこんでいくという内容がメインで、例えば、Σはプログラムコードに落としこむとどういったコードになるのかといった、数式をコードに落としこむ方法を一から懇切丁寧に解説する書籍ではありません。

もしこの記事を見た方が誤解して買ってしまい、話がちゃうやんけ!となってしまっては申し訳ないので訂正させていただきます。(すみません)

内容は非常に興味深く、役に立つ書籍だと思いますので変わらずおすすめしたいと思います。

Python SOPでデフォーマーを作ってみる

リクエストがあったのでVOP SOPのような処理をPython SOPで行う方法を書いてみる。
とりあえず、ノード構成はこんな感じでやってみる。

■Python SOP

myDeformerはPython SOP
Python SOPはデフォルトの状態だと以下のようにコードが記述されている。

###########################################
node = hou.pwd()
geo = node.geometry()

# Add code to modify contents of geo.
# Use drop down menu to select examples.
###########################################

 

hou.pwd()はPython SOP自身のノードオブジェクトを返す。
Node.geometry()は自身に入力されたhou.Geometry型のジオメトリオブジェクトを返す。

geometryの中にはPointやEdgeやPrimitive型のオブジェクトが含まれており、実際に形状や色を変更する際は、これらのコンポーネントオブジェクトを取得して操作する。

■コンポーネントの取得

■Pointリストの取得
points = geo.points()

■Primitiveリストの取得
prims = geo.prims()

それぞれのコンポーネントに一律の処理を行うには?

 

・単純にforループで回す
for point in points:
  position = point.position()

for prim in prims:
  verts = prim.vertices()

・iterPointsを使う(generatorの使用、こっちのほうがメモリ効率良さそう)
for point in geo.iterPoints():
  position = point.position()

 

■pointを移動してみるサンプル

###########################################
import math

node = hou.pwd()
geo = node.geometry()

# Add code to modify contents of geo.
# Use drop down menu to select examples.
for point in geo.points():
  initPosition = point.position()
  pointIndex = point.number()
  radian = math.radians( pointIndex )
  displacement = hou.Vector3( [ 0 , math.sin( radian * 10 ) , 0 ] )
  newPosition = initPosition + displacement
  point.setPosition( newPosition )
###########################################

 

 

・Gridを変形

・Sphereを変形

■各オブジェクトのリファレンスマニュアル

各オブジェクトの使い方は以下のマニュアルを参照すべし

・hou.Geometry
http://sidefx.jp/doc/hom/hou/Geometry.html

・hou.Point
http://sidefx.jp/doc/hom/hou/Point.html

・hou.Prim
http://sidefx.jp/doc/hom/hou/Prim.html

Pyro Effects

基本的な作成方法

シェルフのPyro FXタブでFlamesなどを選択。
Fluid化したいオブジェクトを選び、Enter

AutoDopNetwork

Pyroに限らず、DOPをシェルフから自動で作成すると、AutoDopNetworkノードが作成される。
中を開くと大量のノードネットワークが作成されていることがわかる。
各種ノードに対する理解が浅いうちは表層のノードのみを使うようにしたい。

Flames作成直後のAutoDopNetwork

20140712_01_0

pyro(Smoke)

個々のPyroオブジェクトの動作を決定するノード
Guidesタブで見た目の調整用表示切り替えなどを行う。

resize_container(Gas Resize Fluid Container)

Fluidの状態に合わせてサイズが可変のFluidコンテナ

source_fuel_from_sphere_object1(Source Volume)

Fluidボリュームの発生源となるオブジェクト形状を入力するノード

pyrosolver(Pylo Solver)

煙と炎のソルバ。
smoke solverノードもあるようだが、pyroは上位版と言えるノードらしい。(Smoke Solver+燃焼モデルの複合ノードとのこと)
Pyroに関わる計算の精度など、大域的な調整を行う。

Pyro Effectの基本プロセス

20140712_01_1

20140712_01_2

20140712_01_3

Fuel[Fuel]:燃料

燃料の特性、材質

Burn:燃焼

燃料を炎と煙に変換するためのフィールド

Flames[Heat]:炎

Smoke[Density]:煙

煙。炎を正しくレンダリングする際に必要。

Temperature[Temperature]:温度

燃料の発火点や炎や煙の立ち昇るスピードなど。

Buoyancy:浮力

Expansion[Divergence]:拡大/発散

炎と煙の拡散の度合い

燃焼のプロセス

発火は、燃料の温度(Temparature)が燃料の発火点を超えた時に発生する。

発火点/燃焼
Fuel * BurnRate

煙の発生度合い
burn * soot rate


Maximam of heat , burn

燃焼による拡散の度合い
burn * gas_release * burn_influence

燃焼による温度変化
burn * heat output * temp_burn_influence

燃焼による燃料の減少
burn * ( 1 – fuel inefficiency )

各パラメータの関連(制御に使うパラメータ)

Smoke(Density)
Fuel/Burn Rate/Smoke Amount

Flames(Heat)
Fuel/Burn Rate

Temperature
Fuel/Burn Rate/Flame Contribution/Burn Contribution

Expantion(Divergence)
Fuel/Burn Rate/Gas Released

Pyro Solverノード 主なSimulationパラメータ

Buoyancy Lift
炎や煙の上昇の度合い

Burn Rate
燃えやすさ

Temperature Output
燃焼することで発生する熱、この数値が高いと炎や煙がより早く上昇する。

gas_released
年常時に発生するガスのスケール係数。
燃料が気化する速度?
この数値が高いとより炎が広がって燃える。
このパラメータの影響は、Divergenceを表示することで確認できる

Matchmoverでマッチムーブを成功させるコツ

1
マッチムーブするイメージシーケンスは、必ず収差を補正しておく。
紙にグリッドを印刷し、撮影開始時に画面いっぱいに撮影しておくと補正しやすい。

2
連番jpgを使うと、画質が荒れて自動トラッキングの精度は落ちるが、プレイバックが高速なので作業しやすい。

3
フイルムバックの値を把握する
カメラの仕様書を見て写す

4
Pixel Aspectは撮影機材に合わせる。
デジ一の場合は1.0
フイルムバックの値をカメラの仕様書通りに入力した場合ほとんどの場合1.0ではなくなっている。
ここを改めて1.0で固定すると自動的にフイルムバックの値が再計算され、正しい値になる。

5
3Dカメラを解決する際、焦点距離が視差情報から自動計算されるので、固定する必要はない。
正確な値がわかっている場合にのみ入力しておくのが良い。

6
長めに生存するポイントのみを残すよう、自動トラッキングを行い、ノイズを含むトラックポイントは迷わず削除。

7
カメラを解決してみて、位置がズレてしまうなら、トラッキングポイントが足りていないので、手動で追加して精度を上げる。

8
床面のポイントなど、特定の平面上に存在するポイントはコンストレインを使用して、任意軸に対する位置関係を明示する。

9
ビルの角などをトラッキングしておくと、ステージフィッティングする際に楽できるので、必ずトラッキングしておく。

Matchmover 2014 – マッチムーブ覚書

・Load Sequence

自分はEOS KISS X4を使用している。
他のデジタル一眼レフでも同様の設定でいいはず。
古いカメラだとフルHDが24fpsでしか撮影できなかったりするので、適宜フレームレートを合わす。

interace : None
Framerate : 29.97

20140622_01_0

・一発目のテストトラッキング

まずは、ザックリとした設定でトラッキングを行う。
足りないトラッカーは後に手動で追加する。

20140622_01_1

・Delete Soft Tracks : On
・Automatic 2D Tracking : On
・Solve for Camera : Off

■Automatic 2D Trackingの設定

Track Using

  • Color

Min Track Length

  • 長めに75フレームくらい。これで、かなりはっきり検出できたトラックのみが生き残る。
    とにかくたくさんトラッキングして、後にClean Assistantを使用して生存時間が短いトラックを削除することもできるけど、意外と時間がかかるので、最初から長い生存時間のトラックのみを活かすようにするほうが楽だと思う。
Features
  • Sensitivity:空など、微弱なノイズがある部分にトラックが検出されない程度がベター
  • Density:最大

ここで重要なのは、有効になりうるたくさんのトラックを検出し、生存時間の長いトラックのみを残すこと

Displacement Range

  • Short 1%(カメラ遅)〜 3%(カメラ速)
  • Long 5%(カメラ遅)〜 10%(カメラ速)

ステディカムなどでとる映像は割とカメラがゆっくり動くので、上記設定の最低値を使うのが良さそう。

ここまで出来たら、まずはオートトラッキングを実行。
結果が出たら、トラックの整理を行っていく。

トラックの整理

・ノイズが乗りすぎたトラックの検出と削除

20140622_01_2

とりあえず、いくつかのブロックに分けて各トラックを選んでみると、明らかにノイズを含むトラックがわかる

20140622_01_3

こういったトラックは迷わず削除する

後に原点を置きたいような、重要なトラックがノイズを含んでいる場合、トラック選択後に修正を行うフレームを挟むように時間を変更し、それぞれでF6キーを押してIntermediateキーを打っておく。こうすることで、範囲内の時間でトラッカーをマニュアルで設定しても、範囲外のトラックが削除されないので便利。

あとは、ひたすらcommand+←→で時間を移動しつつ、正しい位置にトラックを置いていく。

小技として、末端側のフレームから一フレームずつ時間を遡ってマニュアルでトラッキングしていく方法もある。

ある程度整理できたら、何度か再生して各トラッカーの動きが破綻していないことを確認。

トラックの追加

座標軸の指定や距離計測のためのトラックが欲しい場合などは、任意の点を追加でトラッキングする。

20140622_01_4

この例では、以下のような設定をするために追加トラッキングする。
Track01>Track02:X軸+距離の指定
Track02>Track03:Z軸

カメラの設定

20140622_01_5

20140622_01_6

カメラのプロパティ

  • Filmback
    使用しているカメラの仕様書などを見て、CMOSセンサーのサイズを指定
    その後、AdvancedタブでPixel Aspectを1.0にし、Fixedモードにする。
    こうすることで、CMOSセンサーの上下余白を切り取ったFilmBackの高さが自動入力される。
  • Focal Length
    デジタル一眼レフなどを使用している場合は、レンズに記載されている焦点距離の値を入れる。
    ちょっとこの辺りの35mmフィルム換算の焦点距離を計算していれる方がいいかもしれない。
    ステディカムを使用する場合は、焦点距離を変化させながら撮影することは不可能なので、焦点距離を固定することになる。中央付近の青いラインの書いてあるボタンを何度か押して、RangeをFixedに。FとInitにカメラで設定した画角を入力。

Solve For Cameraを実行

待つだけ。
終わったら、ビュー左上の3Dボタンをおし2D表示に変更、タイムコントローラ左のカメラボタンを押すと、ビューがカメラから見たものに変わり、ダミートラッカーが表示できる。

20140622_01_8

20140622_01_9

20140622_01_7

ショートカット「3キー」でトラッカーの表示状態を変更。
後に座標系を指定するときなどはコーンを非表示にしとくと楽。

座標系と基準距離の設定

20140622_01_10

Coordinate Systemsフォルダ右クリックからNew Coordinate Systemを選択し、新たな座標系を作成する。

Coords01などを選択すると、以下の様なマニピュレータが表示される。

20140622_01_11

それぞれの球をドラッグして、原点にしたいトラックや原点と各軸を結ぶトラックの上に持って行くと、面倒なく設定ができる。

ある程度配置できたらCoordsのプロパティにある以下のボタンを押して変更を適用する。

20140622_01_12

Coordsの設定

20140622_01_13

  • Origin
    原点になるトラッカー名
  • Distance
    直下のFromで指定する2トラック間の距離。
    正確に入れると後々楽できる。
  • Axis1/2
    任意トラッカー間でどの軸を表すか決定する。
    このへんは手動で変更するのは面倒臭いので、前述のマニュピレータを使う方法で処理するのがいい。
  • Apply Coordinate System
    行った変更を確定する。

確認

ここまでで、ある程度マッチムーブが完了している。
3D Sceneを右クリックし、任意のオブジェクトを追加するなどしてマッチムーブが成功しているか確認する。

20140622_01_14

この時点で、全くずれていなければOK
でもまずそんなに一発でうまくいくことはないので、主に、背景と座標軸のズレ修正など、微調整が必要になる。

ただし、Matchmover内で精密な微調整は出来ないので、他のDCCツールにカメラデータをエクスポートして、各DCCツール内で微調整を行う。

このやり方は後日書くかも。

Houdini – Group

オペレータのGroupパラメータ(ターゲットを直接指定)

Houdiniでは、何かしらの処理を行う際、処理を行うノードの中で処理対象を明示的に指定する事ができる。これにより、後から処理対象を変更することが容易になっている。

例えば、Polygonオブジェクトのいくつかの面を選んでからPoly Extrudeなどの処理を実行すると、Poly ExtrudeのGroupパラメータに、処理対象となるPrimitive番号がリストアップされ、そこで挙げられた番号のPrimitiveに処理が行われていることがわかる。

20140518_01_2

20140518_01_0

20140518_01_1

3つのPrimitive選択後に、シェルフからPolyExtrudeを実行した後のPoly Extrudeノード。
Groupパラメータに3つのPrimitive IDが記入されていることがわかる。ここに、新しい番号を記入すると、そのアイテムにも同様の処理が行われる。

ビューポート内でTABキーを押し、直接オペレータを作成した場合も同様に、ターゲットのIDがGroupパラメータへ自動的に記入される。

Network View内でTABキーからオペレータを作成する場合は、Groupパラメータへは自動的に記入されない。

IDを直接指定する場合、上流にトポロジを変更するノードが追加されて各IDが変化した時、予想外のターゲットに処理が行われることになるので注意。

IDの直接指定は極力使うべきではない。

最後のノードで別のターゲットに対し続けざまに処理を行う

例えばPoly Extrudeを行ったあと、別のPrimitiveを選択し、Enterキーを押すと、選択したPrimitiveに対し、Poly Extrudeノードが追加で作成される。

Primitive選択後に Qキーを押しても同様

処理対象の再選択

選択状態を間違えて新しいオペレータを作ってしまった場合は、まず、オペレータを選択後に画面左の選択ボタン右クリックし、Reselect For Current Toolを選択。

20140518_01_3

20140518_01_4

こうすると、一時的にオペレータが無効になり、処理ターゲットを選択するモードに移る。

その後、任意の対象を選び直し、Enterキーを押すことで選び直した対象がGroupパラメータに改めて指定される。

Group SOP

Groupノードは、これまで見てきたような、何らかの処理の対象となるIDリストに対し、任意の名前をつけて、管理を助けるために使う。

それ以外にも、任意のバウンディングボックス内に含まれるIDリストや、任意軸に対して一定角度内の法線を持つPrimitiveリストを自動的に検出してグループに取り込むなど、多様な自動グループ作成が行えるので、非常に便利。

Group SOPに格納されたアイテムに処理をするには、以降のオペレータでGroupパラメータに使用したいグループ名を入力する。