少し話しが昔話になりますがフェイスライトの自作は以前からやっていて、最初に公開したのは2008年の1月。
このときの仕様は
・昼夜の2パータンでそれぞれに光量の上限値と下限値をもつ
・昼夜の2パータンでそれぞれに光の色を指定できる
・指定範囲の値で太陽または月の高さを元に光量を可変設定する
という内容でした。
暫くはこれで使っていたのですが次のような問題を抱えていました。
▲太陽または月の高さからでは昼夜は分かるけれど日の出か日の入りなのか分からない
▲太陽が真上の時(真昼)それなりに明るいが、真下の時(深夜)真っ暗なのではなく月の明かりがあって逆に明るい
そうこうしているウチにWindLightというものが導入されて、やたらと明るくなり(2008年の4月頃)
これでは太陽の東西位置から日の出/日の入りを判別するだけじゃパターン不足になると考えて
リアル時間の4時間でSLの1日という間での太陽の変化を「太陽の色の変化」として観測し、適応した補正色で補おうとか考えるようになりました。
太陽の色温度の観測(日の出編)
太陽の色温度の観測(日の入り編)
このとき既にRLVでのWindLight設定値を取得する機能があったのですが、殆どの人がRLVクライアントではなく(当時はオリジナルのRestrainedビュワー1つしか無かったので)環境もWindLight無効などが多くRLVで何かをするというのはありえませんでした。
光源で色を付けるというのを楽しんでみたりしていましたが、光が強すぎて描画が潰れてしまったりとか調整がとても面倒なものでした。
それでも太陽周期にあわせて補正をするという方式では陽が地平線より沈んでいても実は明るい日の出や日の入りに確実に対応が出来るというものでした。
しかしそれでも問題として
▲太陽や月に対して正面を向いている時と反対の時で顔に影がかかり光量の補正が合わない
これに対応すべく、「アバターが向いている方向と太陽の角度から補正量を加減する」ということをやろうとしたのですが、アバターの向きと顔の向きは必ずしも同じではないので棚上げとなりました。そして冷静に考えると、そんなにリアルタイムに補正して何になる?との自問自答で「リアルタイム補正は無駄でしかない」という結論に至ったのです。日の出や日の入りなどの環境変化のタイミングに遭遇した事があるでしょう。SLの中でのそれらは、僅か数十秒でしか発現せず、あっというまに日が沈む(陽が昇る)のです。それに昼間のほうが長いのだから端的に昼/夜の2パターンで充分だろうと・・・。
そういう考えで以降は、どんな状況でも的確に照すために光源の数と位置に拘り、3灯式で昼夜2パターンのフェイスライトに落ち着いたのです。(このライトはジャンクコーナーにあります)
そんな経歴がありましての今回、新しいロジックのフェイスライトは「環境光を直接に昼夜の判定材料にする」 という仕組みと、「光の照射についてプロジェクター方式を採用」というのが進化した部分です。
環境光とは何ぞや?
WindLight設定のアンビエントの現在値のことです。
左の画像の例ではかなり明るいけど夜なんです
こちらは同じ夜でも深夜設定
このように太陽の高さでは、どちらも夜なのに
周りの明るさが全然違うという状況ですが
アンビエントの現在値が違うので
こちらの方が暗い画面だと判断できます
なおWindLight設定の作り手によっては
環境光を下げずにガンマ値だけ下げて
夜間の演出を作っている場合もあり
環境光の数値だけでの判断は出来ません
なおWindLight設定の作り手によっては
環境光を下げずにガンマ値だけ下げて
夜間の演出を作っている場合もあり
環境光の数値だけでの判断は出来ません
昼夜対応のフェイスライトを付けていて、環境設定を深夜にしたら顔だけ光ったままだった。という状況があると思いますが、これはクライアントの環境を変化させてもSIMの太陽位置はそのままだからということに起因しています。クライアントの描画状態から周囲の明るさを判別すれば、クライアント側で設定を変えていても、ただしくフェイスライトが追従するという事。現在ではWindLight設定を個別に変える事があたりまえになっているので、もはやSIMの太陽に依存するようなフェイスライトでは役に立たないでしょう。撮影用途での固定照明としてならばそれでもいいと思いますが常用するとなるとやはり2パターンぐらいは光量調整が機能して欲しいと思います。
そのクライアントのWindLight現在値を得るのにRLVの機能を使います。具体的にはgetenv_XXX系のコマンドを使うことで調べる事が出来ます。
ここまで記事を読んでくれたあなたへプレゼント。
実際に作成し、使用しているフェイスライトを放出します。
MH+ Labs からのX'masプレゼントとしますので、その日までは椅子の上に置いておきますね。
下品な箱だとか言わないように~
(誰も六角ボルトの頭を2つ重ねて箱っぽくしたとか思わないでしょうww)
取扱説明書は含めていないので以下に記します。
■仕様
・光源数:1灯式
・光源方式:プロジェクター式(白色円形)
・光量のみ昼/夜で2パターン変化
・指定した閾値で昼夜判断
=環境光のR、G、Bの何れかが閾値(環境)以下の場合は夜と見なす
=画面ガンマが閾値(ガンマ)未満の場合は夜と見なす
=上記の何れでもない場合は昼の扱い
・ライトの更新はOn_Rez時、指定した秒数間隔、テレポートなどでのSIM変更検出時
・コントロールは取得しないのでスクリプト禁止区域ではライト更新動作停止とする
→照射範囲とか色、照射角度、強度 などプリム固定値は直接に編集する事で変えられます
→1灯式ですが、ライト設定時にLINK_SETで変更をかけるので、複数光源としたい場合はプリムを別途リンクして増やしてください。なお、その場合はルートプリムの色設定が他のプリムに全てコピーされます(子プリム毎に色や強度を変える事は出来ません)
→便宜上、プリムは編集可能、スクリプトは編集不可としていますが、プリムの編集でライトのOFFを行った場合、ライトの設定値およびプロジェクターとしている投影画像など全て光源に関する設定が破棄されてしまうのでチェックOFFしないよう注意してください
→初期状態では若干赤みが掛かった色が付けてあります
■使い方
アバターに装着(Attach)するだけ~
光量など設定値はプリムの概要説明(desc)の部分にて行います
装着位置は鼻推奨
■指定書式
全 最小値(夜);最大値(昼);更新間隔(秒);閾値(環境);閾値(ガンマ);WindLight名称;
(1) 最小値(夜);最大値(昼);更新間隔(秒);閾値(環境);閾値(ガンマ);
(2) 最小値(夜);最大値(昼);更新間隔(秒);
(3) 最小値(夜);最大値(昼);
(4) 固定値
(5) なし
→全指定および(1)の場合はRLV必須(ただしRLV未検出の場合はRLVなしとして動作)
→(2)~(5)の場合はRLVは無効でも可能(この場合はSIM太陽の高さで昼夜判断します)
→最小値(夜)、最大値(昼)は1.0~0.0の間で指定(1.0が明るさ最大、0.0は真っ暗闇)
→更新間隔は10秒以上を最低限は確保推奨。(クライアントと通信します)
→ 閾値の環境とガンマはAND条件ではなくORです。どちらかで引っかかれば発動です
→設定するWindLight名についてはOn_Rez時のみ発動します
(これは任意のWindLightを固定的に設定する機能が無いビュワーのためにあります。FireStormやSingularityのようなクライアント側で固定機能が付いている物だと弊害があるかも知れませんので、その場合は記述しないでください。なお、この設定で変更するのはRLV機能を使ってのWindLight変更設定となります)
→(4)での固定値1つだけの場合、タイマー動作は行わず常に指定値での動作となります
→(5)での全省略の場合、最小値=0.15、最大値=0.4、更新間隔=30秒 として扱います
→値の設定は概要説明(desc)の部分で行うので装着状態では変更が反映されません。
値を設定変更する場合は、いったん取り外してインベントリー上で編集するか土地にREZして概要説明(desc)の部分を変更してください
RLVと聞くとスグにエロぃ事を考えてしまう方が居るのが嘆かわしいのですが、このように「クライアント側と何かをやりとりする」という使い方もあるので色眼鏡で見て欲しくないとの思いもあります。
また、RLV機能を有効にすると誰かに勝手に裸にされたり、勝手に行動をさせられたりするのではないかとの不安を抱いている方も少なくないでしょう。はっきり言います、それは間違った認識です。RLV機能を有効にしただけでは何も起こりませんので安心してください。
RLVで環境光を調べて、いい感じになったと思ったのはつかの間の自惚れで、新たな問題点としては影付きレンダリングであるのでアバターが日影に居るのか日に当たる位置に居るのか判別が付かない事です。ま、しかたないねーw
0 件のコメント:
コメントを投稿