寄付窓口はこちら

PixarのようなグラフィックをSwiftで実現する | try! Swift Tokyo 2019 1-9

このトークでは、簡単な光線追跡をSwiftを使ってゼロから作る際に直面する障害についてお話します。光線追跡法は、アニメーションフィルム産業を席巻する、Pixarのあの悪名高いRendermanの3Dレンダリング技術の基礎となっています。これは、光線の物理モデルと、オブジェクトと表面の相互作用によるものです。

昨今では、NVIDIAのRTXのような、より強力で特化したハードウェアによって、リアルタイムでの光線追跡の分野には新たな関心が寄せられています。 著名なプログラマーであるJohn Carmackさえ、コンピューターグラフィックと光線追跡の未来について尋ねられた際、「全ての道はローマに続く」と述べています。

私は、伝統的なグラフィックラスタライザーに取り組むのを楽しむ一方で、いつも、物理的にモデリングされた光に興味を持ち、それにまつわるプロセスについて学びたいと思ってきました。

ここでは、私がどのようにシンプルな場面を描画する光線追跡をプログラムしたかについて話します。これは、多芸なSwiftを試すのにいい機会となるでしょう。

f:id:niwatako:20190321145721j:plain

20分のプレゼンの中で答えていきます。質問があればZOZOブースへ来てください。

f:id:niwatako:20190321145825j:plain

まずは動画を見てください

f:id:niwatako:20190321145840j:plain

これはピクサーアニメーションで使われた技術と同じものを使っています。

レンダリングテクニック、ray tracingを使っています。

なぜSwiftでやるのか?

f:id:niwatako:20190321145917j:plain

今までやったことがないことをやりたかった。

基本言語としてどうなのか、いちからray tracerを作りました。

根本的な数式とSwiftで書くとどうなるか

f:id:niwatako:20190321145946j:plain

f:id:niwatako:20190321145950j:plain

いつ光線が交差するか、シーンに何千も光線を投げるので、どれが球体にヒットするかを計算する

球体表面をヒットするtを求める

f:id:niwatako:20190321150039j:plain

f:id:niwatako:20190321150051j:plain

これを2時方程式にしていくことが出来る

f:id:niwatako:20190321150112j:plain

f:id:niwatako:20190321150125j:plain

f:id:niwatako:20190321150129j:plain

放射線状を交差するときに解がでてくる

1,2,もしくは0

f:id:niwatako:20190321150148j:plain

Swiftで見ていくと

f:id:niwatako:20190321150203j:plain

判別式を使ってみていく、どれだけの解があるかを表す。

distance checkで3D空間での交差点を見つける

f:id:niwatako:20190321150246j:plain

f:id:niwatako:20190321150256j:plain

f:id:niwatako:20190321150301j:plain

f:id:niwatako:20190321150306j:plain

興味があればGithubをチェックしてください。数学的にわからなくても心配しないでください。自分の領域を知るために時間を費やすことは貴重です。もっと話したければZOZOブースに来てください。