


鏡面反射では入射角と反射角が等しくなるってことでいいんですかね?
Wiki 反射
http://ja.wikipedia.org/wiki/%E5%8F%8D%E5%B0%84
理科ってこんな風にかなり素直な現象も多いよな。
そういえば仮定してから証明するって言ってたな。
前回までは当たった面に垂直に跳ね返っていましたが、今回の修正で入射角と同じ反射角をつけました。
fn refRay lgh objList refNum v_hotspot v_falloff = (
local r = lgh as ray
local obj = #()
local hitObjArray = #()
local hitLengthArray = #()
--<略>
local minPos=(findItem hitLengthArray (amin hitLengthArray))
obj[1]=hitObjArray[minPos]
obj[2]=(amin hitLengthArray)
local newLgh = freeSpot rgb:lgh.rgb shadowColor:(color 0 0 0)
newLgh.position = (intersectRay obj[1] r).position
newLgh.wirecolor = green
newLgh.dir = -(intersectRay obj[1] r).dir + (newLgh.position-lgh.position)
--<略>
--入射角と同じく反射するために、
--面に垂直なPointオブジェクトrotPointを作成してライトの親とし、ローカルで180度回転する。
local rotPoint = Point pos:((intersectRay obj[1] r).position) isSelected:on
rotPoint.dir = -(intersectRay obj[1] r).dir
newLgh.parent = rotPoint
newLgh.target.parent = rotPoint
in coordsys local
Rotate rotPoint (EulerAngles 0 0 180)
delete rotPoint --回転したら要らないので捨てる。
--反射回数refNumがまだ0でなければ反射計算
if refNum > 0 then(refRay newLgh $geometry (refNum-1) v_hotspot v_falloff)
)
今回工夫した点は科学力のなさを痛感します。
入射角と同じ反射角にするために、面に垂直なポイントrotPointを作成、それに新しく発生したライトをリンクして、ローカルZ軸で(in coordsys local)くりんと180度回転させた後に捨てます。
次はこの反射角の軸の周りに少しずつ角度をずらしたライトに拡散(分散)したいです。
まぁそれはそうと、21時ころまで明日休日と勘違いしてた。