

んで、理論はあってないとしても、鏡面反射以外でまばらに拡散するのをテキトーにランダムな角度にして光の量をその数で割ってみたです。
繰り返し入るのでちょっと計算時間がかかるようになりました。
ビュー画像を見るとわかると思いますが、こんな風に手で配置できないような正確さでライトを配置していきたい。
今テキトーにやってるので壁の反対を向いたりしてて暗くなりがち。
あと前回の最初にぶつかるオブジェクトはコード的に穴があったので直しました。
とりあえずぶつかるオブジェクトだけを集めてから計算することにしました。
前のままだと intersectRay がundefinedを返すとき、距離が出せなくて比較できないため、エラーを起こしました。undefinedのとき、return falseで追跡を止めるようにさせてます。
fn refRay lgh objList refNum v_hotspot v_falloff = (
local r = lgh as ray
local obj = #()
local hitObjArray = #()
local hitLengthArray = #()
--最短距離でぶつかるオブジェクトを見つける
--まずは当たるもののみ集める
for h = 1 to objList.count do(
if (intersectRay objList[h] r) != undefined then(append hitObjArray objList[h])
)
if hitObjArray.count == 0 then(
return false --当たるものが無いときは追跡終了
)
--format "hitObjArray:%\n" hitObjArray
--最短距離のオブジェクトを探す
for i = 1 to hitObjArray.count do(
local hitLength = 0.0
hitLength = (intersectRay hitObjArray[i] r)
--format "hitLength:%:%:%\n" i hitObjArray[i].name (length (hitLength.position - lgh.position))
hitLength = (length (hitLength.position - lgh.position))
hitLengthArray[i] = hitLength
)
local minPos=(findItem hitLengthArray (amin hitLengthArray))
obj[1]=hitObjArray[minPos]
obj[2]=(amin hitLengthArray)
--format "mostNear:%:%\n" obj[1].name obj[2]
for b = 1 to 4 do(
local newLgh = freeSpot rgb:lgh.rgb shadowColor:(color 0 0 0)
local offsetPos = [1,1,1]
newLgh.position = (intersectRay obj[1] r).position
newLgh.wirecolor = green
--↓ここがとってもテキトー
newLgh.dir = -(intersectRay obj[1] r).dir-[(random -15 15),(random -15 15),(random -15 15)]
newLgh.multiplier = lgh.multiplier * 0.25
--<略>
--反射回数refNumがまだ0でなければ反射計算
if refNum > 0 then(refRay newLgh $geometry (refNum-1) v_hotspot v_falloff)
)
)
for L = 1 to lights.count do(
if (classof lights[L]) != Targetobject then(
refRay lights[L] $geometry 2 90 180
)
)
ちなみにN.LabのmaxScript環境はmax7(Eng)です。バージョンアップも道楽用にしてはそこそこ高額なのでやめてしまいました。
ボーンデジタルから出版のmentalRayの本を注文したので楽しみです。