見出し画像

【Blender】「本当に」物理的に正しい明るさ

Blenderでは、放射シェーダーやプリンシプルBSDFを利用して、放射(Emission)を表現することができます。この入力として放射カラーと放射の強さを指定することができるのですが、この強さをどう指定すればいいかという問題があります。

まあ、普通の場合は目で見てなんとなくで指定すればいいのですが、中には「自分の感覚など一切信用できない」「物理的に正しくないと気が済まない」という方もいらっしゃるでしょう。私がそうです。

そこで放射の強さを指定する指針みたいなのがないか調べていると、以下のような記事が見つかりました。

さらにその元ネタになっているのがこちら。

これらによると、波長555.0 nmの単色光の場合、$${1.000  \mathrm{W/m^2} }$$の放射照度によって$${683.0  \mathrm{Lux}}$$の照度を得ることができます。逆に$${1.000  \mathrm{Lux}}$$の照度を得るには$${0.001464  \mathrm{W/m^2}}$$の放射照度が必要であるということがわかります。これをすべての波長で成り立つと大雑把に考えます。

以上より、ルクスの値に0.001464を掛ければ放射の強さとして使えるとのことでした。また1つ目の記事にはJIS照度基準が引用してあって、使いたい場面に応じてルクスの値を参照できるようになっています。

問題点

しかし、この方法を何も考えずに使うと、大きな問題があります。実際にやってみましょう。

レンダラーをCyclesにして、背景の強さを0にします。平面を配置して、その上にスザンヌを置き、少し上に別の小さな平面を置いて、それに放射を設定します。

シーン設定

ここで、学校の教室の明るさは最低300ルクスないといけないと言われているので、それくらいの値にしてみます。先ほどの式により、300ルクスの照度を得るには300×0.001464=0.4392を設定します。するとどうなるか。

よく見るといます

メチャクチャ暗いのです。とてもこんな場所で勉強はできませんね。お昼寝タイムどころか授業時間まるごと睡眠時間になってしまいます。

この原因は、照度(または放射照度)と、光束発散度(または放射発散度)を混同してしまったことにあると考えられます。

前者の照度は、光に照らされた部分の明るさを表すものです。それに対し、後者の光束発散度は、光源そのものの明るさを表しています。放射照度と放射発散度の違いも同様です。単位がどちらもlumen/m^2(W/m^2)なのでややこしいですが、両者は別物です。分母の面積の意味が、前者は照らされる部分の面積で、後者が光源そのものの面積という、明確な違いがあります。

ネットで調べると見つかるルクスの値は、ほとんどの場合照度を表しています。ある意味当たり前の話です。普通に暮らしていて必要となるのは照度の方で、光束発散度など知っても大した意味はありません。「勉強するときは大体500ルクス必要」などというのは、手元をそれくらい明るくしたらいいよという話で、ライト表面の明るさを考える意味はあまりありません。

しかし、ここを混同すると厄介なことになります。というのは、Blenderの放射の強さの単位がW/m^2だというのは、放射照度ではなく、放射発散度を表していると考えられるからです。放射照度は光源から距離が離れるほど小さくなる(平行光線でない場合)ため、光源の明るさを一意に指定するパラメータとしては適さないだろうというのがその根拠です。

解決策

では、どうすれば正しい明るさにすることができるのでしょうか? ここでは、平面に放射マテリアルをつけてライトとして使うことを考えます。

一番シンプルなのは、光束(ルーメン)を考えることです。電球や蛍光灯などのルーメンの値はネットで調べると出てくるので、これを最初の変換式を使って変換してやることで、放射束(W)を求めることができます。そして、平面の面積を求めて割ってやれば、正しい明るさにすることができます。

しかし、ルーメンの値がいつもわかるとは限りません。そこでルクスの値からルーメンに変換できないかということを考えます。

ここでは、理想的な状況を仮定します。まず、ルクスは距離によって変わるので、ルクスを測定した距離を知る必要があります。これは書いてあればそれを使えばいいですし、書いていなくても状況からイメージすればわかると思います。これを$${r}$$mとします。

次に、光源をスポットライトだと思って、照射角$${\theta}$$を想像します。これも比較的適当に決めて良いです。90~180度くらいが多くの場合妥当ではないかと思います。

そうしたらあとは数学です。光源の位置を中心とした、半径rの球面上に、$${\theta}$$の部分を切り取った部分の面積は、$${2\pi(1-\cos(\theta/2))r^2}$$で表すことができます(照明、もとい証明略)。

ルクス(lx)とルーメン(lm)の関係

すなわち、1ルーメンの光束による照度は、$${\frac{1}{2\pi(1-\cos(\theta/2))r^2}}$$ルクス(地面のうち光源に最も近い位置において)ということになります。逆にルクスの値に$${2\pi(1-\cos(\theta/2))r^2}$$を掛けることで、ルーメンの値にすることができます。あとは先ほどのようにルーメンからW/m^2を求めればOKです。

ここまでの議論を考慮して、300ルクス、測定距離3m、照射角180°、面積0.09 m^2のライトを設定してみました。

これが「本当に」物理的に正しい明るさの設定方法です。このシーンだと本当に300ルクスっぽい感じの見た目になってるかよくわかりませんが、少なくともさっきのように暗すぎることはなくなりました。

コサインって何!? という方のために、ノードグループを作りました。ルクスを入力し、そのルクスの測定距離、照射角、今の光源の面積を入れるとW/m^2に変換してくれます。これをそのまま放射の強さにつなげばOKです。ちなみに面積をノードから取れないかと思ったのですが、たぶんできなそうなのでセルフサービスです。

ノードグループ
使っている様子

ただ、いろいろと都合のいい仮定をしているので、シーンによってはうまくいかないかもしれません。また、このあたりの話の勉強をし始めたのは最近なので、何か間違ったことがあるかもしれません。悪しからず。

5ルクス、色は黒体の3000Kで常夜灯っぽい感じに

この記事が気に入ったらサポートをしてみませんか?