0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

mental rayのmia_physicalsky(物理的な空) と mia_physicalsun(物理的な太陽)の向きを検討する

0
Last updated at Posted at 2026-06-27

miファイルでシーン記述

Maya2010からエクスポートしたシーン記述を編集しました。設定少しずつ分かってきました。
物理スカイ・物理サンの数理は複雑ですが、「カメラに特製のサングラスレンズ(露出)をつけ、背景に生きた空(スカイ)をはめ込み、太陽の光の矢を突き刺す」という構造がコードの繋がりから一目で分かるため、高校生にとっても最高の応用編教材になります!

verbose off
min version "3.7"
# 🔌 [プラグイン接続] mental rayに「リアルな地球の空気や太陽の光」を計算する特別な回路(シェーダー)を読み込みます
link "AdskShaderSDK.dll"
link "mayabase.dll"
link "architectural.dll"
link "base.dll"
$include "AdskShaderSDK.mi"
$include "mayabase.mi"
$include <architectural.mi>
$include <base.mi>

# =========================================================================
# ⚙️ レンダーオプション設定
# =========================================================================
options "opt"
	samples 0 2             # 綺麗にギザギザ(ジャギー)を消すアンチエイリアシングの設定です
	shadow on               # 影の計算を有効にします
	finalgather on          # 【超重要】「ファイナルギャザー」という機能です。
	                        # 空全体の青い光が地面に回り込む、リアルな「間接光(大域照明)」を計算します。
	"finalgather mode" "automatic"
	face both
end options

# =========================================================================
# ☀️ 物理的な太陽光(mia_physicalsun)の定義
# =========================================================================
light "sunShape"
	"mia_physicalsun" ( 
		"on" on, 
		"multiplier" 1.0,   # 太陽光の強さ(エネルギー)です
		"y_is_up" on,       # Y軸を「上空」として扱います
		"rgb_unit_conversion" 0.0001 0.0001 0.0001 
	)
	# 📍 太陽光の向き(光の矢の目的地):
	# [-1, -1, -1] なので、「左(西)へ、下へ、手前(南)へ」向かって斜め45度で突き刺さる、朝方の光です!
	direction -1. -1. -1.
end light

# 💡 太陽をシーンに配置するためのスタンド(インスタンス)です。今回は回転なしのクリーンな状態にしています。
instance "sunDirection" "sunShape"
	transform
		1. 0. 0. 0.
		0. 1. 0. 0.
		0. 0. 1. 0.
		0. 0. 0. 1.
end instance

# =========================================================================
# 🕶️ トーンマッピング(mia_exposure_simple)の定義
# =========================================================================
# 物理的な空や太陽は、普通のライトに比べて「何万倍も眩しい」超高エネルギーを持っています。
# そのままだと画面が真っ白に白飛びしてしまうため、このシェーダーが「人間の目やカメラのレンズ」の代わりになって、
# 眩しさをちょうどいい明るさに自動で引き締める(露出調整をする)フィルターの役割を果たします。
shader "mia_exposure_simple1"
	"mia_exposure_simple" (
		"gain" 0.1,         # 画面全体の明るさの調整弁です
		"gamma" 2.2         # 画面の暗い部分を人間の目に合わせて自然に持ち上げる、おなじみのガンマ値です
		)

# =========================================================================
# 🌤️ 物理的な空(mia_physicalsky)の定義
# =========================================================================
# 太陽の位置を自動的に感知して、地平線から天頂までの「本物の空のグラデーション」を自動生成する贅沢なシェーダーです。
shader "mia_physicalsky1"
	"mia_physicalsky" (
		"on" on,
		"multiplier" 0.5,
		"rgb_unit_conversion" 0.0001 0.0001 0.0001 1.,
		"redblueshift" -0.3, # 空の「青み」の調整です。数値をいじると夕焼け空っぽくすることもできます
		"ground_color" 0.2 0.2 0.2 1., # 地平線より下の「大地の基本色」です
		"sun" "sunDirection",# 【超重要】上で作った太陽のインスタンス「sunDirection」とここでリンク(合体)させます!
		"sun_disk_scale" 4., # 画面に映り込む「太陽の丸いお皿(光源)」の大きさです
		"y_is_up" on
		)


# =========================================================================
# 🎥 カメラ設定(映画の「ショット」を決める監督の視点!)
# =========================================================================
camera "cam"
    output "rgba" "mi01day.tif"
    focal 50.0
    aperture 36.0
    aspect 1.33333
    resolution 640 480
  
    # 🔗 カメラのレンズの前に、さっき作った「露出フィルター」と「リアルな空の背景」をカチッと装着します!
    lens = "mia_exposure_simple1"
    environment = "mia_physicalsky1"
end camera

# カメラを配置するトランスフォーム行列です
instance "cam_inst" "cam"
    transform       -1.0000 0.0000 0.0000 0.0
                    0.0000 0.9806 0.1961 0.0
                    0.0000 0.1961 -0.9806 0.0
                    -0.0000 -4.9029 -26.4757 1.0
end instance

# =========================================================================
# 🎨 マテリアル(質感)と 📐 ジオメトリ(型紙)の定義
# =========================================================================
# ※(ここは前回の「たい焼きの型」のフェーズと同じです。地面用の白いマットと、球体・立方体の型を準備しています)
light "env_light"
    "mib_light_infinite" ( "color" 0.8 0.8 0.8, "shadow" on )
end light

instance "env_light_inst" "env_light"
    transform       -0.7071 0.5774 -0.4082 0.0
                    0.0000 0.5774 0.8165 0.0
                    0.7071 0.5774 -0.4082 0.0
                    0.0000 0.0000 -122.4745 1.0
end instance

material "red_plastic"
    "mib_illum_phong" ( "ambient" 0.0 0.0 0.0, "diffuse" 0.8 0.2 0.2, "specular" 0.9 0.9 0.9, "exponent" 50.0, "lights" ["env_light_inst"] )
end material

material "white_matte"
    "mib_illum_phong" ( "ambient" 0.1 0.1 0.1, "diffuse" 0.7 0.7 0.7, "specular" 0.1 0.1 0.1, "exponent" 10.0, "lights" ["env_light_inst"] )
end material

object "sphere_geo" visible shadow trace tag 1
    basis "bs" bspline 3
    group
             0.0000  5.0000  0.0000          0.7957  5.0000  1.3781
            -0.7956  5.0000  1.3781         -1.5913  5.0000  0.0000
            -0.7957  5.0000 -1.3781          0.7956  5.0000 -1.3781
             1.5913  5.0000  0.0000          2.3448  3.9181  4.0613
            -2.3448  3.9181  4.0613         -4.6896  3.9181  0.0000
            -2.3448  3.9181 -4.0613          2.3448  3.9181 -4.0613
             4.6896  3.9181  0.0000          3.3276  0.0000  5.7636
            -3.3276  0.0000  5.7636         -6.6552  0.0000  0.0000
            -3.3276  0.0000 -5.7636          3.3276  0.0000 -5.7636
             6.6552  0.0000  0.0000          2.3448 -3.9181  4.0613
            -2.3448 -3.9181  4.0613         -4.6896 -3.9181  0.0000
            -2.3448 -3.9181 -4.0613          2.3448 -3.9181 -4.0613
             4.6896 -3.9181  0.0000          0.7957 -5.0000  1.3781
            -0.7956 -5.0000  1.3781         -1.5913 -5.0000  0.0000
            -0.7957 -5.0000 -1.3781          0.7956 -5.0000 -1.3781
             1.5913 -5.0000  0.0000          0.0000 -5.0000  0.0000

            v 0     v 1     v 2     v 3     v 4     v 5     v 6     v 7
            v 8     v 9     v 10    v 11    v 12    v 13    v 14    v 15
            v 16    v 17    v 18    v 19    v 20    v 21    v 22    v 23
            v 24    v 25    v 26    v 27    v 28    v 29    v 30    v 31

            surface "surf" ""
                    "bs" 0 6   -3. -2. -1. 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
                    "bs" 0 4    0.  0.  0. 0. 1. 2. 3. 4. 4. 4. 4.

                    31 31 31 31 31 31 31 31 31 26 25 30 29 28 27 26
                    25 30 20 19 24 23 22 21 20 19 24 14 13 18 17 16
                    15 14 13 18  8  7 12 11 10  9  8  7 12  2  1  6
                     5  4  3  2  1  6  0  0  0  0  0  0  0  0  0

            approximate surface parametric 3 3 "surf"
    end group
end object

object "ground_geo" visible trace shadow tag 1
    group
        -50.0  0  -50.0
        -50.0  0   50.0
         50.0  0  -50.0
         50.0  0   50.0
        v 0  v 1  v 2  v 3
        p "white_matte" 0 1 3 2
    end group
end object

object "cube_geo" visible trace shadow tag 2
    group
        -5 -5 -5
         5 -5 -5
        -5 -5  5
         5 -5  5
        -5  5 -5
         5  5 -5
        -5  5  5
         5  5  5
        v 0 v 1 v 2 v 3 v 4 v 5 v 6 v 7
        p "red_plastic" 0 1 5 4
        p "red_plastic" 1 3 7 5
        p "red_plastic" 3 2 6 7
        p "red_plastic" 2 0 4 6
        p "red_plastic" 4 5 7 6
        p "red_plastic" 2 3 1 0
    end group
end object

# =========================================================================
# 🎬 配置(型紙を空間に呼び出して、本物のたい焼きとして並べる!)
# =========================================================================

# 世界の中心に白い地面を敷きます
instance "ground_inst" "ground_geo"
    material "white_matte"
    transform       1 0 0 0   0 1 0 0   0 0 1 0   0 0 0 1
end instance

# 🔴 球体の型紙(sphere_geo)から「sphere_inst」を取り出して、高さ-5(地面のすぐ上)へ配置します
instance "sphere_inst" "sphere_geo"
    material "red_plastic"
    transform       1.0000 0.0000 0.0000 0.0000
                    0.0000 1.0000 0.0000 0.0000
                    0.0000 0.0000 1.0000 0.0000
                    0.0000 -5.0000 0.0000 1.0000
end instance

# =========================================================================
# ⚙️ 撮影ステージ(instgroup)の組み立てと、本番レンダリング
# =========================================================================
# 💡 ココがポイント!:ステージのメンバー(scene)の中に、普通のオブジェクトだけでなく、
# 太陽の光のスタンドである「 "sunDirection" 」もしっかりと並び立たせています!
instgroup "scene"
    "cam_inst"
    "env_light_inst"
    "ground_inst"
    "sphere_inst"
    "sunDirection"
end instgroup

# よーい、スタート! 組み立てたステージ(scene)を、特製レンズをつけたカメラ(cam_inst)で最高画質でパシャリと撮影します!
render "scene" "cam_inst" "opt"

3D空間の軸(X, Y, Z)を、世界の方角(東西、上下、北南)に当てはめてみましょう。

X軸(左右): プラスなら「東(右)」、マイナスなら「西(左)」

Y軸(上下): プラスなら「空(上)」、マイナスなら「地(下)」

Z軸(前後): プラスなら「奥(北)」、マイナスなら「手前(南)」

  • direction 1. -1. 0. の場合:
    光の矢は プラスX(右・東) に向かって飛びます。
    すると、光に押し出されるように、オブジェクトの影も プラスX(右・東) の方向へ伸びます。
    カメラ(手前)から画面を見ると、「(画面の)右側に影ができる」 ことになります。

つまり、「数値のプラスマイナス」と「影ができる方角(左右・前後)」は完全にそのまま一致する のです!


☀️ 【完全版】direction と影の連動マップ

高校生に教えるときは、ややこしい太陽の位置(東西南北)で教えるよりも、「入力した数字の方向に、そのまま影のスタンプが押し出されるよ!」 と教えるのが一番ブレなくて確実です。

設定数値 [X, Y, Z] 光の矢が向かう方向 🎬 レンダリングされる影の向き
0. -1. 0. 下へ 真下にできる(影が一番小さくなる正午)
0. -1. -1. 下へ、手前へ 手前(手前側)にできる(自分に向かって伸びる影)
0. -1. 1. 下へ、奥へ 奥(画面の奥)にできる
1. -1. 0. 右へ、下へ 右(画面の右側)にできる
-1. -1. 0. 左へ、下へ 左(画面の左側)にできる
-1. -1. -1. 左へ、下へ、手前へ 左手前(画面の左手前側)にできる
1. -1. -1. 右へ、下へ、手前へ 右手前(画面の右手前側)にできる

🎓 高校生への解説の切り口

「太陽の位置を想像しようとすると、東から昇って西に沈んで……と頭が混乱しちゃうよね。
だけど、mental rayのルールは超シンプル!
direction の [X, Y, Z] に入れた数字のプラスマイナスが、そのまま『影が伸びていく方向』の矢印になるんだ。

  • Xに 1(プラス)を入れたら、影はに伸びる。
  • Xに -1(マイナス)を入れたら、影はに伸びる。
  • Zに 1(プラス)を入れたら、影はに伸びる。
  • Zに -1(マイナス)を入れたら、影は手前に伸びる。

Yだけは、光を地面に叩きつけなきゃいけない(夜にしちゃいけない)から、いつも -1(下向き)にしておこうね!」

direction 0. -1. 0. #下へ

d0_-1_0.png

direction 0. -1. -1. #下へ, 手前(南)へ, 影手前にできる

d0_-1_-1.png

direction 0. -1. 1. #下へ,奥(北)へ, 影奥にできる

d0_-1_1.png

direction 1. -1. 0. #西(左)へ, 下へ, 影左にできる

d1_-1_0.png

direction -1. -1. 0. #東(右)へ, 下へ, 影右にできる

d-1_-1_0.png

direction -1. -1. -1. #東(右)へ, 下へ, 手前(南)へ, 影右にできる

d-1_-1_-1.png

direction 1. -1. -1. #西(左)へ, 下へ, 手前(南)へ, 影左にできる

d1_-1_-1.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?