English Here

編集視差による自動立体化について、と六角大王の自動立体化について

(何か六角と結び付けすぎな印象を与えるらしいので… 六角についてはこちら)

<戻る

今回六角大王とは別で、それでいて上位互換で移動できる
自動立体化アルゴリズムを紹介したく、このページを立ち上げました

このアルゴリズム、既存の3Dアプリケーションに追加するに当たって必要な改造は
「過去の編集視線を保存する」「現在の編集視線との間での自動立体化を行う」
だけです、コスト的にも小さな改造で可能なものです。

また、名称的に「微調整モード」のような名称で導入するならば
移動量の小さな調整程度に使われることになるためおかしな動きをする、といった
ユーザーへのアルゴリズムによる拒絶感を和らげることも出来ます。

特にモデリング終盤における編集効率のアップが可能です。


MarbleCLAYを使っている人でこのページにたどり着き、いまいち逆光の使い方がわからないという方へ

逆光は「編集者はある編集物を正しい位置へ配置しようとする」という仮定から成り立っているため
編集中の点などを見づらいから一時的によける、とか、まだ位置のハッキリしていない物を編集するなど
そういった逆光が「意図しない移動」に対して非常に弱く、おかしな動きをしてしまいます
馴れていない方はまず従来のモデリング操作を使って大まかな形を作り
位置の微調整を行なう際に「逆光」モードにしてみてください

モデリングの終盤においては「ある角度から正しい位置に見えている」が「特定の角度ではおかしい」という
逆光による1回の編集で意図した位置へ移動する状態でモデルデータがあり続ける事になるので
終盤における微調整には非常に便利で、逆光の利点を得やすいと思われます



一般的な3dソフトはどうして斜め編集が出来ないのか
わたしはずいぶん昔から疑問を感じていました

斜めから物を乗せたつもりでカメラをまわしたら実際には乗っかってなかった
その後何度か位置を修正したが思った位置へ移動できなかった

左右対称のものを片側ずつ動かしたら片方を動かすともう片方が
逆側を動かすともう片方が動いてしまって上手く意図した位置に移動できなかった

多画面で編集中に他のウィンドウの点が意図しない場所へ勝手に移動してしまった



そのような経験はないでしょうか?


多分誰もが一度は、上みたいな事をやったと思うんです
ずっと昔、最初に3Dソフトに触れて斜めから編集したときに
あれ?どうしてここに行かないの?と思いませんでしたでしょうか
そして多分説明書やチュートリアル、書籍や掲示板などで
「座標軸を固定して動かすんですよ」とか「斜めからうごかしちゃダメよ」とか見て
ああ、斜め画面から直接編集って使えないんだなぁと思った事があると思うのです
「二次元で動かしただけだもの三次元でその位置に来るはずがない」
多分ちょっと考えた末にそうやって納得しませんでしたでしょうか?

3Dソフトを使い慣れてくるとこういった問題はXYZ軸に分けて
個別に移動することで解決したり、場合によっては視線に平行移動を利用し
何度も角度を変えながら上手く収まる位置を探ったりする場合もあるでしょう

知り合いの3dモデラーさんは斜めからの違和感をどうしても直したい場合
何度もその角度から調整しながら他画面の移動を繰り返す、と仰ってました
実際軸をワールド座標のXYZ軸を意図しないでの移動は
今の所左右対称に限ったフリー版六角大王しか出来ないものでした


六角大王の自動立体化については別ページにて細かく説明します

(また、どうして斜めから、自由角度からの編集が必要なのかは下で説明します

(開発者の方には直にアルゴリズムの式そのものを下に用意してあります

(さらに正確な内容に興味のある方は特許申請文章図面1をご覧ください)


しかしここに左右対称に限らずに自由な角度から移動できるアルゴリズムがあります
既存の4方式、XYZ固定・垂直と共存可能な5番目の方式です


二見 視差自動立体化アルゴリズム 逆光(通称ギャッコー)
戦闘機好きの友人と話して曰くお勧めネーミングらしいのでコレで行きます
英訳はGYAKKOU (Opposite Raytracing)ってことで…
中島 夜間戦闘機 月光

特許を申請した事について質問ありましたがライセンシーは%で取ろうと考えているので
フリーウェア作者様には要連絡の上、として自由に使っていただいてかまいません
ただしこのアルゴリズムを使用してることを明記し、宣伝してください
普及を図ることを第一に考えているので、よろしくお願いいたします
ライセンス形態についてはご相談ください、出来る限りご要望に沿えるようにしますので



アルゴリズムを利用したソフトウェア

http://homepage3.nifty.com/escargot/MCLFrm.html

上記リンクのMarbleCLAYというフリーウェアのbeta5.2e版に
一部動作が組み込まれました、以下アルゴリズムの動作サンプルのうち
一番目のサンプルムービーの動作と同じ動作を実用レベルのソフトで試すことが出来ます
多画面操作(三番目のサンプルムービー)については要望が多ければ対応とのことです

左メニューの一番下が逆光移動モードです
ドラッグ中は視線ガイドが表示されます、Ctrl押しによって旧視線側にスナップします


アルゴリズムの動作サンプル

このアルゴリズムのコアになる部分は過去の編集視線と現在の編集視線から
視差を用いて立体化する部分にあります

既存の移動方式「XY」「YZ」「XZ」「画面に水平」に加えて「自動立体化」として
登録した際のサンプルとして今回ムービーを製作しました

まず、一枚目、表示した画面でいきなり描画を始めた際
これは一般的な3Dアプリケーション同様に
画面に水平で表示Z系=0の平面に描画します

例えば四角の二辺に線を描くようなモデリング場面を想像してください
これは簡単な例ですが、実際には人の顔の横に耳を書いたりする場面でも同様です

ところがそれではその場所に実際には書けていません
当たり前なんですね、3d空間の奥行きを2dで書いただけでは判断できません


ここまでは一緒なのですがその後、カメラやウィンドウ変更後の編集など
「編集視線」の変更を感知した際にに「自動立体化」しています
この方法なら、移動方式が切り替わったことを感じさせずに
あらゆる角度からの点の修正が可能になります

つまり間違ってる、と見えた角度から修正するだけで、本来ある位置に収束するのです

 

カメラ移動しておかしかった角度から > おかしくないように修正する
これだけで自動的に、意図した場所に物体が移動します





同様の動作をムービーで行ってみました

まずはこのムービーをご覧ください

http://atariya.dojin.com/rok/rrk/rrk001.mpg



サンプルではある角度から立方体の一辺に線をおく、という作業を行い
その後、その点を中央の点に移動させるまでを行っています

自由な角度からの入力と編集を可能にし、意図した位置への移動を行っています

特にボーンの入力や、特定角度からしか見えない形状の不具合など
そう言う場面において威力を発揮すると思います

また、移動を点に限らずオブジェクトとして、その重心や、つかんだ点を基点に
自動立体化を行った場合、3D空間に配置された色々なものを
さまざまな角度から自由に再配置するレイアウト機能を有することが出来ます
例えばテーブルにボールをのせる、といった単純な作業において

斜めから見たときにこの位置にあって欲しい、と思ったなら
わざわざXYZ軸に分けることなく直にその場所へドラッグし
別角度から再調整することで見栄えの欲しい角度、実際にレンダリングする際に
必要とするような角度などからのダイレクトな編集を可能にします


あらゆる角度からのレイアウトが可能になり
こんな場面をくりかえすことが、なくなるのです

また、ボーン・オブジェクト配置などの編集などに利用すれば多角度、多画面複数カットなどから
アニメーション付けにも利用が可能です




http://atariya.dojin.com/rok/rrk/rrk002.mpg

次にこれは、旧六角大王で可能だった対称物体の自動立体化と同様の動きが
このアルゴリズムでも可能であることを示すために作ったデモです

実虚像同時編集が出来ないアプリケーションに組み込むのは難しいかもしれませんが
カメラを移動しなくても、実虚像編集を行った際にアルゴリズム内でカメラ位置を
対称平面に映された反対側の点にあったと仮に「編集視線」を移動させることによって
フリー版六角大王で可能だった移動方式が可能な上に
実像移動後にカメラを移動させて虚像を移動しても自動立体化可能という

フリー版六角大王でも出来なかった作業が可能になっています

ただ、現在のデモ版ではこの機能にはバグがあって上手く働かない場面があって
今回は上手く行った場面だけでのサンプルムービーです
目下原因究明中です、理論的には可能なはずです





これが二画面以上での編集の際に出来るトレースサンプルです

http://atariya.dojin.com/rok/rrk/rrk003.mpg

ある画面にトレースしたい物体をトレースしたい角度から表示し、入力した後
別角度から正しい位置へ再編集することによって意図した場所に移動可能になっています
これもあらゆる角度から可能ですし、3画面、4画面と増えた場合でも可能です

これを利用することで異なった角度から撮られた写真やイラスト2枚以上を用意し
それをトレースして立体化を行うことも容易になると思います



また、2画面以上を開いておいてさまざまな角度から
編集対象の形状を理解して編集することが出来るならば

トレースに限らず頭の中で考えたモデルの見栄えのする角度を表示しておき
その角度同士からの見え方を調整することですぐさま自動立体化が可能です


点や物体の位置をXYZに分解して考える手間を省くことが可能な上に
見栄えの欲しい角度から、そのものずばりの移動編集が可能です

このように2枚以上の複数カメラから多角度表示しているときなら
カメラ移動無しに点を移動することで意図した場所へ収束します

特に2画面で編集を行うなら、互いのウィンドウで正しい位置へ移動するだけで
反対側のウィンドウで点が「意図しない動き」をすることがなくなります


この例では右上、右下のウィンドウで
それぞれ動かしたい方向へ移動させました
ちゃんと意図した部分へ移動していると思います

その後左上などで調整したりしても平気ですし
もちろんカメラ位置を変更しても立体化可能です

この様に従来の4面図での編集においても斜め画面を有効利用できます
他のソフトと大きく違う部分としては斜めのウィンドウだけでも自動立体化が可能なうえに

「斜め>正面」や「前>斜め」などの移動でも自動立体化されます

たとえば斜めウィンドウで点を移動したい位置に2D移動させた後に
正面などから一回修正するだけで意図した位置に移動しますし
また斜めウィンドウで複数回2D移動する事でも同様に移動可能です

もちろん並行投影部分同士での移動も可能です、その場合の使用感は従来通りです



どうして斜め移動が必要なのか

このアルゴリズムは斜めからの編集を自由に行えるうえに
編集を繰り返すことで意図した場所へ対象が収束していくという利点があります

これは一般的にもやもやとハッキリした設計図の存在しないものを
見えている角度から気の向くままに弄り、粘土をこねて考え出すように
ラフスケッチから描き出すように編集することが可能になります

普段の編集は従来の方式を用いて、点の位置修正を行う際に
この方式に切り替えるような方法での組み込む方法でもいいですし
慣れている方には任意角二画面による同時編集による
作業の効率化を図れると思います


どちらかというと今までの3DソフトはCAD系からの派生が多く
XYZの軸を意識して編集を行わなければならないものばかりでした

このCADから派生した考え方は
設計図がはっきりしているような物を編集することには向いていますが

頭の中に浮かんだ、落書きのようなものを、粘土をこねるようにつくるには
今までの移動方式は明らかに向いていない、と私は思います


特定の角度からしか任意の位置へ移動することが出来ないからです

(「画面に水平」なら、それに直角な角度からの再編集が必要ですし
 XYZ軸固定ならば、頭の中で軸を分解して構成しなおす作業が必要です)

又、編集終盤にはある角度から以外の見栄えはすでに完成している状況になり
時差による立体化で言う所の一度目の移動はすでに済んでいる状態になるため

違和感のある角度から編集するだけ、の1アクションで立体化が可能です

モデリングの終盤は一度目の入力が終わっている状態が常に続いているといえるので
ある角度で不具合発見>修正の1アクションで修正が終わるのが強みです
つまりモデリング終盤の修正作業効率が格段にアップします

このアルゴリズムを利用するために必要な手間、
一般的な3Dアプリケーションに実装する際に必要な改造部分はそう多くなく

「一回分の過去の編集視線を保存しておく」という程度です

過去に編集した際に持っていた視線の情報を利用して
再立体化を行うので、そのために保存しておく必要がありますが
アプリケーション的に大掛かりな変更は必要ない、と思います

左右対称編集についてはその限りではないと思いますが
昔のFree六角で出来たことを再び可能に出来る、という意味では
検討していただく価値はある、と思います



逆光演算式そのものについて

肝は新旧視線ベクトルの近傍点のうち主に新視線側の点を使うことにあります
これにより使用者に感づかれることなく、修正の繰り返しの蓄積から意図した点への収束を図ります
この修正は角度を変えて行われるたびに誤差が消えていき、また、使用者の入力誤差がなければ
最初の二回の入力だけで特定の座標を指し示すことが出来ます

点Aを含むベクトルVの直線と点Bを含むベクトルWの直線との
最も近い点をP、Qとする視線追従型の立体化において(Pは今回使用しない)
点A=作業前の点、点B=現作業点2D+L -> 3D変換座標
TP=つかんだ点の旧座標として
ベクトルV=旧作業視点->TPへのベクトル(つかむ前の点の絶対座標位置)
ベクトルW=現作業視点->絶対座標系の新UV(ウィンドウ上での作業点xyより)
と置くことで立体化し、二次元作業後の三次元座標点Qが求められる

(図1は作業前の状態、図2は点をドラッグした後の状態)
上の条件より

p3d=(u,v,L)rot(yθ,xθ)
Ax=TPx,Ay=TPy,Az=TPz
Bx=p3dx,By=p3dy,Bz=p3dz
Vx=VoldX-TPx
Vy=Voldy-TPy
Vz=Voldz-TPz
Wx=VnewX-p3dx
Wy=VnewY-p3dy
Wz=VnewZ-p3dz
(平行投影時はWx,Wy,Wz=-Vnewx,-Vneww,-Vnewz、同様にV(x,y,z)=-Vold(x,y,z))

 *(u,v)はウィンドウ上の作業点座標
 *Lは作業平面の中心からの距離
 *p3dはWindow上の点(u,v)の絶対座標系での位置で
 *rot(yθ,xθ)はワールド座標系から表示座標系への回転式

上記条件より立体化した点Qは
Q(x,y,z)=(Bz+Wxs,By+Wys,Bz+Wzs)
となる

ただしsは
a=VxWx+VyWy+VzWz
b=Vx^2+Vy^2+Vz^2
c=Vx(Bx-Ax)+Vy(By-Ay)+Vz(Bz-Az)
d=Wx^2+Wy^2+Wz^2
f=Wx(Bx-Ax)+Wy(By-Ay)+Wz(Bz-Az)
としたときの
s=(bf-ca)/(a^2-db)




実施例

旧視線、一時保存視線、現視線の3つの視線を保存しておき
旧視線上書きのチェックのタイミングは線画の入力や点の移動など編集を検知した際に
現視線と一時保存視線が同じだったらそのまま新旧視線から立体化
異なった場合は一時保存視線を旧視線に、現視線を一時保存視線に上書きすることで
一画面で複数点を編集したり、カメラ移動だけで編集しなかった際などに
旧視線を失うことを防げます>サンプルアプリ

点ごとに視線を保存するのではなく
「編集を終えた最後に見ていた画面は正しかったから修正を終えたのだ」
と仮定して修正を終えた最後の視点から全ての視線を計算することでメモリーを必要としません
結局ある点がそれで意図しない動きをした場合でも次の移動時には視線が合っているので
その点は意図した位置に収まります、それが
「編集するたびにだんだん意図した正しい位置に収まっていく」ゆえんです>サンプルアプリ

旧式<>新式切り分けルーチンは
2視線のなす角が一定以下の場合旧式、一定以上の場合新式とする
つまり2ベクトルのsinθが一定以下として内積より処理分離しています
後チェックの方が利口な気がしますが、移動中に新旧アルゴリズムが変化すると
ユーザーの混乱を招くような気がしたので、先チェックに変更しました>サンプルアプリ

さらに左右対称の物体を編集した際は実像虚像の順に触った場合は旧カメラを現カメラの虚像
虚像実像の順に触った場合には新カメラ(?ここにバグがあるっぽい)を虚像位置へあると仮定し
上の変換式を通すことによって六角と同じような動きをすることが可能になります>サンプルアプリバグあり

また新視線側、と書いていますが旧視線側の近傍点のほうが都合がいい場面
(例えば特定のウィンドウにトレースする物体があってそこからの見栄えをロックしたいとか)
もありえます、Shiftキー押しながら移動などで切り分けるのも良いと思います>サンプルアプリ予定

さらに細かい文章は、特許申請を行った際の文章をそのまま公開しておきます

(特許申請文章図面1をご覧ください)




ここでフリー版六角の斜め移動についてももう一度触れておこうと思います

フリーソフトウェア六角大王の自動立体化移動について


情報量が多いとのことで別ページに分けました、フリー版六角大王の自動立体化と
それを通じてこの新しい自動立体化がどう上位互換なのかについては

こちらをご覧ください

今回のプレゼンテーションについて


私自身はプログラム能力に疎く、数年がかりで友人と作った
バグありのプレゼンテーションソフトが

http://atariya.dojin.com/rok/rrk/rrk_09-10_2-2003.zip

http://atariya.dojin.com/rok/rrk/rrk_11-03-2003.zip


ここにあるだけの状態です。興味を持っていただけたら幸いですが
まだまだ、アルゴリズムを部分的に再現するのがやっとの状態です…
左右対称移動時のバグがありいまだ取れていませんが
視点変更移動時、2・多画面入力時の使い勝手は実験できると思います



サンプルアプリは移植時のコストの小ささを優先して座標先行決定型にしてありますが
実座標決定後立体化という方法を取った入力方式もありえるでしょう
六角大王フリー版はまさにそれですね、最初は2dレイヤーに一時的に保存しておいて
後から実座標を計算して初めて3d空間に配置する、という方法です

私のアルゴリズムで行う場合ならば

この方式の「入力方式」は導入コストは掛かりますが
もし可能になるのであればフリー六角大王から解放されることが出来ます
なぜなら左右対称空間では上の方式で六角大王と全く同じ入力方式に
(座標を確定するアルゴリズム自体は違いますが入力と結果が一緒になります)
非左右対称空間であればじかにウィンドウに線画を書いて入力可能な
入力方式になるでしょう、ただ従来のソフトに導入するにはコスト的にきついかもしれませんが

六角大王の入力方式と同様の方式の入力で左右対称から開放されることが出来る
という点では検討の価値はあるかもしれません

ただ、非常に特殊な入力方式ゆえに誰も付いてきてくれないのではないかという不安があります
(六角大王の自動立体化対称入力でさえ、受け入れられてこなかったのですから)






文責    ふたみ(futami@atariya.dojin.com.nospam nospam除去)

<戻る