ダミヌ甚の3次元Excel匏゚ンゞン



この蚘事では、3次元シヌンのレンダリングアルゎリズムをExcelの数匏マクロなしに移怍する方法を説明したす。

コンピュヌタグラフィックスに慣れおいない人のために、私はすべおのステップをできるだけ簡単か぀簡単に説明しようずしたした。 原則ずしお、数匏を理解するには、数孊の孊校コヌスの知識+ 3次元マトリックスにベクトルを掛ける胜力で十分です。

たた、任意の圢状の数匏の䜜成を緎習しおExcelファむルを生成できる小さなWebアプリケヌションを䜜成したした。

泚意カットの䞋の19枚の写真ず3枚のアニメヌション。

どうした



䞊郚のExcelファむルでは、次のセルを倉曎できたす。


カメラを回転させるには、Excelにファむルを倉曎する蚱可を䞎える必芁がありたす。

ObservableHQからExcelファむルをダりンロヌドする堎合、セルは手動でペむントする必芁がありたす。 すべおの小さな正方圢のセルを遞択し、「条件付き曞匏蚭定」→「カラヌスケヌル」を遞択する必芁がありたす。

レむマヌチング


レむマヌチングアルゎリズムは、デモシヌン甚のコンパクトな3次元゚ンゞンに関する「2぀の䞉角圢のある䞖界のレンダリング」のプレれンテヌションの埌、2008幎にむニゎキレスによっお普及したした。

その埌、 IñigoQuilezがShadertoyの Webサむトを䜜成し、 そこに投皿された䜜業のほずんどが説明された手法を䜿甚しおいたす。 これにより、䟋えばこのギャラリヌのようなフォトリアリスティックなシヌンを䜜成できるこずがわかりたした。

レむマヌチングは非垞に実装しやすく効率的なアルゎリズムで、非垞に耇雑なシヌンをレンダリングできたす。 なぜそれはビデオカヌドで䜿甚されないのですか 事実、ビデオカヌドは、レむマヌチングがそれほど効果的ではない䞉角圢で構成される3次元の図圢を扱うために研ぎ柄たされおいたす。

曎新この方法の欠点に぀いおは、 DrZlodbergからのこのコメントも参照しおください。

゚ンゞンの原理



䜕らかの圢で、これらすべおのサブタスクは3次元゚ンゞンで解決されるず思いたす。

プロパティの説明


3次元オブゞェクトを蚘述する方法は3぀ありたす。


この蚘事では、3番目のオプションの特別なケヌス、 笊号付き距離関数SDFを䜿甚したす。

SDFは空間内のポむントを受け取り、オブゞェクト内の最も近いポむントたでの距離を返したす。 内郚のポむントの堎合は、マむナス蚘号が付いたオブゞェクトの境界たでの距離に等しい

ビヌムずオブゞェクトの亀差点を芋぀ける


カメラからの光線があり、オブゞェクトずの亀点を芋぀けたいずしたす。

この点を芋぀けるには、いく぀かの方法がありたす。


しかし、ここでは別の方法を䜿甚したす Ray Marching 。

これは、SDFでのみ機胜する単玔なアルゎリズムです。



関数によっお開始からの距離で光線をパラメヌタヌ化したしょう rayt=x、y、z、、 。
それから 光線0光線 -これはカメラ自䜓です。 アルゎリズムは次のずおりです。


ここに N 䜙裕がある反埩回数。
以䞊 N 、アルゎリズムがより正確になりたす。

数 TMax これは、オブゞェクトを芋぀けるこずができるカメラからの距離です。




アルゎリズムが機胜する理由


アルゎリズムは垞にオブゞェクトずの亀点に到達したすか オブゞェクトは耇雑な圢状を持぀こずができ、他の郚分はビヌムに近づけるこずができ、アルゎリズムが亀差点に収束するのを防ぎたす。 実際、これはできたせん。オブゞェクトの他の郚分は、レむかられロ以倖の距離にある必芁がありたすそうでなければ、亀差したす。  delta>0 。 次に、SDF関数が倧きくなりたす \デルタデルタ 光線の任意の点亀差点に非垞に近い点を陀く。 したがっお、遅かれ早かれ圌は亀差点に近づきたす。


䞀方、アルゎリズムが特定のポむントに収束する堎合、隣接する反埩間の距離はれロになる傟向がありたす \右矢印右矢印 SDFオブゞェクトの最も近い点たでの距離もれロになる傟向がありたす \右矢印右矢印 限界に SDF=0\右矢印右矢印 アルゎリズムは、ビヌムずオブゞェクトの亀差点に収束したす。

亀点のピクセルの色を取埗する


各ピクセルに぀いお、オブゞェクトずの亀点を芋぀けたず想像しおください。 これらの倀぀たり、カメラから亀差点たでの距離を盎接描画しお、これらの写真を取埗できたす。



これはExcelを䜿甚しお取埗されたものであり、悪くないこずを考えるず。 しかし、色を人生のオブゞェクトを芋るようなものにするこずは䞍可胜かどうかを知りたいです。

コンピュヌタグラフィックスでは、色を蚈算する基本的な方法はフォンシェヌディングです。 Phongによれば、結果の色は、背景、ミラヌ、拡散の3぀のコンポヌネントで構成されたす。 フォトリアリスティックレンダリングに努めおいないずいう事実を考えるず、拡散コンポヌネントのみを䜿甚すれば十分です。 このコンポヌネントの匏は、 ランバヌトの法則に埓い、ピクセルの色は、衚面の法線ず光源の方向の間の角床の䜙匊に比䟋するこずを瀺しおいたす。

さらに、蚈算を簡玠化するために、光源ずカメラが同じであるず仮定したす。 次に、実際には、カメラからのビヌムずオブゞェクトの衚面の間の角床のサむンを芋぀ける必芁がありたす。


望たしい角床  varphi 図面で1぀の円匧をマヌクしたした。 そのサむンの倀は次のように瀺されたす k 。

通垞、レむマヌチング法を䜿甚する堎合、オブゞェクトの法線を芋぀けるには、次の手順を実行したす亀差点の隣の6点でSDF倀を蚈算し点の数を4に枛らすのは簡単です、この関数の募配を芋぀けたす。 これはExcelにずっお蚈算が倚すぎるように思えたので、垌望の角床を簡単に芋぀けたいず思いたす。

アルゎリズムの収束率を芋るず、ビヌムずオブゞェクト間の角床がたっすぐであれば、1回の反埩で十分であるこずがわかりたす。 角床が小さい堎合、アルゎリズムは非垞にゆっくり収束したす。

アルゎリズムの収束率に基づいお、衚面に察する角床に関する情報を取埗するこずは可胜ですか この堎合、远加の蚈算はたったく必芁ありたせん。前の反埩の倀を分析するだけで十分です。

図面を描きたす。 瀺す In そしお In+1 -アルゎリズムの隣接する反埩で埗られたポむント。 ポむントがオブゞェクトに十分に近く、プレヌン、぀たり怜玢する角床に眮き換えるこずができるず仮定したす。 させる R=SDFIn 、 r=SDFIn+1 -ポむントからの距離 In そしお In+1 飛行機に。 次に、アルゎリズムに埓っお、間の距離 In そしお In+1 等しい R 。



䞀方、 X 光線ず図圢の亀点です
InX=R/k 、そしお In+1X=r/k したがっお

R=InIn+1=InX−In+1X= fracR−rk


k= fracR−rR=1− fracrR=1− fracSDFIn+1SDFIn




぀たり、ピクセル匷床は、1から隣接する反埩のSDF関数の比率を匕いたものに等しくなりたす

シンプルな圢状を説明したす


球䜓、立方䜓、トヌラスのSDFの䟋
 sqrtx2+y2+z2−r
 max|x|、|y|、|z|−side/2、、
 sqrt sqrtx2+z2−R2+y2−r

シェむプは、軞に沿っお移動および圧瞮できたす。
キュヌブx、y+0.3、zキュヌブ、、
キュヌブx、2 cdoty、zキュヌブ、、

シェむプを結合、亀差、枛算するこずもできたす。 ぀たり、SDFは構造゜リッドゞオメトリの基本操䜜をサポヌトしたす。
 min球䜓x、y、z、立方䜓x、y、z球䜓、、、立方䜓、、
 max球䜓x、y、z、立方䜓x、y、z
 max−spherex、y、z、cubex、y、z

泚意深い読者は、いく぀かの図圢たずえば、立方䜓ず䞀郚の操䜜たずえば、圧瞮で、䞊蚘の匏が垞にオブゞェクトの最も近い点たでの距離を返すわけではないこずに気づく堎合がありたす。぀たり、正匏にはSDFではありたせん。 それにもかかわらず、それらはただSDF゚ンゞン入力に䟛絊でき、正しく衚瀺されるこずが刀明したした。

これはSDFでできるこずのほんの䞀郚です。圢状ず操䜜の完党なリストはwww.iquilezles.org/www/articles/distfunctions/distfunctions.htmにありたす。

䞊蚘のすべおの匏を組み合わせお、最初の図を取埗したす。
 min quad max|x|−0.3、|y|−0.3、|z|−0.3、− sqrtx2+y2+z2+0.375、   quad sqrt sqrtx−0.252+z−0.252−0.252+y2−0.05

ケトル匏


やかんはもう少し耇雑です蚈画が必芁です



匏を泚意深く曞き留めたす。

 min quad sqrtx2+y−0.272+z2−0.05 quad sqrtx2+2.5 cdoty2+z2−0.4、 quad sqrt sqrtx2+z2−0.32+y−0.182−0.02、 quad max qquadx+y−0.7、 qquad−y+0.09、 qquad sqrt sqrtx−0.552+y−0.092−0.12+z−0.12−0.04、 quad、 quad max qquad−−y+0.09、 qquad sqrt sqrtx−0.352+y−0.092−0.12+z−0.12−0.04、 quad、

そしお、垌望の角床を遞択したす。 完了




カメラ


残っおいるのは、画面䞊の特定のピクセルに぀いお、カメラから出おくる空間内の察応する光線を芋぀けるこずだけです。 より正確には、カメラたでの距離でこのビヌムのポむントを芋぀けるこずができる必芁がありたす。 ぀たり、関数が必芁です rays、t、d どこで s、t ピクセルの座暙であり、 d -ビヌムの開始点からの距離カメラ。

蚈算の䟿宜䞊、ピクセルの座暙は画面の䞭心を基準にしお蚭定されたす。 画面が 行 行ず cols 列、我々は内の座暙を期埅する s in left[− fraccols2、 fraccols2 right]、t in left[− fracrows2、 fracrows2\右]



次に、カメラの投圱のタむプを決定する必芁がありたす盎亀、遠近法、たたは「魚県」。 実装の耇雑さに関しおは、それらはほが同じですが、実際には最も有望なものが最も頻繁に䜿甚されるため、それを䜿甚したす。



この章のほずんどの蚈算は、たずえばカメラをある地点に眮くこずで回避できたはずです。 1、0、0 軞に沿った方向付け X 。 しかし、数字も軞に沿っお敎列しおいるずいう事実を考慮するず、結果はあたり面癜くない角床になりたす。 そのため、立方䜓の堎合、正方圢ず芋なされたす。

カメラを回転させる機胜を提䟛するには、 オむラヌ角を䜿甚しお倚くの蚈算を慎重に実行する必芁がありたす。 したがっお、入力で3぀の倉数を取埗したす。角床  alpha 角床 \ベヌタ ず距離 dist 。 それらはカメラの䜍眮ず方向の䞡方を決定したすカメラは垞に原点を芋たす。

WolframAlphaを䜿甚しお、回転行列を芋぀けたす。

 beginpmatrixxyz endpmatrix= underbrace beginpmatrix cos alpha cos beta− cos alpha sin beta sina sin beta cos beta0− cos beta sin alpha sin alpha sin beta cos alpha endpmatrixM alpha、 beta beginpmatrixx′y′z′ endpmatrix



ベクトルに適甚する堎合 dist、0、0 、カメラの座暙を取埗したすマむナスが消えた堎所を聞かないでください

 beginpmatrixcamXcamYcamZ endpmatrix=M alpha、 beta beginpmatrixdist00 endpmatrix=dist beginpmatrix cos alpha cdot cos beta sin beta sin alpha cdot cos beta endpmatrix





埌続の蚈算は、透芖投圱に固有のものになりたす。 䞻なオブゞェクトは画面です 図では赀、むタリック䜓ではテキスト。 これは、カメラの前にある距離にある想像䞊の長方圢であり、ご想像のずおり、通垞の画面のピクセルず1察1で察応しおいたす。 カメラは実際には座暙を持぀単なるポむントです camX、camY、camZ 。 ピクセルに察応する光線は、カメラのポむントから始たり、 画面䞊の察応するポむントを通過したす 。

画面には正確な堎所ずサむズがありたせん。 より正確には、それらはカメラたでの距離に䟝存したす。画面をさらに移動する堎合は、さらに行う必芁がありたす。 したがっお、カメラからスクリヌンたでの距離は1であるこずに同意したす。その埌、ベクトルの倀を蚈算できたす x0、y0、z0 カメラのポむントず画面の䞭心を接続したすカメラの䞭心ず同じです。 dist でも −1 

 beginpmatrixx0y0z0 endpmatrix=M alpha、 beta beginpmatrix−100 endpmatrix=− beginpmatrix cos alpha cdot cos beta sin beta sin alpha cdot cos beta endpmatrix



次に、 画面サむズを決定する必芁がありたす 。 これはカメラの芖野角に䟝存したす。芖野角は床単䜍で枬定され、ビデオカメラの「ズヌム」ず呌ばれるものに察応したす。 ナヌザヌは倉数を䜿甚しお蚭定したす fov 芖野。 画面は正方圢ではないため、垂盎芖野角の意味を明確にする必芁がありたす。

そのため、画面の高さを決定するには、頂点角を持぀二等蟺䞉角圢の底蟺を芋぀ける必芁がありたす fov 高さ1䞉角法を芚えお、私たちは埗る 2 tan\巊fov/2\右 。 これに基づいお、 画面䞊の1ピクセルのサむズを決定できたす 。

pixelSize= frac2 tan leftfov/2 rightrows



次に、回転行列をベクトルに適甚したす 0、0、1 そしお 0、1、0 ベクトルを取埗したす \䞊線u そしお \䞊線v 画面の氎平方向ず垂盎方向を定矩したす 蚈算を簡玠化するために、これらは事前に乗算されたす pixelSize 

 beginpmatrixuxuyuz endpmatrix=pixelSize cdotM alpha、 beta beginpmatrix001 endpmatrix=pixelSize beginpmatrix sin alpha0 cos alpha endpmatrix


 beginpmatrixvxvyvz endpmatrix=pixelSize cdotM alpha、 beta beginpmatrix010 endpmatrix=pixelSize beginpmatrix cos alpha cdot sin beta cos beta sin alpha cdot cos beta endpmatrix


したがっお、カメラを出お、座暙を持぀ピクセルに察応するビヌムの方向を芋぀けるためのすべおのコンポヌネントがありたす s、t

raydirs、t= beginpmatrixx0y0z0 endpmatrix+s beginpmatrixuxuyuz endpmatrix+t beginpmatrixvxvyvz endpmatrix



これはほずんど必芁なものです。 光線の開始点がカメラのポむントにあり、方向ベクトルを正芏化する必芁があるこずのみを考慮する必芁がありたす。

rays、t、d= beginpmatrixcamXcamYcamZ endpmatrix+d cdot fracraydirs、t lVertraydirs、t rVert


目的の機胜が埗られたした rays、t、d ある距離でビヌムのポむントを返す d 座暙を持぀ピクセルに察応する最初から s、t 。

゚クセル


結果のExcelファむルは、6枚以䞊で構成される本です。


すべおのシヌトは同じ方法で䜜成されたす。




シヌトR
  I1 
行50
  V1 
cols77
  AI1 
fov39
  AV1 
dist1,4
  BI1 
アルファ35
  Bv1 
ベヌタ20
  ** 
=(i14! XN - i13! XN < 0,00000000000001; 0,09; (0; (1; (i15! XN - i14! XN ) / (i14! XN - i13! XN ))))


シヌトN
  I1 
pixelSize=TAN(R!AI1 / 2) / (R!I1 / 2)
  ** 
=1 / ((X!A N + X! X 2; 2) + (Y!A N ; 2) + (Z!A N + Z! X 2; 2))


シヌトX
  I1 
camX=R!AV1 * COS(R!BV1) * COS(R!BI1)
  V1 
ux=-N!I1 * SIN(R!BI1)
  AI1 
vx=N!I1 * SIN(R!BV1) * COS(R!BI1)
  AV1 
x0=-COS(R!BV1) * COS(R!BI1)
  A * 
=AI1 * (() - 2 - (R!I1 + 1) / 2)
  * 2 
=AV1 + V1 * (() - 1 - (R!V1 + 1) / 2)
  ** 
=( Z 2 + A N ) * N! Z N


シヌトy
  I1 
キャミ=R!AV1 * SIN(R!BV1)
  V1 
vy=-N!I1 * COS(R!BV1)
  AI1 
y0=-SIN(R!BV1)
  A * 
=AI1 + V1 * (() - 2 - (R!I1 + 1) / 2)
  ** 
=A N * N! Z N


シヌトz
  I1 
camZ=R!AV1 * COS(R!BV1)) * SIN(R!BI1)
  V1 
uz= N!I1 * COS(R!BI1)
  AI1 
vz= N!I1 * SIN(R!BV1) * SIN(R!BI1)
  AV1 
z0=-COS(R!BV1) * SIN(R!BI1)
  A * 
=AI1 * (() - 2 - (R!I1 + 1) / 2)
  * 2 
=AV1 + V1 * (() - 1 - (R!V1 + 1) / 2)
  ** 
=( Z 2 + A N ) * N! Z N


シヌトi1
  I1 
dist0= formula( X!I1, Y!I1, Z!I1 )
  ** 
=I1 + formula( X!I1 + X! XN * I1, Y!I1 + Y! XN * I1, Z!I1 + Z! XN * I1 )


シヌトi2 、 i3 、...
  ** 
=i (n-1) ! XN + formula( X!I1 + X! XN * i (n-1) ! XN , Y!I1 + Y! XN * i (n-1) ! XN , Z!I1 + Z! XN * i (n-1) ! XN )


泚


この蚘事は、蚘事「MS Excelの数匏で曞かれた3D゚ンゞン」ずどのように関連しおいたすか

この゚ンゞンは、迷路ず楕円䜓のレンダリングにのみ適しおいたす。 䞀次元のレむキャスタヌが䜿甚され、そこから䞊䞋のストラむプが描かれ、壁の錯芚を䜜り出したす。 しかし、その埌、本栌的なゲヌムロゞックが実装されたす。ここでは、目暙は3次元゚ンゞンのみです。

Source: https://habr.com/ru/post/J353422/


All Articles