TWAINとは

 ”Technology(Toolkit) Without An(Any) Interesting(Important) Name” の略語だそうです。
 スキャナなどの制御用規格の1つです。

 アニメ屋さんが最近もうトレースマンが最近のスキャナでうまくトレースできなくなりつつある、みたいな話をしていたので、なんとなく調査中。

 .NETでスキャナを扱うためのTWAINライブラリ

 [twain][c#] C#でTWAINを操作してみる

 .NET TWAIN image scanner

 アニメ屋さんの場合は、カット毎にタップ穴を基準にして紙を同じ位置に固定。何枚もおなじ領域をスキャンするので…
 ・荒い解像度(事前に設定された固定の解像度)で1枚フレーム用紙をスキャン
 ・詳細スキャンの解像度を設定(これもデフォルト設定があればOK。必要に応じてフレームに応じた解像度計算ができると尚良し)
 ・スキャンする領域を設定
 ・あとは必要枚数ぶんを詳細スキャン

 ていうことができればOK…というもの。
 なんか適当な実装って、お手軽にできるかしら?

0の話


整数は、絶対値の部分が小数点を扱わない。0またはそれ以上の数。
もっと原初の概念としての自然数(1以上の数)。

…などの数の概念を勉強したのがいつぐらいだったか覚えがないけども、ネットで検索する限り小学校高学年頃になるらしい。
掛け算や割り算は小学校3年生で覚えるので “0” もたぶんその頃に扱い始めるのだろう。

でも、以下の式は数学レベルの思考が必要で、たぶんこれを受け入れられるかどうかは数学を学ぶ上での試金石になる問題のように思う。。

\( 9 \div 0 = ? \)

他に、こういうのもある。

\( 2^{0} = ? \)

要は、数学は計算をするためのシステムであること。現実世界を単純に投影したものではなく “数学の理論の上で成り立っている” ということ。
このへんが現実世界を基準に考えるタイプの脳みそだと、数学の世界と現実の状況の相互投影がうまくいかなくて得心のいかない壁にやたらぶつかる。解決方法は、すべては数学の世界での話として考えるだけでいい。という話になるんだろうけど。

数学は超がつくほど頭のいい人達が寄ってたかって、それも長い年月を掛けて編み出してきた技術。それによって未知の事象をも投影することができるように磨かれているけれども、逆にどんな事象も投影できるように作られたシステムなので、それなりにお約束が一杯ある。

いろいろなお約束と、そのお約束の裏に潜む事情を空気を読むかのように理解できる人と、できないで数学の扉を潜れずにまごまごする人がいる。

まごまごする人でも、数学のシステムをもっと自然に受け入れられるといいんだけど…こんだけ頭のいい人がたくさん居てもそうなってないということは、それは難しいのだろうか。それともまごついてる人は、単に数式を解く絶対量が足りなかっただけなんだろうか?

今日は0にまつわる問題を自分が全然受け入れてなかったことに気づいて、かなり凹んだ。。

仮に \( 9 \div 0 = 0 \) が正しいとした場合…

逆説的に下記も正しいということになってしまうが…

\( 0 \times 0 = 9 \)

上記式は\( 9 \div 0 = 0 \)を変形したもの。
変形の過程はこんな感じ。

\(9 \div 0 = 0 \)
\(9 \div 0 \times 0 = 0 \times 0 \)
\(9 = 0 \times 0\)

“0で割る” 部分を右辺に移項するので、両辺に0を掛け消せる要素(左辺の \( \div 0 \times 0 \) )を省く。
…のだけど、すでにこの時点でなんかおかしい。

両辺を入れ替えれば、前述の式になる。

\(0 \times 0 = 9\)

0に0を掛けても答えは9ではないので、答えは間違っている。ということまでは、なんとなくわかる。

でもそれだけでは「解なし」という理由にはならない。
この問いに「解なし」と答える理屈を窺い知るために、とりあえずもう少し話を発展させてみる。

  • まず1以下の数値で割ったら答えはどうなるのか。
  • 次にそれを極限まで小さくするとどういう傾向が表れるのか。
  • 傾向から0で割った場合にどういう結論が導かれるか。

そのあたりを踏まえ、小中学校での学習要項に沿った場合に “学習範囲を超えている” という状況までわかって、はじめて「解なし」という結論に得心がいった。

頭が硬いってことかもな。
でも個人的には、「数えられない・数えきれない」という答えの方がしっくりくる。

実際には “0と0に限りなく近い極小の数” は別モノなので、この理解も正しいわけではないようだが、もはやどうでも良くなってくる…
最終的に、こんなQ&Aを見つけた。
[算数・数学]なぜ0でわる計算をしないのか(0で割れない理由)
プログラム的には

そもそも0除算ってCPU的に0除算エラー出るし、言語的には0除算例外でトラップ対象、CPUの演算コスト的にも非常に高価な処理。プログラムを書く時はまず乗算に置き換えを考えるような計算なので、あまり深く考えたこと自体がなかったかも…

しばらく放置してみて、思ったこと

 結局、0で割るとはどういうこと?に書かれているように代数的な観点と解析的な観点は異なっていて、代数的には「解なし(計算が成立する数は存在しない)」、解析的には「数えきれない(結果が無限大になる)」という話ってことになる。。

 ただ、どうしてもなんだかその理屈がしっくりこない自分が居て困る…

数の種類

まずはどんな数があるか、おさらいが必要だったので検索したらそのもののページがあった。
素晴らしいです、、

数学-数の種類

学校では

数の数え方(1、2、3)ということで自然数を覚える
自然数に0を含み、計算の概念として整数を覚える
割り算と共に分数を知り、小数表現を知る
負の表現、平方根を中学で知る
中学も終わる頃には、数の種類を知ることになる。

こうして、有理数・無理数の当たりまで計算で扱うに至る。
高校では、これに虚数および複素数を知る。

たぶん純粋に数学を理解するには、学んできた数のことを少し体系化して捉える訓練がどこかで必要になってくるんじゃないかと思うんですよね。

特に、数学の感覚が鈍い僕みたいな人間の場合。

数の歴史を紐解いた解説が最近書かれていたので、これもメモしておきたい。

虚数や複素数の存在に納得する、もう一つの説明

そしてイメージより言葉で覚える僕みたいな人は、やっぱり英語もセットで種類名を覚えた方が誤解なくスムーズに受け入れられそう。

平方根ってなんだっけ?


中学校で「2乗すると “その値” を得られる数」みたいに習った。

\(x = \sqrt{x^{2}} \)

\(\sqrt{2} \) は「ルート・2」と読む。
平方根は、英語では “square root” と呼ぶ。

“平方(へいほう:square)” とは四角形の縦横を掛けて面積を得ることに由来。2乗すること。幾何学用語。
“根(こん:root)” とは平方する際の元となる数値のことを指す。

もうちょっとなんなのか知りたいなーと思ったら、こんなサイトを見つけた。
中学生に平方根の基本的な概念と計算方法を教えるレベルのものですけど。

平方根ってなに?

これを見ると “平方根の正体” というか計算方法はわかる。だけども、まだこれだけだと数のイメージみたいなものを持てなくて困っている…

こういう場面で適用するべき。みたいな分類が全くついてなくて “この単元” の勉強が過ぎ去ったらもう実際の計算で活かすべきタイミングが全く掴めない感じになっている。

検索で見つけた、平易に説いているドキュメント
平方根や円周率のはなし – 山口大学
とか思ってたら…

 wikiの “幾何学” のページにイメージしやすい図があった…

 そうか “直角三角形における、斜辺と他の2辺の関係” は1つの形なのか。

 でも、それだけと思ったらダメだよな。
 有理数に対して、無理数を式に書き表す概念だしね。

そもそも “ピタゴラスの定理” から無理数が発見された模様。(出典)
計算時は

 平方根の計算を解こうとする場合は素因数分解がササッとできないと、母数を揃えられなくて式がまとまらないんですよね。
 素因数分解で100〜1000くらいまでをササッと素因数分解できると、式をまとめやすい。

 頭の体操のつもりで、たまに50〜100個くらい数字を並べて分解してみた方がいいのかもしれない。
 特に、センスのない自分みたいな人間の場合は。

[modo] 四元数による補間計算用 ChannelModifier

 一応動いたので、めも。
 参考サイトはコード内にあるので、そこを見る方がよい。

 本格的に書くならQuaternionはクラス化しなさいよ。
 …って感じのコードだけど、ChannelModifier動作確認用途なので、これはこれで終わり。

続きを読む [modo] 四元数による補間計算用 ChannelModifier

[XCode] バックスラッシュの入力

めも。

XCodeでコードを書いていて、ふと円記号とバックスラッシュが異なることに気がついた。
バックスラッシュを明示的に書けるのか…と。

バックスラッシュ(\)を素早く入力

XCodeというか、これはOSXが2つ共扱えるって話か。
Windowsだとどっちかだけだよな、なんで違うんだろう?

AutoRig再考

 過去記事を読んでいて、ふとAutoRigにこういうのがあるのだろうか..と思う手順が浮かんだ。

  • フィッティング用の構造は『箱人形 + 基本のボーン構造』
  • 箱人形で仕込みたいモデルをなるべく綺麗に包み込む
    もしくは、箱人形のボーンをモデルに合わせると、箱人形の形状がボーンに合わせてスケールされて包み込む
  • 箱人形のウエイトをモデルに転写

 最終的に、箱人形のボーンがそのままモデルのボーンとして機能する感じ。
 こんな流れのAutoRigはあるのかな?

 位置を合わせた後の自動計算フェーズでウエイトやボーンが仕込まれるなら、同じなんだろうけど。


 すっかり忘れてただけで、TSMがこのタイプのAutoRigだったかも..

2016.9.20追記

 TSM3が、発売された。

 ・モジュラーリギング
 ・rigの再設定がいつでもできる
 ・モーションの完全な反転
 ・ゲームエンジン対応 … など

 もともと、手軽にrigを設定して動かせるようになるタイプのリギングツールだったけど、いろいろ柔軟さが増した模様。

[modo] ChannelModifierの四元数系処理は901以降

 ちょっとリグの手習いを…と思ったけど、801では四元数は使えなかったり…

 SDKで自前のModifierを書く…という手段はちょっと大変すぎるし。
 残念。

諦めてたんだけど…

 Zで行こうにChannelModifierの記事があった。
 SDKサンプルにもドキュメントにも、行列のin/outを扱う方法がなかったので諦めてたけど、なんかできそうなので行列を扱うpluginを書き始めた。

 できる。って言っても、行列と四元数の相互変換をすることで内部的に四元数で計算する処理が書けるだけなんですが…

XCodeに苦戦w

 XCodeもあまり使わないので、どうやってBuild Phaseに新しいプロジェクトを追加するのか判らずに時間を費やす。
スクリーンショット 2015-06-09 午後9.48.07

 上の画像左上の赤丸のアイコンをアクティブにすると、ビルドを行うプロジェクトやターゲットのリストが表示され、リスト下部の + アイコンを押すと下の画面が現れる。

スクリーンショット 2015-06-09 午後9.58.15

 modoのプラグインを作成する場合は、OSX > Framework & Library > Libraryを選択。
 次の画面で、Framework: None(Plain C/C++ Library), Type: Dynamicを選ぶ。

 今回は、SDKのサンプルのChannelModifierの設定を流用することにしたので、前述のリストの流用したい項目を右クリックしてDuplicateを選択。
 ※リネームは Finderのリネームと同じ。項目を選択後もう一度クリックしてしばらく待つ。

 プロジェクトにコードを追加しておき、複製した項目を選択して、Builder Settings > Product Nameの編集。Build Phases > Compile Sourcesの編集したら、下の項目をビルドしたい項目に変更。

スクリーンショット 2015-06-09 午後10.08.17

 これでビルドできる。

なんだかんだ。数時間

 modo SDK wikiに、ChannelModifierでのマトリックスの入出力の基本形は書いてあったので、ありがたく引き写す。
続きを読む [modo] ChannelModifierの四元数系処理は901以降

[modo] UVテクスチャを設定するには

まずは、オブジェクトを用意。
とりあえず、箱を作った。
スクリーンショット 2015-06-09 午前0.17.54

箱のポリゴンを選択。
今回はダブルクリックで全部選択した。(一部のポリゴンを選択したら、テクスチャの適用が面単位になるかもしれないけど、Mayaに慣れた身には恐ろしい…w)
スクリーンショット 2015-06-09 午前0.18.02

Shadingタブ > Assign Materialを選択。
以下のダイアログでマテリアルを作成。
スクリーンショット 2015-06-09 午前0.18.44

マテリアルができた。
スクリーンショット 2015-06-09 午前0.18.57

Imagesタブ > Add clipを選択して、テクスチャ画像を読み込む。
スクリーンショット 2015-06-09 午前0.19.14

読み込むとアイコンとしてリストされるので、アイコンをビューポートにドラッグして、箱の上にドロップする。(事前に、箱のポリゴンを選択しておくこと。)
スクリーンショット 2015-06-09 午前0.19.47

Shadingタブのマテリアルを見ると、テクスチャが追加されているのが確認できる。
スクリーンショット 2015-06-09 午前0.20.01

リグ(3DCG系)とは

 3DCGの世界に “リグ(Rig)” という言葉がある。
 英語のそもそもの意味は、「索具(さくぐ)。取り付ける。」というような意味合いになる。3DCGの世界ではそれが転じて、キャラクターや機械に仕込まれた制御用の構造を指す言葉。

 リグを仕込む作業は “リギング”、さもなくば “アニメーション・セットアップ” のように呼ばれる。

英語の意味としては、どちらも正解。
ただアニメーション・セットアップが転じて、リギング作業そのものを単に “セットアップ” と略すようになるとたまに危険。わかっていて言うのは良いとして、”セットアップ・アーティスト”という名称を作り始めると…ちょっと恥ずかしいので気をつけたい。
英語圏だと “テクニカルアーティスト” の一種という感じ。TD(Technical-Director)やRiggerという呼び方もある。DFさんの募集ページを覗いてみると、リギングアーティストと表記。
どんなもの?

 例えば下図のように、キャラクターの腕に仕込まれた骨(bone)がある場合に…
骨入れ参考

 このキャラクターの腕を、キャラクター・アニメーターがどのように動かしたいか…
 その要望に合わせて、動かしやすくする仕込みのことをリグと呼ぶ。

 骨を仕込むのも含めてリギングだが、ただ骨を仕込んでも一般的にはFKという方式でしかアニメーションをつけることができないので、まずIKを仕込むことになる。

ほんとうは骨を仕込む際にウエイト設定という作業があるのだがここではその説明は省く。
どうしても気になる方はこちら(主旨が異なるものの、ウエイト設定を解説している)
座標変換と階層構造

 3DCGを始めると、FK(Forward-Kinematics)とIK(Inverse-Kinematics)という言葉を目にする。この2つの動作方式は理論的なことを知るよりも動かして覚えるほうが理解が早いが、言葉で説明するには3DCGの原理のひとつである座標変換と階層構造の手続きについての説明が必要。

 これらは、基本的に言葉通り。
 数学で直交座標系というのを勉強するが、座標変換で行う作業というのはこの直交座標系で「A を A’ の位置に動かす」ような操作を指す。
 その際の操作方法は、基本的に「平行移動・回転・スケーリング(拡大・縮小)」の3つの操作がある。
座標変換
(参考画像元: www.slideshare.net/shiozawa_h/cg2013-06-40284431)

 また階層構造は、上記の操作に親亀子亀の構造を持たせたもの。
 下図のような関節構造の表現ができるようになる。

(参考画像元: www.youtube.com/watch?v=Pz3y3e-_esY)

FK, IK

 この2つは階層構造に対しての座標変換の手順が異なる。

 FKは、親亀から順に子亀・孫亀…と座標変換を行う。
 IKの場合は、IKの終端に定めた場所(一般的に”IK-Goal”のように表現される)を目標としてFKで動かした場合の各階層の座標変換を逆算する。

 そしてこの手順の違いがアニメーターの直感的な作業効率に影響を与える為、必要に応じて使い分けられるよう仕込みを行う。

 以下は、FK・IK2つの構造で異なるポーズをFK合わせ・IK合わせにフィットさせる自動化ツールの解説なんですが、FK,IK操作の参考に。

  • 手首を掴んで動かすと、腕が勝手にポージングされているのがIK操作。
  • 肩のほうから、上腕・前腕・手首のように、順にポージングしているのがFK操作。


(参考画像元: www.youtube.com/watch?v=_oJJkJtoeqQ)

下記のリンクは、Cyclic Coordinate Descent-IK という方式の計算過程を示したもの。IKが3DCGソフトで使われ始めた初期の頃からある素朴な計算方法だが、ポージング編集用途などでも安定的に動作する。
CCD-IKと呼ばれるごく簡単な方式のIKの仕組み

こちらはCCD-IK法などを解説したPDF資料
CCD-IK and Particle-IK(pdf file)

 ぶっちゃけ業界は「慣れちゃうとほとんどFKだけでモーション付けますよ。」という猛者がゴロゴロ生息している世界だが、アニメーションさせる必要がない場合などで “さくっとポージングを決め込む” にはIKは非常に直感的でパワフルなツールになる。
 なので、たとえ猛者揃いの業界であってもFK/IK両方とも必要。

 リギング作業では、このようなIKとFKの切り替え・ミックス操作や、尻尾や髪の毛など多関節のポージングやモーション作成を直感的に素早く行う為の仕込みを行なう。

リギングの範囲

 リグはアニメーション作業の為の仕込みなので、リギングの範囲は結構多岐に渡る。

 ロボットの場合など、単にFK/IKの仕込みの場合もあるが、多くの場合キャラクターの表情操作の仕込み(フェイシャル・セットアップ)を行うし、揺れもの制御(髪・アクセサリの揺れの自動計算)を仕込むことも多い。

 ロボットなどメカ物の場合には、トランスフォーマーのオートボットの変形のような複雑な操作を予めリギングで仕込んでしまう(複雑な変形の自動化)ということを行う場合もあるので、必ずしもメカのリギングが簡単という訳でもない。

 また実際に仕込みを入れていくと、可動部分には意図しない干渉や破壊的な変形が多々発生する。IKには意図しないフリップが発生する場合もあるので、そういった状態を回避したり補正したりする仕込みも入れる。

 映画レベルの仕込みになると、髪の毛や服に対してのシミュレーション。破壊される建物などの破壊系シミュレーションといった作業を行う場合も出てくる。(破壊系は結果確認も必要になるので、専属のテクニカルアーティストがつく場合もあるし、もはやリガーの仕事範囲からは外れてるか…)

 特にキャラクタに関して最近は凝った服装の仕込みも当たり前になっているので、ますますリグの有用性は増しているのだろう。


 興味がある人は Mayaリギング -正しいキャラクターリグの作り方- という本を読んでみるといいかも。非常に具体的な例が示されています。
 すでにリギングを生業にしている人でも、基本を見直すきっかけ作りになるかも。。