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. #下へ
direction 0. -1. -1. #下へ, 手前(南)へ, 影手前にできる
direction 0. -1. 1. #下へ,奥(北)へ, 影奥にできる
direction 1. -1. 0. #西(左)へ, 下へ, 影左にできる
direction -1. -1. 0. #東(右)へ, 下へ, 影右にできる
direction -1. -1. -1. #東(右)へ, 下へ, 手前(南)へ, 影右にできる
direction 1. -1. -1. #西(左)へ, 下へ, 手前(南)へ, 影左にできる






