SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

万華鏡を題材に学ぶ、シミュレーションの基礎

  • X ポスト
  • このエントリーをはてなブックマークに追加

(4.3)初期化

 メインモジュールで、スクリーン上のドット座標(KS_image.get_xy)を取得し、シミュレーション(mirror_set.simulation)に渡します。初期化は、このドットとピンホールを通る光線(Appendix A)を決めることです。

図6(初期化)
図6(初期化)

(4.4)反復処理(鏡面での反射)

 ピンホールを通った光線は、万華鏡の鏡面で反射を繰り返し、最終的にオブジェクトに到達します(mirror_set.simulation)。この反射過程は、2つのステップに分けられます:

(4.4.1)光線が到達する鏡点の決定

 直進した光線ベクトルが、鏡面に到達する点を求めます。技術的には、空間内の直線と平面の交点を求める問題になります(交点は、連立一次方程式の解になる→Appendix C*2)。

*2

 シミュレーション上では、それぞれの鏡は(無限に広がった)平面として定義されます。光線と3つの鏡の間で(形式的に求められた)交点のうち、光源から最も近い点が、実際に光の到達する点になります。
 

図7(光線と鏡面との交点)
図7(光線と鏡面との交点)

(4.4.2)反射方向の決定

 光線は、鏡面に到達した点で反射し、別の方向に進んでいきます。反射方向は、入射方向と鏡の法線ベクトルによって決まります(反射方向は、入射方向を線形変換することで求められる→Appendix D)。

図8(反射方向の決定)
図8(反射方向の決定)

 プログラム上は、(4.4)と次の(4.5)がループになっています(反射点/反射方向が、新たな出発点/光線方向に置き換えられる)。このループは、(4.5)で光がオブジェクトに到達したと判定されるまで繰り返されます。

(4.5)停止条件(オブジェクトに達したかどうか)、停止時の座標取得

 プログラム上、オブジェクトはxy平面(z=0)に配置しました。光線は、z軸を下に向かって降りていき、z=0になったところで停止条件が満たされます(*3)。

*3

 プログラム上は、(4.4.1)の要領で、光線と鏡の交点を(形式的に)求めていき、得られた点のz座標の正負によって、停止条件を判定しています(z≤0ならオブジェクトに達した/z>0なら達していない)。オブジェクト上の到達点は、光源と(形式的に得られた)鏡面上の交点を按分することにより得られます。
 

図9(停止条件)
図9(停止条件)

(4.6)色の取得(オブジェクト)

 オブジェクト上の色は、KS_object.get_colorで取得しています。到達点のRGB値と、透過率αによって色が決定されます。

図10(オブジェクト上の到達点/万華鏡を下からみた図)
図10(オブジェクト上の到達点(万華鏡を下からみた図))

(4.7)色のセット(スクリーン)

 (4.6)で得られた色をKS_imageに渡し、スクリーン上の出発点の色を決めます(KS_image.set_color)。

 以上の初期化(4.3)から色のセット(4.7)までの処理を、スクリーン上のすべての点について行えば、万華鏡を通してみえる像が得られます。

 一つ一つのステップは単純ですが、万華鏡を通してみえる像を頭でイメージすることは難しく、そんな場合にシミュレーションが効果を発揮します。

 以下では応用として、万華鏡の形によって像がどのようにみえるか、いくつかの例を紹介します。

次のページ
5. いろいろな万華鏡

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

amanojackun(アマノジャクン)

大学卒業後、ウェブ/マーケティング系を中心に、統計解析/シミュレーションに携わっています。ここでは、「サイエンスと他分野の接点」という観点から記事を書かせていただきました。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7447 2013/11/29 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング