
рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдХ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рддреАрди рдЖрдпрд╛рдореА рджреГрд╢реНрдп рдЦреАрдВрдЪрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред рдмреЗрд╢рдХ, рдпрд╣ рдХрд╛рдлреА рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд┐рд░рдг рдЯреНрд░реЗрд╕рд░ рдмрд╣реБрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЪрд┐рддреНрд░ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ
рдЕрд╡рддрд╛рд░ ред
рдПрдХ рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдХ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рднреА рд▓рд┐рдЦреЗрдВред рдЪрд┐рддреНрд░ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рдВрд▓рдЧреНрди рд╣реИрдВред
рддреНрд░рд┐-рдЖрдпрд╛рдореА рджреГрд╢реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ?
рдЖрдЬ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдПрдХ рдлреНрд▓реИрдЯ рд╕реНрдХреНрд░реАрди рдкрд░ рддреАрди рдЖрдпрд╛рдореА рджреГрд╢реНрдпреЛрдВ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЙрдирдХрд╛ рд╡рд┐рдЪрд╛рд░ рднреА рд╕рд░рд▓ рд╣реИ, рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рд╡рд╣ рдкреЗрдВрдЯ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рддрд╕реНрд╡реАрд░ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЦреЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рд╣реИ, рд░реАрдЯреНрд░реИрдХреНрдЯрд┐рдВрдЧред рдпрд╣ рдмрд╕ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЫрд╛рдпрд╛, рдкреНрд░рддрд┐рдмрд┐рдВрдм, рдЕрдкрд╡рд░реНрддрди рдФрд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд╢ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЦреЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░реЗрдЕрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдХрд┐рддрдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИрдВ, рдареАрдХ рдЙрд╕реА рд╕рдордп рдХрдИ рдмрд╛рд░ рддреНрд╡рд░рдг рд╣реЛрдЧрд╛ред
рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЖрдЗрдбрд┐рдпрд╛
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рдореЙрдирд┐рдЯрд░ рдкрд░ рдмреИрдареЗ рд╣реИрдВ, рд╡рд╣ рдЦрд┐рдбрд╝рдХреА рд╣реИ, рдФрд░ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдкреАрдЫреЗ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рджреГрд╢реНрдп рд╣реИред рдореЙрдирд┐рдЯрд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рд░рдВрдЧ рдХрд┐рд░рдг рдХрд╛ рд░рдВрдЧ рд╣реИ рдЬреЛ рдЖрдВрдЦ рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдЙрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд░рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрд┐рд░рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд░рдг рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдБ рдЯрдХрд░рд╛рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд╛рдо: рдХрд┐рд░рдг-рдЕрдиреБрд░реЗрдЦрдг - рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдгред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреЛ рдмреАрдо рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ - рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рджреЛ рдмрд┐рдВрджреБ - рд╕рддрд╣ рдХреЗ рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдмреАрдо рдЧрд┐рд░рддрд╛ рд╣реИред рдХрд┐рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЙрдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рддреАрди рд╣реИрдВ:
- рд╕рд╛рджрд╛ рд╕рддрд╣ред рдЬрдм рдПрдХ рдХрд┐рд░рдг рдЗрд╕ рд╕реЗ рдЯрдХрд░рд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд░рдг рдХрд╛ рд░рдВрдЧ рдЗрд╕ рд╕рддрд╣ рдХрд╛ рд░рдВрдЧ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓рд╛ рд╣реИред
- рдкреНрд░рддрд┐рдмрд┐рдВрдмред рдПрдХ рдХрд┐рд░рдг рдПрдХ рджрд░реНрдкрдг рд╕реЗ рдЯрдХрд░рд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдПрдХ рд╣реА рдХреЛрдг рдкрд░ рдЙрдЫрд▓ рд╕рдХрддреА рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмреАрдо рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдЕрдкрд╡рд░реНрддрдиред рдПрдХ рдХрд┐рд░рдг рджреЛ рдореАрдбрд┐рдпрд╛ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╡рд╛ рд╕реЗ рдкрд╛рдиреА рддрдХред рдПрдХ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ рдкрд░ рдХрд┐рд░рдг рдЕрдкрд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдЕрдкрд╡рд░реНрддрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд░реЗрдЦрд╛рдкреБрдВрдЬ рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рд╕реНрдерд▓
рдордВрдЪ рдкрд░ рджреЛ рддрд░рд╣ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реЛрддреА рд╣реИрдВ: рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдкрд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЧреЗрдВрджреЗрдВ, рдХреНрдпреВрдмреНрд╕ (рдкреИрд░реЗрд▓реНрд▓реЗрдкрд┐рдкреЗрдбреНрд╕) рдФрд░ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдмрд┐рдВрджреБ рд╕реНрд░реЛрдд рд╣реЛрдВрдЧреЗ рдЬреЛ рдЙрдирдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЪрдордХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рд╡рд┐рд╖рдп рдореЗрдВ рддреАрди рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рддреАрди рддрд░реАрдХреЗ рд╣реИрдВ:
- рдорд╛рдирдХ (рдкреА) рдкреА рдкрд░ рд╡рд╕реНрддреБ рдХреА рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рд╣рд░реА рд╣реИ рдФрд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ 1 рд╣реИред
- color (p) рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдмрд┐рдВрджреБ p рдкрд░ рд╡рд╕реНрддреБ рдХреА рд╕рддрд╣ рдкрд░ рдХреМрди рд╕рд╛ рд░рдВрдЧ рд╣реИред
- рдЯреНрд░реЗрд╕ (рдХрд┐рд░рдг) рдХрд┐рд░рдг рдХрд┐рд░рдг рдХреЗ рд╕рд╛рде рдЬрд╛рддреА рд╣реИ рдФрд░ рд░реБрдХ рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдВ рдХрд┐рд░рдг рд╡рд╕реНрддреБ рдХреА рд╕рддрд╣ рдХреЛ рдХрд╛рдЯрддреА рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдмреАрдо рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдмрд┐рдВрджреБ рддрдХ рджреВрд░реА рд▓реМрдЯрд╛рддреА рд╣реИред
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
sphere.norm = function(at) { return vec.mul(1 / this.r, vec.sub(at, this.q)) } sphere.trace = function(ray) { var a = ray.from var aq = vec.sub(a, this.q) var ba = ray.dir var aqba = vec.dot(aq, ba) if (aqba > 0) return var aq2 = vec.dot(aq, aq) var qd = aq2 - this.r * this.r var D = aqba * aqba - qd if (D < 0) return var t = qd > 0 ? -aqba - Math.sqrt(D) : -aqba + Math.sqrt(D) var sqrdist = t * t var at = vec.add(a, vec.mul(t, ba)) return {at:at, sqrdist:sqrdist} } sphere.color = function(p) { return [1, 0, 0]
рдЗрд╕ рддрд░рд╣, рдЬреИрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрдХреЗрддрди рдХрд╛ рдЕрд░реНрде рдЕрдм рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ: рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдЗрди рддреАрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдПрдХ рдШрди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд░реЗ рдЯреНрд░реЗрд╕рд░
рдЕрдм рд░реЗ рдЯреНрд░реЗрд╕рд░ рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдХрдИ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдп рд╣реИрдВ:
- рдЯреНрд░реЗрд╕ (рдХрд┐рд░рдг) рдХрд┐рд░рдг рдХрд┐рд░рдг рдХреЗ рд╕рд╛рде рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рдХрд┐рд░рдг рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд░ рдХрд░рддреА рд╣реИ, рд╡рд╣реАрдВ рд░реБрдХ рдЬрд╛рддреА рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рдмреАрдо рдХреЗ рдирд┐рдХрдЯрддрдо рдЪреМрд░рд╛рд╣реЗ рдХреЛ рдвреВрдВрдврддрд╛ рд╣реИред рдЯреНрд░реЗрд╕ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдЙрд╕рд╕реЗ рджреВрд░реА, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рд╡реЗ рдкрд╛рд░ рдХрд░ рдЧрдП рдереЗ, рдЙрд╕рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рд╣реИ:
rt.trace = function(ray) { var p for (var i in rt.objects) { var obj = rt.objects[i] var ep = obj.trace(ray) if (ep && (!p || ep.sqrdist < p.sqrdist)) { p = ep p.owner = obj } } return p }
- inshadow (p, lightpos) рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд╢ рдмрд┐рдВрджреБ рдкрд░ p рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рдЫрд╛рдпрд╛ рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд╢ рдкреА рдкрд░ рдЪрдордХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:
rt.inshadow = function(p, lightpos) { var q = rt.trace(rt.ray(lightpos, p)) return !q || vec.sqrdist(q.at, p) > math.eps }
рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЗрдЯрдк рд╕реЗ рдкреА рддрдХ рдПрдХ рдХрд┐рд░рдг рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд░рдг рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрд╣рд╛рдВ рддрдХ тАЛтАЛрдкрд╣реБрдВрдЪрд╛рддреА рд╣реИред рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪреМрд░рд╛рд╣реЗ рдмрд┐рдВрджреБ рдмрд┐рдВрджреБ рдкреА рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдХрд╛рд╢ рдХреА рдХрд┐рд░рдг рдкреА рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреА рд╣реИред
- рд░рдВрдЧ (рдХрд┐рд░рдг) рдПрдХ рдХрд┐рд░рдг рдХрд┐рд░рдг рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдХрд╣рд╛рдВ рдЯрдХрд░рд╛рдПрдЧрд╛ред рдЯрдХреНрдХрд░ рдмрд┐рдВрджреБ рдкрд░, рдпрд╣ рд╕рддрд╣ рдХреЗ рд░рдВрдЧ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:
rt.color = function( r ) { var hit = rt.trace( r ) if (!hit) return rt.bgcolor hit.norm = hit.owner.norm(hit.at) var surfcol = rt.diffuse(r, hit) || [0, 0, 0] var reflcol = rt.reflection(r, hit) || [0, 0, 0] var refrcol = rt.refraction(r, hit) || [0, 0, 0] var m = hit.owner.mat
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрдЯрддрдо рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХрд┐рд░рдг рдХреА рдЯрдХреНрдХрд░ рдХрд╛ рдмрд┐рдВрджреБ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рддрд╣ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ (рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдмрд┐рдВрджреБ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛, рддреЛ рдХрд┐рд░рдг рдиреЗ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЖрдк рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рд░рдВрдЧ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд▓рд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЯрдХреНрдХрд░ рдмрд┐рдВрджреБ рдкрд░, рд░рдВрдЧ рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рдлреИрд▓рд╛рдирд╛ - рд╕рддрд╣ рдХрд╛ рд░рдВрдЧ рд╣реА, рдХреЛрдгреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдмрд┐рдВрджреБ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдФрд░ рдЬрд┐рд╕ рдХреЛрдг рдкрд░ рдХрд┐рд░рдг r рдЙрд╕ рдкрд░ рдЧрд┐рд░рддрд╛ рд╣реИ, рд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
- рдкреНрд░рддрд┐рдмрд┐рдВрдм - рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рдХрд╛ рд░рдВрдЧред
- рдЕрдкрд╡рд░реНрддрди - рдЕрдкрд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рдХрд╛ рд░рдВрдЧред
рдЗрди рддреАрди рднрд╛рдЧреЛрдВ рдХреЛ рд╡рдЬрд╝рди рдХреЗ рд╕рд╛рде рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╕рд░рдлреЛрд▓ рдХреЗ рд╕рддрд╣ рдХреЗ рд░рдВрдЧ рдХрд╛ рд╡рдЬрди m.surface рд╣реИ, рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рд░рд┐рдлреНрд▓реЗрдХ рдХрд╛ рд░рдВрдЧ m.reflection рд╣реИ, рдФрд░ рдЕрдкрд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рдХрд╛ рд░рдВрдЧ m.translive рд╣реИред рднрд╛рд░рд┐рдд рдХрд╛рд░рдХреЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реИ 1. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ m.transparency = 0 рд╣реИ, рддреЛ рдпрд╣ рдЕрдкрд╡рд░реНрддрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред рдлреИрд▓рд╛рдирд╛, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдЕрдкрд╡рд░реНрддрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВред рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред
рд▓реИрдореНрдмрд░реНрдЯ рдореЙрдбрд▓
рдпрд╣ рд╕рддрд╣ рдХреЗ рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рд╣реИ, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд░рдВрдЧ рд╕реНрд░реЛрдд рдХреИрд╕реЗ рдЪрдордХрддрд╛ рд╣реИред рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рдмрд┐рдВрджреБ рдХрд╛ рдкреНрд░рдХрд╛рд╢ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╢рдХреНрддрд┐ рдФрд░ рдХреЛрдг рдХреЗ рдХреЛрд╕рд╛рдЗрди рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдмрд┐рдВрджреБ рдкрд░ рдЪрдордХрддрд╛ рд╣реИред рдЖрдЗрдП рд▓реИрдореНрдмрд░реНрдЯ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдлреИрд▓рд╛рдирд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ:
rt.diffuse = function(r, hit) { var obj = hit.owner var m = obj.mat var sumlight = 0 for (var j in rt.lights) { var light = rt.lights[j] if (rt.inshadow(hit.at, light.at)) continue var dir = vec.norm(vec.sub(hit.at, light.at)) var cos = -vec.dot(dir, hit.norm) sumlight += light.power * cos } return vec.mul(sumlight, obj.color) }
рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╣рд┐рдЯ рдмрд┐рдВрджреБ рдЫрд╛рдпрд╛ рдореЗрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдпрд╣ рдкреНрд░рдмреБрджреНрдз рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реИ, рддреЛ рд╡реЗрдХреНрдЯрд░ рдбрд╛рдпрд░ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ - рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд╢ рд╕реЗ рд╣рд┐рдЯ рдмрд┐рдВрджреБ рддрдХ рджрд┐рд╢рд╛ред рдлрд╝рдВрдХреНрд╢рди рддрдм рд╣рд┐рдЯ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреЗ рдХреЛрд╕рд╛рдЗрди рдХреЛ рдвреВрдБрдврддрд╛ рд╣реИред рд╣рд┐рдЯ рдореЗрдВ рд╕рддрд╣ рдкрд░ рдФрд░ рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ред рдпрд╣ рдХреЛрд╕рд╛рдЗрди рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж dir тАв hit.norm рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд▓реИрдореНрдмрд░реНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд░реЛрд╢рдиреА рдкрд╛рддрд╛ рд╣реИ: light.power тАв cosред
рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд╢ рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

рдлреЛрдВрдЧ рдореЙрдбрд▓
рд▓реЛрдВрдЧрдмрд░реНрдЯ рдореЙрдбрд▓ рдХреА рддрд░рд╣ рдлреЛрдВрдЧ рдореЙрдбрд▓, рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд▓реИрдореНрдмрд░реНрдЯ рдореЙрдбрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдореЙрдбрд▓ рдЗрд╕ рдмрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рддрд╣ рдХреЛ рдХрд┐рд╕ рдХреЛрдг рдкрд░ рджреЗрдЦрддреЗ рд╣реИрдВред рдлреЛрдВрдЧ рд░реЛрд╢рдиреА рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:
- рд╣рдо рд╕рддрд╣ рдкрд░ рд╕рд╡рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╕реЗ рдмрд┐рдВрджреБ рддрдХ рдПрдХ рдХрд┐рд░рдг рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдХрд┐рд░рдг рдХреЛ рд╕рддрд╣ рд╕реЗ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред
- рд╣рдо рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдмреАрдо рдФрд░ рдЙрд╕ рджрд┐рд╢рд╛ рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХрд╛ рдХреЛрд╕рд╛рдЗрди рдкрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рддрд╣ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред
- рдЗрд╕ рдХреЛрд╕рд╛рдЗрди рдХреЛ рдХреБрдЫ рд╕реАрдорд╛ рддрдХ рдмрдврд╝рд╛рдПрдВ рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╢рдХреНрддрд┐ рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВред
рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рддрд╣ рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдХреА рд╕реНрдкрд╖реНрдЯ рд░реЛрд╢рдиреА рдЕрдзрд┐рдХрддрдо рд╣реЛрдЧреА рдпрджрд┐ рд╣рдо рдЗрд╕ рд╕рддрд╣ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рджреЗрдЦрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдпрд╣ рдЖрдВрдЦ рдореЗрдВ рд╕рд╣реА рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреНрд░рд╕рд╛рд░ рдХреЛрдб:
rt.diffuse = function(r, hit) { var obj = hit.owner var m = obj.mat var sumlight = 0 for (var j in rt.lights) { var light = rt.lights[j] if (rt.inshadow(hit.at, light.at)) continue var dir = vec.norm(vec.sub(hit.at, light.at)) var lr = vec.reflect(dir, hit.norm) var vcos = -vec.dot(lr, r.dir) if (vcos > 0) { var phong = Math.pow(vcos, m.phongpower) sumlight += light.power * phong } } return vec.mul(sumlight, obj.color) }
рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЪреНрдЫреА рд░реЛрд╢рдиреА рдХреЗ рд▓рд┐рдП рдЕрдХреЗрд▓реЗ рдлреЛрдВрдЧ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рд╡реЗрдЯ рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдлреЛрдВрдЧ рд▓рд╛рдЗрдЯрд┐рдВрдЧ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрд▓рдЧ рд╡реЗрдЯ рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд▓реИрдореНрдмрд░реНрдЯ рд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрди рдЪрд┐рддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ:

рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рдбрд┐рдлреНрдпреВрдЬрд╝ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ: рдпрд╣ рдкрд┐рдЫрд▓реЗ рджреЛ рдбрд┐рдлреНрдпреВрдЬрд╝ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ rt.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдмрд┐рдВрдм
рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдХрд┐рд░рдг рдХреЗ рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдХрд┐рд░рдг рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддрд╣ рд╕реЗ рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди rt.color рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдХреЗрд╡рд▓ рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ: рд╕рддрд╣ рдмреАрдо рдХреА рд╕рднреА рдКрд░реНрдЬрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рддрд┐рд╢рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╢реБрд░реБрдЖрдд рдФрд░ рджрд┐рд╢рд╛ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреАрдо рдореЗрдВ рдКрд░реНрдЬрд╛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╣реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмреАрдо рдХреЗ рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдКрд░реНрдЬрд╛ рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рдмреАрдо рдХрд╛ рд░рдВрдЧ, рдЬреЛ рдХреБрдЫ рднреА рд╣реИ, рд╡рд╣ rt.color рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреБрд▓ рд░рдВрдЧ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдпреЛрдЧрджрд╛рди рджреЗрдЧрд╛ред
rt.reflection = function(r, hit) { var refl = hit.owner.mat.reflection if (refl * r.power < math.eps) return var q = {} q.dir = vec.reflect(r.dir, hit.norm) q.from = hit.at q.power = refl * r.power return rt.color(q) } vec.reflect = function(a, n) { var an = vec.dot(a, n) return vec.add(a, vec.mul(-2 * an, n)) }
рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЧреБрдгрд╛рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд░рдг рдХреА рдКрд░реНрдЬрд╛ рд╕рддрд╣ рд╕реЗ рдХрд┐рддрдиреА рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЕрдкрд╡рд░реНрддрди
рдЬрдм рдкреНрд░рдХрд╛рд╢ рдХреА рдХрд┐рд░рдг рдПрдХ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд╕рд░реЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ, рддреЛ рдпрд╣ рдЕрдкрд╡рд░реНрддрд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕реЗ
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрд╡рд░реНрддрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рдЧрднрдЧ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рдорд╛рди рд╣реИ:
rt.refraction = function(r, hit) { var m = hit.owner.mat var t = m.transparency if (t * r.power < math.eps) return var dir = vec.refract(r.dir, hit.norm, m.refrcoeff) if (!dir) return var q = {} q.dir = dir q.from = hit.at q.power = t * r.power return rt.color(q) } vec.refract = function(v, n, q) { var nv = vec.dot(n, v) if (nv > 0) return vec.refract(v, vec.mul(-1, n), 1/q) var a = 1 / q var D = 1 - a * a * (1 - nv * nv) var b = nv * a + Math.sqrt(D) return D < 0 ? undefined : vec.sub(vec.mul(a, v), vec.mul(b, n)) }
рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдПрдХ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдЧреБрдгрд╛рдВрдХ рд╣реИ - рдкреНрд░рдХрд╛рд╢ рдХрд╛ рд╡рд╣ рдЕрдВрд╢ рдЬреЛ рд╡рд╣ рд╕рддрд╣ рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдкрд╡рд░реНрддрдХ рд╕реВрдЪрдХрд╛рдВрдХ - рдЕрдкрд╡рд░реНрддрд┐рдд рдХрд┐рд░рдг рдХреА рджрд┐рд╢рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рдВрдЦреНрдпрд╛ред

Fresnel рдЧреБрдгрд╛рдВрдХ
рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рдорд╛рддреНрд░рд╛ рдЙрд╕ рдХреЛрдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕ рдкрд░ рдмреАрдо рд╕рддрд╣ рдФрд░ рдЕрдкрд╡рд░реНрддрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИред рдЖрдк
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рд╕реВрддреНрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд░реЗрд╕рд░ рдореЗрдВ рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдиреЗ рдЕрджреГрд╢реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдПред
рдЪреМрд░рд╕рд╛рдИ
рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрд┐рд░рдг рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рддреАрди рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдореЗрдВ рдЪрд┐рдХрдиреА рд░реЗрдЦрд╛рдПрдВ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░реАрди рдкрд░ рдХрджрдо рд░рдЦреЗрдЧреАред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдИ рдХрд┐рд░рдгреЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рдЧрд┐рди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдФрд╕рдд рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рдЪрд┐рддреНрд░
1000 ├Ч 1000 рд╣реИ (рдЖрд░рдкреАрдПрд╕ рдХрд╛ рдЕрд░реНрде рд╣реИ рд░реЗрдЬ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб - рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдХрд┐рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИ), рдФрд░ рдпрд╣рд╛рдВ рджреВрд╕рд░реА рддрд╕реНрд╡реАрд░
800 ├Ч 800 рд╣реИ ред рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдЗрд╕ рд▓рд┐рдВрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХреАред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдХрд▓рд╛:
рдУрдкреЗрд░рд╛ | 33,000 рдЖрд░рдкреАрдПрд╕ |
рдХреНрд░реЛрдо | 38,000 рдЖрд░рдкреАрдПрд╕ |
рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ | 16,000 рдЖрд░рдкреАрдПрд╕ |
рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ | 20,000 рдЖрд░рдкреАрдПрд╕ |
рд╕рдлрд╛рд░реА | 13,000 рдЖрд░рдкреАрдПрд╕ |
рдореИрдВрдиреЗ 5 рдлрд░рд╡рд░реА 2011 рдХреЛ рдирд╡реАрдирддрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдЗрд╕ рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдХ рдореЗрдВ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИ?
рдореИрдВрдиреЗ рдПрдХ рд░рд╛рдЗрдЬрд░ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╡рд┐рд╖рдп рджрд░реНрдкрдг рдХреЗ рд╕рд╛рдордиреЗ рдЦрдбрд╝рд╛ рд╣реИ рдФрд░ рдЖрдк рджрд░реНрдкрдг рдореЗрдВ рдЪрдордХрддреЗ рд╣реИрдВ? рд╡рд┐рд╖рдп рдХрд╛ рдкрд┐рдЫрд▓рд╛ рднрд╛рдЧ рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдкреНрд░рдХрд╛рд╢ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдПрдХ рдХрд╛рдВрдЪ рдХреА рдЧреЗрдВрдж рдкрд░ рдЪрдордХрддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рд╡рд╣ рд▓реЗрдВрд╕ рдХреА рддрд░рд╣ рдкреНрд░рдХрд╛рд╢ рдХреА рдХрд┐рд░рдгреЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдиреАрдЪреЗ рдПрдХ рд╕реНрдЯреИрдВрдб рдкрд░ рдПрдХ рдЪрдордХрджрд╛рд░ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХрдорд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреА рдЦрд┐рдбрд╝рдХреА рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдХрд╛рд╢ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ? рдкреВрд░реЗ рдХрдорд░реЗ рдореЗрдВ рд╣рд▓реНрдХреА рд░реЛрд╢рдиреА рд╣реЛрдЧреАред рдорд╛рдирд╛ рдЧрдпрд╛ рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдХ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдХ рдХрд╛ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рд▓реИрдореНрдмрд░реНрдЯ рд▓рд╛рдЗрдЯрд┐рдВрдЧ, рдлреЛрдВрдЧ рд▓рд╛рдЗрдЯрд┐рдВрдЧ, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рдЕрдкрд╡рд░реНрддрди - рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рд╡реИрдХреНрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рдЕрджрд┐рд╢ рдЙрддреНрдкрд╛рдж рдЦреЛрдЬреЗрдВред рд╡реИрдХреНрдЯрд░ рдкрд░ рдпреЗ рдСрдкрд░реЗрд╢рди рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЗ рдЖрдпрд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЪрд╛рд░-рдЖрдпрд╛рдореА рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреА рдХрд┐рд░рдг рдЕрдиреБрд░реЗрдЦрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред