ãã®èšäºã¯ã
ã¬ã€ãã¬ãŒã·ã³ã°ãš
ã©ã¹ã¿ãŒåã®2ã€ã®äž»èŠéšåã«åãããŠãããããŒã¿ããçŸããç»åãååŸãã2ã€ã®äž»èŠãªæ¹æ³ã«ã€ããŠèª¬æããŠããŸãã ã
äžè¬æŠå¿µãã®ç« ã§ã¯
ãããã2ã€ã®éšåãçè§£ããããã«å¿
èŠãªããã€ãã®åºæ¬æŠå¿µã玹ä»ããŸãã
ãã®äœæ¥ã§ã¯ãé床ã§ã¯ãªããæŠå¿µã®æç¢ºãªèª¬æã«çŠç¹ãåœãŠãŸãã ãµã³ãã«ã³ãŒãã¯æã
çè§£ããããæ¹æ³ã§èšè¿°ãããŠããŸãããã¢ã«ãŽãªãºã ãå®è£
ããã®ã«å¿
ãããæã
å¹ççã§ã¯ãããŸããã ãããå®è£
ããå€ãã®æ¹æ³ããããŸã;ç§ã¯çè§£ããã®ãæãç°¡åãªãã®ãéžã³ãŸããã
ãã®äœæ¥ã®ãæçµçµæãã¯ãã¬ã€ãã¬ãŒãµãŒãšã©ã¹ã¿ã©ã€ã¶ãŒã®2ã€ã®å®å
šã«æ©èœããå®å
šãªã¬ã³ãã©ãŒã«ãªããŸãã ãããã¯éåžžã«ç°ãªãã¢ãããŒãã䜿çšããŸãããåçŽãªã·ãŒã³ãã¬ã³ããªã³ã°ããå Žåãåæ§ã®çµæãåŸãããŸãã

ãããã®æ©èœã¯å€ãã®ç¹ã§éè€ããŠããŸãããé¡äŒŒããŠããããã§ã¯ãªãããããã®èšäºã§ã¯ãã®é·æã«ã€ããŠèª¬æããŸãã

ãã®èšäºã§ã¯ãéå
¬åŒã®æ¬äŒŒã³ãŒãã®åœ¢åŒã§ãµã³ãã«ã³ãŒããæäŸããŸãããŸãã
canvas
èŠçŽ ã§ã¬ã³ããªã³ã°ããããã©ãŠã¶ãŒã§å®è¡ã§ããå®å
šã«æ©èœããJavaScriptå®è£
ãå«ãŸããŠããŸãã
ãã®èšäºãèªãçç±
ãã®äœæ¥ã«ããããœãããŠã§ã¢ã¬ã³ãã©ãŒãäœæããããã«å¿
èŠãªãã¹ãŠã®æ
å ±ãåŸãããŸãã ãããªããã»ããµã®ãã®æä»£ã§ã¯ãçŽç²ãªãœãããŠã§ã¢ã¬ã³ãã©ãŒãäœæãã説åŸåã®ããçç±ãèŠã€ããããšã¯ã»ãšãã©ãããŸãããããããäœæããçµéšã¯æ¬¡ã®çç±ãã䟡å€ããããŸãã
- ã·ã§ãŒããŒ ã æåã®ãããªããã»ããµã§ã¯ãã¢ã«ãŽãªãºã ã¯ããŒããŠã§ã¢ã«ããŒãã³ãŒãã£ã³ã°ãããŠããŸããããçŸä»£ã®ãããªããã°ã©ããŒã¯ç¬èªã®ã·ã§ãŒããŒãäœæããå¿
èŠããããŸãã èšãæããã°ããããªããã»ããµã§å®è¡ãããããã«ãªã£ãŠããã§ããã¬ã³ããªã³ã°ãœãããŠã§ã¢ã®å€§éšåãå®è£
ããå¿
èŠããããŸãã
- çè§£ããŸãã æ¢è£œã®ãã€ãã©ã€ã³ã䜿çšããããç¬èªã®ã·ã§ãŒããŒãäœæãããã«é¢ä¿ãªããèå°è£ã§äœãè¡ãããŠããã®ããçè§£ããããšã§ãæ¢è£œã®ãã€ãã©ã€ã³ãããæå¹ã«äœ¿çšããã·ã§ãŒããŒãããé©åã«äœæã§ããŸãã
- è峿·±ã ã ã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®åéã§ã¯ãã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ãæäŸããç®ã«èŠããçµæãå³åº§ã«åŸãããšãã§ããåéã¯ã»ãšãã©ãããŸããã æåã®SQLã¯ãšãªã®å®è¡ãéå§ããåŸã®èªãã¯ãæåã«åæ ãæ£ããåæ ã§ãããšæããæ¹æ³ãšã¯æ¯ã¹ç©ã«ãªããŸããã 倧åŠã§ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã5幎éæããŸããã ç§ã¯åŠæããšã«åŠæããšã«æ¥œããã§ããããšã«ãã°ãã°é©ããããŸããïŒæåŸã«ãç§ã®åªåã¯ãæåã®ã¬ã³ããªã³ã°ããã¹ã¯ãããã®å£çŽãšããŠäœ¿çšã§ããåŠçã®åã³ã«ãã£ãŠæ£åœåãããŸããã
äžè¬çãªæŠå¿µ
ãã£ã³ãã¹
ãã®ããã»ã¹ã§ã¯ã
ãã£ã³ãã¹ã«ãªããžã§ã¯ããæç»ã
ãŸã ã ãã£ã³ãã¹ã¯ãåå¥ã«è²ä»ãã§ãããã¯ã»ã«ã®é·æ¹åœ¢ã®é
åã§ãã ç»é¢ã«è¡šç€ºããããçŽã«å°å·ãããããã®åŸã®ã¬ã³ããªã³ã°ã®ãã¯ã¹ãã£ãšããŠäœ¿çšãããããŸããïŒ ããã¯ç§ãã¡ã®äœæ¥ã«ãšã£ãŠéèŠã§ã¯ãããŸããããã®æœè±¡çãªé·æ¹åœ¢ã®ãã¯ã»ã«é
åã§ç»åãã¬ã³ããªã³ã°ããããšã«çŠç¹ãåãããŸãã
ãã®èšäºã®ãã¹ãŠã¯ãåçŽãªããªããã£ãããäœæããŸãããã£ã³ãã¹äžã«ãã¯ã»ã«ãæå®ã®è²ã§æç»ããŸãã
canvas.PutPixelïŒxãyãè²ïŒ
次ã«ããã®ã¡ãœããã®ãã©ã¡ãŒã¿ãŒã§ãã座æšãšè²ã調ã¹ãŸãã
座æšç³»
ãã£ã³ãã¹ã«ã¯ãã¯ã»ã«åäœã§ç¹å®ã®å¹
ãšé«ããããããããåŒã³åºããŸã
C w ãããŠ
C h ã ãã®ãã¯ã»ã«ãæäœããã«ã¯ãä»»æã®åº§æšç³»ã䜿çšã§ããŸãã ã»ãšãã©ã®ã³ã³ãã¥ãŒã¿ãŒç»é¢ã§ã¯ãåç¹ã¯å·Šäžé
ã«ãããŸã
x å³ã«å¢å ãã
y -ããŠã³ïŒ

ããã¯ããããªã¡ã¢ãªã®æ§æãèæ
®ããéåžžã«èªç¶ãªåº§æšç³»ã§ããã人ã
ã«ãšã£ãŠã¯ããŸã銎æã¿ããããŸããã 代ããã«ãéåžžçŽã«ã°ã©ããæãããã«äœ¿çšããã座æšç³»ã䜿çšããŸãïŒäžå¿ã®åç¹
x å³ã«å¢å ãã
y -äžïŒ

ãã®åº§æšç³»ã䜿çšããå Žåã座æš
x ç¯å²å
ã«ãã
[ - C W O V E R 2 ãC W O ã®V Eã®R 2 ] ãããã³åº§æš
y -ç¯å²å
[ - C H O V Eã®R 2 ãC H O V E R 2 ] ïŒæ³šïŒå³å¯ã«èšãã°ããŸãã¯
- C H O ã®V Eã®R 2 ããŸãã¯
C H O ã®V Eã®R 2 ç¯å²å€ã§ãããç¡èŠããŸããïŒã ç°¡åã«ããããã«ãå¯èœãªééå€ã®ãã¯ã»ã«ã§äœæ¥ããããšãããšãäœãèµ·ãããŸããã
äŸã§ã¯ããã£ã³ãã¹ãç»é¢ã«æç»ãããããããã座æšç³»ããå¥ã®åº§æšç³»ãžã®å€æãå®è¡ããå¿
èŠããããŸãã ç»é¢ããã£ã³ãã¹ãšåããµã€ãºã§ãããšä»®å®ãããšã倿åŒã¯åçŽã«ãªããŸãã
Sx=Cw over2+Cx
Sy=Ch over2âCy
ã«ã©ãŒã¢ãã«
ã«ã©ãŒã¯ãŒã¯ã®çè«ã¯çŽ æŽãããã§ãããæ®å¿µãªãããç§ãã¡ã®èšäºã®ç¯å²ãè¶
ããŠããŸãã 以äžã¯ãç§ãã¡ã«ãšã£ãŠéèŠãªåŽé¢ã®ç°¡ç¥çã§ãã
è²ã¯ãè³ãç®ã«å
¥ãå
åãã©ã®ããã«è§£éãããã瀺ããŸãã ãããã®å
åã¯ããŸããŸãªåšæ³¢æ°ã®ãšãã«ã®ãŒãéã³ãç§ãã¡ã®ç®ã¯ãããã®åšæ³¢æ°ãè²ãšé¢é£ä»ããŸãã ç§ãã¡ãç¥èŠããæäœãšãã«ã®ãŒã®åšæ³¢æ°ã¯çŽ450 THzã§ãèµ€ãšèªèããŸãã ã¹ãã¯ãã«ã®ããäžæ¹ã®ç«¯ã«ã¯750 THzããããããã¯ã玫è²ããšèŠãªãããŸãã ãããã®2ã€ã®åšæ³¢æ°ã®éã«ã¯ãé£ç¶ããè²ã®ã¹ãã¯ãã«ããããŸãïŒããšãã°ãç·-ããã¯çŽ575 THzã§ãïŒã
éåžžã®ç¶æ
ã§ã¯ããã®ç¯å²å€ã®åšæ³¢æ°ã¯ç¢ºèªã§ããŸããã ããé«ãåšæ³¢æ°ã¯ããå€ãã®ãšãã«ã®ãŒãéã¶ãããèµ€å€ç·æŸå°ïŒ450 THzæªæºã®åšæ³¢æ°ïŒã¯ç¡å®³ã§ããã玫å€ç·ïŒ750 THzãè¶
ããåšæ³¢æ°ïŒã¯ç®èãç«å·ãããå¯èœæ§ããããŸãã
ä»»æã®è²ã¯ããããã®è²ã®ããŸããŸãªçµã¿åãããšããŠèª¬æã§ããŸãïŒç¹ã«ããçœãã¯ãã¹ãŠã®è²ã®åèšã§ããããé»ãã¯ãã¹ãŠã®è²ã®äžåšã§ãïŒã æ£ç¢ºãªé »åºŠã瀺ãããšã§è²ã説æããã®ã¯äžäŸ¿ã§ãã 幞ããªããšã«ãã»ãšãã©ãã¹ãŠã®è²ã¯ããåè²ããšåŒã°ãã3è²ã ãã®ç·åœ¢çµåãšããŠäœæã§ããŸãã
æžç®ã«ã©ãŒã¢ãã«

ãªããžã§ã¯ãã¯ãããŸããŸãªæ¹æ³ã§å
ãåžåããã³åå°ãããããè²ãç°ãªããŸãã æ¥å
ãªã©ã®çœè²å
ããå§ããŸãããïŒæ³šïŒæ¥å
ã¯çã£çœã§ã¯ãããŸããããç§ãã¡ã®ç®çã«ãšã£ãŠã¯ååã«è¿ãã§ãïŒã çœè²å
ã«ã¯ããã¹ãŠã®è²ã®åšæ³¢æ°ãå«ãŸããŠããŸãã å
ããªããžã§ã¯ãã«åœãããšããªããžã§ã¯ãã®çŽ æã«å¿ããŠããã®è¡šé¢ã¯åšæ³¢æ°ã®äžéšãåžåããä»ã®åšæ³¢æ°ãåå°ããŸãã åå°å
ã®äžéšã¯ç®ã«å
¥ããè³ã¯ãããè²ã«å€æããŸãã äœè²ïŒ ãã¹ãŠã®åå°åšæ³¢æ°ã®åèšïŒæ³šïŒç±ååŠã®æ³åã«ãããæ®ãã®ãšãã«ã®ãŒã¯å€±ããããäž»ã«ç±ã«å€æãããŸããïŒ
èŠçŽãããšããã¹ãŠã®åšæ³¢æ°ã§éå§ããããã€ãã®åè²ãå·®ãåŒããŠå¥ã®è²ãäœæããŸãã åšæ³¢æ°ãæžç®ããããããã®ãããªã¢ãã«ã¯
æžæ³æ··è²ã¢ãã«ãšåŒã°ããŸãã
ãã ãããã®ã¢ãã«ã¯å®å
šã«çå®ã§ã¯ãããŸããã å®éãæžæ³æ··è²ã¢ãã«ã®åè²ã¯ãåäŸãçåŸã«æããããŠããããã«éãèµ€ãé»è²ã§ã¯ãªããã·ã¢ã³ãããŒã³ã¿ãé»è²ã§ãã ããã«ã3ã€ã®åè²ãæ··åãããšãé»ã«èŠããªããããªæãè²ãçæãããããã4çªç®ã®ãåè²ããšããŠé»ã远å ãããŸãã é»ã¯æåKã§ç€ºãããŸãããããã£ãŠãããªã³ã¿ãŒã«äœ¿çšãããCMYKã«ã©ãŒã¢ãã«ãååŸããŸãã

å æ³æ··è²ã¢ãã«
ããããããã¯ç©èªã®ååã«ãããŸããã ã¢ãã¿ãŒç»é¢ã¯çŽã®å察ã§ãã çŽã¯å
ãçºããŸããããçŽã«å
¥å°ããå
ã®äžéšãåå°ããã ãã§ãã äžæ¹ãç»é¢ã¯é»ã§ãããç»é¢èªäœãçºå
ããŸãã çŽã®äžã§ã¯ãçœè²å
ããå§ããŠãäžèŠãªåšæ³¢æ°ã
åŒããŸããã ç»é¢äžã§ãå
ã®äžè¶³ããå§ããŠ
ãç®çã®åšæ³¢æ°ã
远å ããŸãã
ããã«ã¯ä»ã®åè²ãå¿
èŠã§ããããšãããããŸãã ã»ãšãã©ã®è²ã¯ãèµ€ãç·ãéã®ç°ãªããµã€ãºãé»ã®è¡šé¢ã«è¿œå ããããšã§äœæã§ããŸãã ããã¯ãRGBã«ã©ãŒã¢ãã«ã
å æ³ã«ã©ãŒã¢ãã«ã§ãã

詳现ãå¿ãã
ããããã¹ãŠããã£ãã®ã§ãäžèŠãªè©³çްãéžæçã«å¿ããŠãä»äºã«éèŠãªããšã«éäžã§ããŸãã
ã»ãšãã©ã®è²ã¯RGBãŸãã¯CMYKïŒãŸãã¯ä»ã®å€ãã®ã«ã©ãŒã¢ãã«ïŒã§è¡šãããšãã§ããããè²ç©ºéããå¥ã®è²ç©ºéã«å€æã§ããŸãã ç§ãã¡ã®äž»ãªã¿ã¹ã¯ã¯ç»é¢äžã«ç»åãã¬ã³ããªã³ã°ããããšãªã®ã§ãRGBã«ã©ãŒã¢ãã«ã䜿çšããŸãã
åè¿°ã®ããã«ããªããžã§ã¯ãã¯å
¥å°å
ã®äžéšãåžåããæ®ããåå°ããŸãã åžåããã³åå°ãããåšæ³¢æ°ã¯ã衚é¢ã®ãè²ããšããŠèªèãããŸãã ãã®ç¬éãããè²ãåã«è¡šé¢ã®ããããã£ãšããŠèªèããåžåãããå
ã®åšæ³¢æ°ãå¿ããŸãã
æ·±ããšè²ã®è¡šçŸ
åã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«ãã¢ãã¿ãŒã¯èµ€ãç·ãéã®ããŸããŸãªçµã¿åããããè²ãäœæã§ããŸãã
æããã¯ã©ããããéãã®ã§ããããïŒ é»å§ã¯é£ç¶å€æ°ã§ããã颿£å€ã䜿çšããŠã³ã³ãã¥ãŒã¿ãŒã§è²ãåŠçããŸãã èµ€ãç·ãéã®ããŸããŸãªè²åããèšå®ã§ããã»ã©ãããå€ãã®è²ãäœæã§ããŸãã
çŸåšæãäžè¬çãªåœ¢åŒã¯ãåè²ããšã«8ãããïŒ
ã«ã©ãŒãã£ãã«ãšãåŒã°ã
ãŸã ïŒã䜿çšããŠããŸãã ãã£ãã«ããã8ãããã¯ããã¯ã»ã«ããã24ããããæäŸããŸãã
224 ããŸããŸãªè²ïŒçŽ1670äžïŒã ãã®åœ¢åŒã¯888ãšåŒã°ããäœæ¥ã«äœ¿çšããŸãã ãã®åœ¢åŒ
ã®è²æ·±åºŠã¯ 24ããã
ã§ãããšèšããŸãã
ãã ããå¯èœãªå¯äžã®åœ¢åŒã§ã¯ãããŸããã å°ãåãŸã§ãã¡ã¢ãªãç¯çŽããããã«ããã£ãã«ããšã«5ããããŸãã¯èµ€ã«5ããããç·ã«6ããããéã«5ããããå²ãåœãŠã15ããããš16ãããã®åœ¢åŒãäžè¬çã§ããïŒãã®åœ¢åŒã¯565ãšåŒã°ããŠããŸããïŒã ãªãç·ãäœåã«ãªã£ãã®ã§ããïŒ ç§ãã¡ã®ç®ã¯èµ€ãéããç·ã®å€åã«ææã ããã§ãã
16ãããã¯ç§ãã¡ã«äžããŸã
216 è±ïŒçŽ65,000ïŒã ããã¯ã24ãããã¢ãŒãã®256è²ããšã«1è²ãååŸããããšãæå³ããŸãã 65,000ã¯ãããããããŸãããåŸã
ã«è²ãå€åããç»åã§ã¯ãäžéè²ã衚çŸããã®ã«ååãªããããããããã1670äžè²ã§ã¯èŠããªãéåžžã«å°ããªãã¹ãããããèŠãããšãã§ããŸãã ãŸãã1670äžè²ã¯äººéã®ç®ã§èªèã§ããç¯å²ãè¶
ããŠãããããè¿ãå°æ¥ã24ãããè²ã䜿çšãç¶ããå¯èœæ§ãé«ããªããŸãã ïŒæ³šïŒããã¯
ç»å衚瀺ã«ã®ã¿é©çšãããããåºãç¯å²ã®ç»åã
ä¿åããããšã¯ãŸã£ããç°ãªãåé¡ã§ããããã«ã€ããŠã¯ç
§æã®ç« ã§èª¬æããŸããïŒ
è²ã衚ãããã«ã3ãã€ãã䜿çšããŸããåãã€ãã«ã¯ã8ãããã«ã©ãŒãã£ãã«ã®å€ãå«ãŸããŸãã ããã¹ãã§ã¯ãè²ã次ã®ããã«æå®ããŸã
ïŒRãGãBïŒ -äŸãã°
ïŒ255ã0ã0ïŒ -ããã¯çŽç²ãªèµ€ãè²ã§ãã
ïŒ255ã255ã255ïŒ -çœããããŠ
ïŒ255ã0ã128ïŒ -赀玫è²ã
ã«ã©ãŒãããžã¡ã³ã
ããã€ãã®æäœã䜿çšããŠè²ãå¶åŸ¡ããŸãïŒæ³šïŒç·åœ¢ä»£æ°ãç¥ã£ãŠããå Žåã¯ãè²ã3次å
è²ç©ºéã®ãã¯ãã«ãšããŠèªèããŸãããã®èšäºã§ã¯ãç·åœ¢ä»£æ°ã«äžæ
£ããªèªè
ã«äœ¿çšããæäœã玹ä»ããŸãïŒã
åè²ãã£ã³ãã«ã宿°ã§å¢ããããšã§ãè²ã®æãããå¢ããããšãã§ããŸãã
kïŒRãGãBïŒ=ïŒkRãkGãkBïŒ
ã«ã©ãŒãã£ãã«ãåå¥ã«è¿œå ããããšã§ã2ã€ã®è²ã远å ã§ããŸãã
ïŒR1ãG1ãB1ïŒ+ïŒR2ãG2ãB2ïŒ=ïŒR1+R2ãG1+G2ãB1+B2ïŒ
ããšãã°ãèµ€ã¿ããã£ã玫ãããå Žå
ïŒ252ã0ã66ïŒ
ãããŠããŸã£ããåãè²åãã«ããããã3åã®æããã«ãããã®ã§ãåãã£ã³ãã«ã«
1 3ãã«ä»¥ ãããŠåŸã
ïŒ84ã0ã22ïŒ ã èµ€ãçµã¿åããããå Žå
ïŒ255ã0ã0ïŒ ãšç·
ïŒ0ã255ã0ïŒ æ¬¡ã«ããã£ãã«ã远å ããŠååŸããŸã
ïŒ255ã255ã0ïŒ ããã¯é»è²ã§ãã
æ°é
ãã®ããèªè
ã¯ããã®ãããªæäœã§ã¯ãããšãã°æããã2åã«ããããšã§ã誀ã£ãå€ãååŸã§ãããšèšãããšãã§ããŸãã
ïŒ192ã64ã32ïŒ ãè²ã®ç¯å²å€ã®Rã®å€ãååŸããŸãã 255ã«çãã255ãã倧ããå€ãããã³0ã«çãã0ããå°ããå€ãæ€èšããŸããããã¯ãã·ã£ãã¿ãŒé床ãé«ããããŸãã¯äœãããåçãæ®åœ±ããå Žåãšã»ãŒåãã§ããå®å
šã«é»ãŸãã¯å®å
šã«çœã®é åã衚瀺ãããŸãã
ã·ãŒã³
Canvasã¯ããã¹ãŠãã¬ã³ããªã³ã°ããæœè±¡æŠå¿µã§ãã äœãã¬ã³ããªã³ã°ããŸããïŒ å¥ã®æœè±¡åã¯
ã·ãŒã³ã§ãã
ã·ãŒã³ã¯ãã¬ã³ããªã³ã°ããå¿
èŠããããªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ã§ãã 空ã®ç©ºéã«ã¶ãäžãã£ãŠããå¯äžã®çäœïŒããããå§ããŸãïŒããã鬌ã®éŒ»ã®å
éšã®ä¿¡ããããªãã»ã©è©³çްãªã¢ãã«ãŸã§ãäœã§ãæ§ããŸããã
ã·ãŒã³å
ã®ãªããžã§ã¯ãã«ã€ããŠè©±ãã«ã¯ã座æšç³»ãå¿
èŠã§ãã ã©ãã§ãéžæã§ããŸãããç§ãã¡ã®ç®çã«åœ¹ç«ã€ãã®ãããã¯ã¢ããããŸãã Y軞ã¯äžã«åããããŸãã X軞ãšZè»žã¯æ°Žå¹³ã§ãã ã€ãŸããXZå¹³é¢ããåºãã«ãªããXYãšYZãåçŽã®ãå£ãã«ãªããŸãã
ããã§ã¯ãç©çããªããžã§ã¯ãã«ã€ããŠèª¬æããŠããã®ã§ã枬å®ã®åäœãéžæããå¿
èŠããããŸãã ãããã¯ä»»æã§ãæ§ããŸããããã·ãŒã³ã«è¡šç€ºããããã®ã«åŒ·ãäŸåããŸãã ã1ãã¯ãåãã¢ãã«åããå Žåã¯1ããªã¡ãŒãã«ã倪éœç³»ãã¢ãã«åããå Žåã¯1倩æåäœã«ããããšãã§ããŸãã 幞ããªããšã«ã次ã®ã©ãããŠãããã«äŸåããŠããªããããåçŽã«ããããç¡èŠããŸãã åäžæ§ãç¶æããéãïŒã€ãŸããã1ãã¯ã·ãŒã³å
šäœã§åžžã«åãããšãæå³ããŸãïŒããã¹ãŠãæ£åžžã«æ©èœããŸãã
ããŒãIïŒã¬ã€ãã¬ãŒã·ã³ã°
ããªãããšããŸããã¯ãªå Žæã«ããŠãçŽ æŽãããæ¯è²ã楜ããã§ãããšæ³åããŠãã ããããšãŠãçŽ æŽãããã®ã§ãåç
ã«åãã ãã§ãã
ã¹ã€ã¹ã®é¢šæ¯çŽãšããŒã«ãŒã¯ãããŸãããèžè¡çãªæèœã¯ãŸã£ãããããŸããã ãã¹ãŠã倱ãããŸãããïŒ
å¿
ãããããã§ã¯ãããŸããã æèœã¯ãªããããããŸããããæ¹æ³è«ããããŸãã
ããªãã¯æãæçœãªããšãããããšãã§ããŸãïŒæè«ã®ããããåããã¹ãã£ãã¯ã«ãã¬ãŒã ãåãä»ããããšã«ãã£ãŠé·æ¹åœ¢ã®ãã¬ãŒã ã«ããã眮ããŸãã æ¬¡ã«ããã®ã°ãªãããéããŠé¢šæ¯ãèŠãŠãæé©ãªè§åºŠãéžæããæ£ç¢ºã«åãèŠç¹ãåŸãããã«é ãæ£ç¢ºã«ããã¹ãå Žæã«å¥ã®ã¹ãã£ãã¯ã眮ããŸãã
æç»ãéå§ããŠããŸããããå°ãªããšããåºå®ãããèŠç¹ãšã颚æ¯ãèŠããåºå®ããããã¬ãŒã ããããŸãã ããã«ããã®åºå®ãã¬ãŒã ã¯å°ããªæ£æ¹åœ¢ã«åå²ãããŸãã ãããŠä»ãç§ãã¡ã¯ç³»çµ±çãªéšåã«é²ã¿ãŸãã æè«ã®ç¶²ãšåãæ°ã®æ£æ¹åœ¢ã®çŽã«ã°ãªãããæããŸãã æ¬¡ã«ãã°ãªããã®å·Šäžã®æ£æ¹åœ¢ãèŠãŠãã ããã ã©ããªè²ãæ¯é
çã§ããïŒ ã¹ã«ã€ãã«ãŒã ãããã£ãŠãçŽã®å·Šäžã®æ£æ¹åœ¢ã空è²ã§æç»ããŸãã 忣æ¹åœ¢ã«ã€ããŠåãããšãç¹°ãè¿ããçªããèŠãããã®ããã«ãããã«é¢šæ¯ã®ããªãè¯ãç»åãååŸããŸãã
倧ãŸããªã©ã³ãã¹ã±ãŒãè¿äŒŒèããŠã¿ããšãã³ã³ãã¥ãŒã¿ãŒã¯æ¬è³ªçã«éåžžã«ç³»çµ±çãªæ©æ¢°ã§ãããèžè¡çãªæèœã¯ãŸã£ãããããŸããã çŽã®äžã®æ£æ¹åœ¢ãç»é¢äžã®ãã¯ã»ã«ã«çœ®ãæãããšã次ã®ããã«ã·ãŒã³ãã¬ã³ããªã³ã°ããããã»ã¹ã説æã§ããŸãã
ãã£ã³ãã¹ã®åãã¯ã»ã«ã«ã€ããŠ
åžæã®è²ã§å¡ãã€ã¶ããŸãã
ãšãŠãç°¡åã§ãïŒ
ãã ãããã®ãããªã³ãŒãã¯æœè±¡çãããŠãã³ã³ãã¥ãŒã¿ãŒã«çŽæ¥å®è£
ããããšã¯ã§ããŸããã ãããã£ãŠã詳现ãããå°ã詳ãã説æããŸãã
ç®ãšãã¬ãŒã ãé©åãªå Žæã«é
眮ãã
ãã£ã³ãã¹ã®åãã¯ã»ã«ã«ã€ããŠ
ãã®ãã¯ã»ã«ã«å¯Ÿå¿ããã°ãªããã®æ£æ¹åœ¢ã決å®ããŸã
ãã®æ£æ¹åœ¢ãéããŠèŠããè²ãå®çŸ©ããŸãã
ãã®è²ã§ãã¯ã»ã«ãå¡ãã€ã¶ããŸãã
ããã¯ãŸã æœè±¡çã§ããããã§ã«ã¢ã«ãŽãªãºã ã®ããã«èŠãå§ããŠããŸãã é©ããããšã«ãããã¯ã¬ã€ãã¬ãŒã·ã³ã°ã¢ã«ãŽãªãºã å
šäœã®é«ã¬ãã«ã®èª¬æã§ãã ã¯ãããã¹ãŠããšãŠãç°¡åã§ãã
ãã¡ãããæªéã¯è©³çްã«ãããŸãã æ¬¡ã®ç« ã§ã¯ãããããã¹ãŠã®æé ã詳ããèŠãŠãããŸãã
ã¬ã€ãã¬ãŒã·ã³ã°ã®åºæ¬
ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã§æãè峿·±ããã®ã®1ã€ïŒãããŠããããæãè峿·±ããã®ïŒã¯ãã°ã©ãã£ãã¯ã¹ãç»é¢ã«ã¬ã³ããªã³ã°ããããšã§ãã ã§ããã ãæ©ãéå§ããããã«ããŸãç»é¢ã«äœãã衚瀺ããããã«ããã€ãã®åçŽåãè¡ããŸãã ãã¡ããããã®ãããªåçŽåã¯ãå¯èœãªã¢ã¯ã·ã§ã³ã®å¶éãæç€ºããŠããŸããã以éã®ç« ã§ã¯ãããã®å¶éãæ®µéçã«åãé€ããŸãã
ãŸããèŠç¹ãåºå®ãããŠãããšä»®å®ããŸãã èŠç¹ã¯ãç§ãã¡ã®é¡æšã§ç®ãäœçœ®ããå Žæã§ãããéåžž
ã¯ã«ã¡ã©ã®äœçœ®ãšåŒã°ã
ãŸã ã 圌ã«é»è©±ããŸããã
O=ïŒOxãOyãOzïŒ ã ã«ã¡ã©ã¯åº§æšç³»ã®å
é ã«ãããšä»®å®ããŸãã
O=ïŒ0ã0ã0ïŒ ã
第äºã«ãã«ã¡ã©ã®åããåºå®ãããŠãããã€ãŸããã«ã¡ã©ã¯åžžã«åãå Žæã«åããããŠãããšä»®å®ããŸãã æ£ã®è»žZã«æ²¿ã£ãŠäžãåããŠãããæ£ã®è»žYãäžãåããæ£ã®è»žXãå³ã«ãããšä»®å®ããŸãã

ã«ã¡ã©ã®äœçœ®ãšåããä¿®æ£ãããŸããã ããããç§ãã¡ãææ¡ããã¢ãããžãŒããã®ããã¬ãŒã ãã¯ãŸã ãªãããããéããŠã·ãŒã³ãèŠãŠããŸãã ãã¬ãŒã ã«ã¯å¯žæ³ããããšä»®å®ããŸã
Vw ãããŠ
Vh ãã«ã¡ã©ã®äœçœ®ã«å¯ŸããŠæ£é¢ã«ãããŸãïŒã€ãŸããåçŽ
vecZ+ ïŒãããŠè·é¢ããã
d ããã®åŽé¢ã¯X軞ãšY軞ã«å¹³è¡ã§ããã
vecZ+ ã 説æã¯è€éã«èŠããŸãããå®éã«ã¯ãã¹ãŠãéåžžã«åçŽã§ãã

ã¯ãŒã«ããžã®ãŠã£ã³ããŠãšãªããã®é·æ¹åœ¢ã¯ã
ãã¥ãŒããŒããšåŒã°ããŸãã æ¬è³ªçã«ããã¥ãŒããŒããéããŠèŠãããã¹ãŠããã£ã³ãã¹ã«æç»ããŸãã ãã¥ãŒããŒãã®ãµã€ãºãšã«ã¡ã©ãŸã§ã®è·é¢ã«ãã£ãŠã
èŠéãŸãã¯ç¥ããŠFOVãšåŒã°ããã«ã¡ã©ããã®èŠéè§ã決ãŸãããšãéèŠã§ãã 人éã§ã¯ãæ°Žå¹³èŠéã¯ã»ãŒ
180 c i r c ãã ãããã®ã»ãšãã©ã¯ã奥è¡ãæã®ãªãææ§ãªåšèŸºèŠéã§ãã äžè¬ã«ãä¿¡é Œã§ããç»åã¯FOVã䜿çšããŠååŸãããŸã
60 c i r c åçŽããã³æ°Žå¹³æ¹å;
ããã¯å°ããããšã«ãã£ãŠéæããããšãã§ããŸã V w = V h = d = 1 ã
åã®ã»ã¯ã·ã§ã³ã§ç€ºãããã¢ã«ãŽãªãºã ãã«æ»ã£ãŠããã®ã¹ããããæ°åã§ç€ºããŸãã ç®ãšãã¬ãŒã ãæ£ããå Žæã«çœ®ããŸãïŒ1ïŒ
ãã£ã³ãã¹ã®åãã¯ã»ã«ã«ã€ããŠ
ãã®ãã¯ã»ã«ã«å¯Ÿå¿ããã°ãªããã®æ£æ¹åœ¢ã決å®ããŸãïŒ2ïŒ
ãã®æ£æ¹åœ¢ãéããŠèŠããè²ãå®çŸ©ããŸãïŒ3ïŒ
ãã®è²ã§ãã¯ã»ã«ãå¡ãã€ã¶ããŸãïŒ4ïŒ
ãã§ã«ã¹ããã1ãå®äºããŠããŸãïŒãŸãã¯ãããæ£ç¢ºã«ã¯ããã°ããã®éãããåãé€ããŸããïŒãã¹ããã4ã¯ç°¡åã§ãïŒcanvas.PutPixel(x, y, color)
ïŒãã¹ããã2ãç°¡åã«èŠãŠãããã¹ããã3ãå®è£
ããããã®ããè€éãªæ¹æ³ã«çŠç¹ãåœãŠãŸãããããã£ã³ãã¹ãããã¥ãŒããŒããž
ã¹ããã2ã§ã¯ãããã®ãã¯ã»ã«ã«å¯Ÿå¿ããã°ãªããã®æ£æ¹åœ¢ã決å®ãããå¿
èŠããããŸãããã£ã³ãã¹äžã®ãã¯ã»ã«åº§æšãç¥ã£ãŠããŸãïŒãã¹ãŠãæç»ããŸãïŒ-ããããåŒã³åºããŸãããC x ãããŠ
C y ã
ãã¥ãŒããŒãã®é
眮ãããã«äŸ¿å©ã§ãããã«æ³šç®ããŠãã ããããã®è»žã¯ãã£ã³ãã¹ã®è»žã®æ¹åã«å¯Ÿå¿ãããã®äžå¿ã¯ãã¥ãŒããŒãã®äžå¿ã«å¯Ÿå¿ããŸããã€ãŸããã¹ã±ãŒã«ã倿Žããã ãã§ããã£ã³ãã¹ã®åº§æšãã空éã®åº§æšã«ç§»åã§ããŸãïŒV x = C x V wC w
V y = C y V hC h
å¥ã®åŸ®åŠãªç¹ããããŸãããã¥ãŒããŒãã¯2次å
ã§ããã3次å
空éã«åã蟌ãŸããŠããŸããã«ã¡ã©ããè·é¢dã«ããããšã瀺ããŸãããå®çŸ©ã«ããããã®å¹³é¢ïŒæåœ±é¢ãšåŒã°ããïŒã®åç¹z = d ã ã ãã
V z = d
ããã§æé 2ãå®äºããŸãããåãã¯ã»ã«ã«ã€ã㊠ïŒC xãC yïŒãã£ã³ãã¹ã®ãã¥ãŒããŒãã®å¯Ÿå¿ããç¹ã決å®ã§ããŸãïŒV xãV yãV zïŒ ã
ã¹ããã3ã§ã¯ãå
ãééããè²ã決å®ããå¿
èŠããããŸã ïŒV xãV yãV zïŒã«ã¡ã©ãã¥ãŒã®èгç¹ããïŒO xãO yãO zïŒ ã
å
ç·ããã©ã
ãã®ãããå
ã¯ã©ã®è²ãä»ããŠå±ããŸãã ïŒO xãO yãO zïŒééåŸïŒV xãV yãV zïŒ ïŒ
çŸå®ã®äžçã§ã¯ãå
ã¯å
æºïŒå€ªéœãé»çãªã©ïŒããæ¥ãŠãããã€ãã®ãªããžã§ã¯ãããåå°ãããæçµçã«ç§ãã¡ã®ç®ã«å±ããŸããã·ãã¥ã¬ãŒããããå
æºããæŸåºãããåå
åã®çµè·¯ãã·ãã¥ã¬ãŒãããããšã¯ã§ããŸãããä¿¡ããããªãã»ã©æéãããããŸãïŒæ³šïŒçµæã¯é©ãã¹ããã®ã§ãããã®ææ³ã¯ãå
å远跡ãŸãã¯å
åååžãšåŒã°ããŸãã ãäœçŸäžãã®å
åãã·ãã¥ã¬ãŒãããã ãã§ãªãã衚瀺ãŠã£ã³ããŠãééããåŸãïŒO xãO yãO zïŒã¯ãããã®ã»ãã®äžéšã«ããå°éããŸããã代ããã«ãã¬ã€ããéé ãã§ãã¬ãŒã¹ããŸããã«ã¡ã©ã«ããã¬ã€ããéå§ãããã¥ãŒããŒãã®ãã€ã³ããééããã·ãŒã³å
ã®ãªããžã§ã¯ããšè¡çªãããŸã§ç§»åããŸãããã®ãªããžã§ã¯ãã¯ã衚瀺ãŠã£ã³ããŠã®ãã®ãã€ã³ããéããŠã«ã¡ã©ããã衚瀺ããããŸããã€ãŸããæåã®è¿äŒŒãšããŠããã®ãªããžã§ã¯ãã®è²ãåã«ããã®ç¹ãééããå
ã®è²ããšèŠãªããŸããããã§å¿
èŠãªæ¹çšåŒã¯ãããã§ãã
å
ç·æ¹çšåŒ
ãã®ç®çã®ããã«å
ç·ã衚ãæè¯ã®æ¹æ³ã¯ããã©ã¡ããªãã¯æ¹çšåŒã䜿çšããããšã§ããå
ç·ãOãééãããã®æ¹åïŒOããVïŒãç¥ã£ãŠããã®ã§ãå
ç·ã®ä»»æã®ç¹Pãæ¬¡ã®ããã«è¡šçŸã§ããŸããP = O + t ïŒV - O ïŒ
ããã§ãtã¯ä»»æã®å®æ°ã§ãã瀺ããŸãããïŒV - O ïŒãã€ãŸããããŒã ã®æ¹åâ D ;
æ¹çšåŒã¯åçŽãªåœ¢ãåããŸãP = O + t â D
ããã«ã€ããŠã¯ãç·åœ¢ä»£æ°ã§è©³ããèªãããšãã§ããŸããçŽæçã«ãéå§ç¹ããéå§ããŠããŒã ã®æ¹åã®åæ°ã«é²ããšãåžžã«ããŒã ã«æ²¿ã£ãŠç§»åããŸãã
çæ¹çšåŒ
次ã«ãå
ç·ãäœããšè¡çªã§ããããã«ãã·ãŒã³ã«ãªããžã§ã¯ãã远å ããå¿
èŠããããŸããä»»æã®å¹ŸäœåŠçããªããã£ããã·ãŒã³ã®ãã«ãã£ã³ã°ãããã¯ãšããŠéžæã§ããŸããã¬ã€ãã¬ãŒã·ã³ã°ã®å Žåãæ°åŠçãªæäœã®æãåçŽãªããªããã£ãã¯çäœã§ããçäœãšã¯äœã§ããïŒçäœã¯ãåºå®ç¹ïŒçäœã®äžå¿ãšåŒã°ããïŒããäžå®ã®è·é¢ïŒçäœã®ååŸãšåŒã°ããïŒã«ããç¹ã®éåã§ããå®çŸ©ãã倿ãããšãçäœã¯äžç©ºã§ããCãçã®äžå¿ã§ãããrãçã®ååŸã§ããå Žåãçã®è¡šé¢äžã®ç¹Pã¯æ¬¡ã®æ¹çšåŒãæºãããŸãã
d i s t a n c e ïŒP ãC ïŒ= r
ãã®æ¹çšåŒãå°ã詊ããŠã¿ãŸããããPãšCã®éã®è·é¢ã¯ãPããCãžã®ãã¯ãã«ã®é·ãã§ãã| P - C | = r
ãã¯ãã«ã®é·ãã¯ãããèªäœã®ã¹ã«ã©ãŒç©ã®å¹³æ¹æ ¹ã§ããââš P - C ãP - C â© =R
ãããŠãå¹³æ¹æ ¹ãåãé€ãããã«ãâš P - C ãP - C â© = R 2
ã¬ã€ã¯çã«åºäŒã
ããã§2ã€ã®æ¹çšåŒãã§ããŸããã1ã€ã¯çã®ç¹ãèšè¿°ãããã1ã€ã¯å
ç·ã®ç¹ãèšè¿°ããŸããâš P - C ãP - C â© = R 2
P = O + t â D
å
ç·ãçã«åœããç¹Pã¯ãå
ç·ã®ç¹ãšçã®è¡šé¢äžã®ç¹ã®äž¡æ¹ã§ãããããäž¡æ¹ã®æ¹çšåŒãåæã«æºããå¿
èŠããããŸãããããã®æ¹çšåŒã®å¯äžã®å€æ°ã¯ãã©ã¡ãŒã¿ãŒtã§ããããšã«æ³šæããŠãã ãããOãâ DãCãããã³rãäžããããPã¯èŠã€ããå¿
èŠããããã€ã³ãã§ããPã¯äž¡æ¹ã®æ¹çšåŒã§åããã€ã³ãã§ãããããæåã®Pã2çªç®ã®Pã®åŒã«çœ®ãæããããšãã§ããŸããããã¯ç§ãã¡ã«äžããŸãâš O + T â D - C ãO + T â D - C â© = R 2
tã®ã©ã®å€ããã®æ¹çšåŒãæºãããŸããïŒçŸåšã®åœ¢åŒã§ã¯ãæ¹çšåŒã¯ããé¢åã§ããããã倿ããŠãããããäœãåŸãããããèŠãŠã¿ãŸãããããŸããâ O C =O-C ã
æ¹çšåŒã¯æ¬¡ã®ããã«æžãããšãã§ããŸãâš â O C + T â Dãâ O C + T â D â© = R 2
次ã«ãååžã䜿çšããŠãã¹ã«ã©ãŒç©ãã³ã³ããŒãã³ãã«åè§£ããŸããâš â O C + T â Dãâ O C â© + âš â O C + T â DãT â D â© = R 2
âš â O Cãâ O C â© + âš T â Dãâ O C â© + âš â O CãT â D â© + âš T â DãT â D â© = R 2
å°ã倿ãããšãâš T â DãT â D â© + 2 âš â O CãT â D â© + âš â O Cãâ O C â© = R 2
ã¹ã«ã©ãŒç©ãããã©ã¡ãŒã¿ãŒtãç§»åãã æ¹çšåŒã®å¥ã®éšåã® r 2ãååŸããŸããT 2 âš â Dãâ D â© + T ïŒ2 âš â O Cãâ D â© ïŒ+ âš â O Cãâ O C â© - R 2 = 0
ããã°ããã«ãªããŸãããïŒ2ã€ã®ãã¯ãã«ã®ã¹ã«ã©ãŒç©ã¯å®æ°ã§ãããããæ¬åŒ§å
ã®åé
ã¯å®æ°ã§ããããšã«æ³šæããŠãã ãããããããååã§è¡šããšããã£ãšãªãã¿ã®ãããã®ãåŸãããŸããK 1 = âš â Dãâ D â©
kã¯2 = 2 âš â O Cãâ Dã â©
K 3 = âš â O Cãâ O C â© - R 2
k 1 t 2 + k 2 t + k 3 = 0
ããã¯å€ãè¯ãäºæ¬¡æ¹çšåŒã«ä»ãªããŸããããã®è§£ã¯ãå
ç·ãçãšäº€å·®ãããã©ã¡ãŒã¿ãŒtã®å€ãæäŸããŸãã{ T 1ãT 2 } = - K 2 ± âK 2 2-4ãK1ãK32 k 1
幞ããªããšã«ãããã¯å¹ŸäœåŠçã«çã«ããªã£ãŠããŸããèŠããŠããããã«ãå€å¥åŒã®å€ã«å¿ããŠãäºæ¬¡æ¹çšåŒã«ã¯è§£ããªãã1ã€ã®äºéè§£ãŸãã¯2ã€ã®ç°ãªãè§£ãããå ŽåããããŸããK 2 2-4ãK1ãK3 ã
ããã¯ãå
ç·ãçã亀差ãããå
ç·ãçã«æ¥è§Šããå
ç·ãçã«åºå
¥ãããå Žåã«æ£ç¢ºã«å¯Ÿå¿ããŸãïŒ
tã®å€ãååŸããŠå
ç·ã®æ¹çšåŒã«æ¿å
¥ãããšããã®tã®å€ã«å¯Ÿå¿ãã亀ç¹PãååŸããŸãæåã®é åã®ã¬ã³ããªã³ã°
èŠçŽãããšããã£ã³ãã¹äžã®åãã¯ã»ã«ã«ã€ããŠããã¥ãŒããŒãå
ã®å¯Ÿå¿ãããã€ã³ããèšç®ã§ããŸããã«ã¡ã©ã®äœçœ®ããããã°ãã«ã¡ã©ããæ¥ãŠè¡šç€ºãŠã£ã³ããŠã®ç¹å®ã®ãã€ã³ããééããããŒã ã®æ¹çšåŒã衚çŸã§ããŸããçãããå Žåãå
ç·ããã®çãšäº€å·®ããç¹ãèšç®ã§ããŸããã€ãŸããå
ç·ãšåçã®äº€ç¹ãèšç®ããã«ã¡ã©ã«æãè¿ããã€ã³ããä¿åãããã£ã³ãã¹äžã®ãã¯ã»ã«ãé©åãªè²ã§ãã€ã³ãããã ãã§ããæåã®é åãã¬ã³ããªã³ã°ããæºåãã»ãŒæŽããŸããïŒãã ãããã©ã¡ãŒã¿tã«ã¯ç¹å¥ãªæ³šæãæãå¿
èŠããããŸããããŒã æ¹çšåŒã«æ»ãïŒP = O + t ïŒV - O ïŒ
éå§ç¹ãšå
ç·ã®æ¹åã¯äžå®ã§ããã宿°ã®ã»ããã§tãå€åããããããã®å
ç·äžã®ãã¹ãŠã®ç¹PãååŸããŸããããšã«æ³šæããŠãã ããt = 0ãåŸãããŸãP = Oãããã³T = 1ãæã
ãåŸãŸãP = v ã
è² ã®æ°ã䜿çšãããšãå察æ¹åãã€ãŸãã«ã¡ã©ã®åŸãã«ãã€ã³ããåŸãããŸããã€ãŸãããã©ã¡ãŒã¿ãŒé åã3ã€ã®éšåã«åå²ã§ããŸããt < 0 | ã«ã¡ã©ã®åŸã |
0 †T †1 | ã«ã¡ã©ãšæåœ±é¢ã®é |
t > 1 | ã·ãŒã³ |
ãã©ã¡ãŒã¿ãŒé åã®å³ã次ã«ç€ºããŸãã
亀差åŒã«ã¯ãçäœãã«ã¡ã©ã®åã«ããå¿
èŠãããããšã瀺ããã®ããªãããšã«æ³šæããŠãã ãããæ¹çšåŒã¯ãåé¡ãªãã«ã¡ã©ã®åŸãã®äº€å·®ç¹ã®è§£æ±ºçãæäŸããŸããæããã«ãããã¯å¿
èŠãããŸããããããã£ãŠã次ã®å Žåã¯ãã¹ãŠã®æ±ºå®ãç¡èŠããå¿
èŠããããŸãt < 0 ã
远å ã®æ°åŠçå°é£ãåé¿ããããã«ããœãªã¥ãŒã·ã§ã³ãå¶éããŸã t > 1ãã€ãŸããæåœ±é¢ãè¶
ãããã¹ãŠã®ãã®ãã¬ã³ããªã³ã°ããŸããäžæ¹ãtã®å€ã«äžéãèšå®ããå¿
èŠã¯ãããŸãããã«ã¡ã©ã®åã«ãããªããžã§ã¯ããã©ãã ãé ããŸã§èŠãŠã¿ãããšæããŸããåŸã®æ®µéã§å
ç·ã®é·ããå¶éããã®ã§ããã®åœ¢åŒã远å ããtãäžéå€ã«å¶éããå¿
èŠããããŸã+ âïŒæ³šïŒç¡é倧ãçŽæ¥æå®ã§ããªãèšèªã§ã¯ãéåžžã«å€§ããªæ°ã§ååã§ããïŒããã§ãæ¬äŒŒã³ãŒãã§è¡ã£ããã¹ãŠã圢åŒåã§ããŸããäžè¬çãªã±ãŒã¹ã§ã¯ãã³ãŒããå¿
èŠãªããŒã¿ã«ã¢ã¯ã»ã¹ã§ãããšæ³å®ãããããæãå¿
èŠãªãã®ãé€ãããã©ã¡ãŒã¿ãŒãæç€ºçã«æž¡ããŸãããmainã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã O = <0ã0ã0>
[-Cw / 2ãCw / 2]ã®xã®å Žå{
[-Ch / 2ãCh / 2]ã®yã®å Žå{
D = CanvasToViewportïŒxãyïŒ
color = TraceRayïŒOãDã1ãinfïŒ
canvas.PutPixelïŒxãyãè²ïŒ
}
}
æ©èœã¯CanvasToViewport
éåžžã«ç°¡åã§ãã CanvasToViewportïŒxãyïŒ{
returnïŒx * Vw / Cwãy * Vh / ChãdïŒ
}
ãã®ã³ãŒãd
ã§ã¯ãããã¯æåœ±é¢ãŸã§ã®è·é¢ã§ãããã®ã¡ãœããTraceRay
ã¯ãå
ç·ãšåçã®äº€å·®ãèšç®ããå¿
èŠãªéétã«ããæãè¿ã亀差ç¹ã§ã®çã®è²ãè¿ããŸãã TraceRayïŒOãDãt_minãt_maxïŒ{
æãè¿ãt = inf
nearest_sphere = NULL
scene.Spheres {ã®çã®å Žå
t1ãt2 = IntersectRaySphereïŒOãDãçäœïŒ
[t_minãt_max]ã®t1ããã³t1 <closest_tã®å Žå
æãè¿ãt = t1
æãè¿ãçäœ=çäœ
[t_minãt_max]ã®t2ããã³t2 <closest_tã®å Žå
æãè¿ãt = t2
æãè¿ãçäœ=çäœ
}
nearest_sphere == NULLã®å Žå
BACKGROUND_COLORãè¿ããŸã
nearest_sphere.colorãè¿ããŸã
}
O
ãã®ã³ãŒãã§ã¯ããããããŒã ã®éå§ç¹ã§ããåç¹ã«ããã«ã¡ã©ããå
ç·ãæŸåºããŸãããåŸã®æ®µéã§ä»ã®å Žæã«é
眮ã§ããããããã®å€ã¯ãã©ã¡ãŒã¿ãŒã§ããå¿
èŠããããŸããåãããšãt_min
ãšã«ãåœãŠã¯ãŸããŸãt_max
ãå
ç·ãçãšäº€å·®ããªãå Žåã§ããè²ãè¿ãå¿
èŠããããŸããã»ãšãã©ã®äŸã§ã¯ããã®ããã«çœãéžæããŸããããããŠæåŸã«IntersectRaySphere
ãäºæ¬¡æ¹çšåŒãè§£ãã ãã§ãïŒ IntersectRaySphereïŒOãDãsphereïŒ{
C = sphere.center
r = sphere.radius
oc = O-C
k1 =ãããïŒDãDïŒ
k2 = 2 *ãããïŒOCãDïŒ
k3 =ãããïŒOCãOCïŒ-r * r
å€å¥åŒ= k2 * k2-4 * k1 * k3
å€å¥<0ã®å ŽåïŒ
infãinfãè¿ã
t1 =ïŒ-k2 + sqrtïŒå€å¥åŒïŒïŒ/ïŒ2 * k1ïŒ
t2 =ïŒ-k2-sqrtïŒå€å¥åŒïŒïŒ/ïŒ2 * k1ïŒ
t1ãt2ãè¿ã
}
éåžžã«åçŽãªã·ãŒã³ãå®çŸ©ããŸãããïŒã·ãŒã³
ã®æ¬äŒŒèšèªã§ã¯ã次ã®ããã«èšå®ãããŸãã viewport_size = 1 x 1
projection_plane_d = 1
sphere {
center =ïŒ0ã-1ã3ïŒ
ååŸ= 1
color =ïŒ255ã0ã0ïŒïŒèµ€
}
sphere {
äžå€®=ïŒ2ã0ã4ïŒ
ååŸ= 1
color =ïŒ0ã0ã255ïŒïŒé
}
sphere {
äžå€®=ïŒ-2ã0ã4ïŒ
ååŸ= 1
color =ïŒ0ã255ã0ïŒïŒç·
}
次ã«ããã®ã·ãŒã³ã®ã¢ã«ãŽãªãºã ãå®è¡ãããšãã¬ã€ãã¬ãŒã·ã³ã°ã«ãã£ãŠåŸãããä¿¡ããããªãã»ã©ã®ã·ãŒã³ã®ãã¥ãŒãæçµçã«å ±ãããŸãã
ãœãŒã¹ã³ãŒããšäœæ¥ãã¢>>ããã¯å°ãæ®å¿µã§ããåå°ã圱ãçŸããå€èгã¯ã©ãã«ãããŸããïŒãŸã å§ãŸã£ãã°ãããªã®ã§ãããããã¹ãŠååŸããŸããããããããã¯è¯ãåºçºç¹ã§ã-çäœã¯åã®ããã«èŠããç«ã®ããã«èŠããå ŽåãããåªããŠããŸãã人ããªããžã§ã¯ãã®åœ¢ç¶ãã€ãŸãå
ãšçžäºäœçšããæ¹æ³ã決å®ã§ããéèŠãªã³ã³ããŒãã³ããèŠéããŠãããããçäœã®ããã«ã¯èŠããŸãããç
§æ
ã·ãŒã³ã¬ã³ããªã³ã°ã«ããªã¢ãªãºã ãã远å ããæåã®ã¹ãããã¯ãç
§æãã·ãã¥ã¬ãŒãããããšã§ããç
§æã¯ãã¡ããã¡ãè€éãªãããã¯ãªã®ã§ãç§ãã¡ã®ç®çã«ååãªéåžžã«åçŽåãããã¢ãã«ã玹ä»ããŸãããã®ã¢ãã«ã®äžéšã¯ç©çã¢ãã«ã«ããã«è¿ããã®ã§ã¯ãªããé«éã§èŠæ ããè¯ãã§ããç§ãã¡ã®çæŽ»ãæ¥œã«ããããã€ãã®åçŽåãããä»®å®ããå§ããŸãããŸãããã¹ãŠã®ç
§æãçœè²ã§ããããšãçºè¡šããŸããããã«ãããå
æºã®æãããšåŒã°ããåäžã®å®æ°iã§å
æºãç¹åŸŽä»ããããšãã§ããŸããã«ã©ãŒç
§æã®ã·ãã¥ã¬ãŒã·ã§ã³ã¯ããã»ã©è€éã§ã¯ãããŸããïŒãã£ãã«ããšã«1ã€ã3ã€ã®èŒåºŠå€ã®ã¿ãå¿
èŠã§ãããŸãããã£ãã«ããšã«ãã¹ãŠã®è²ãšç
§æãèšç®ããå¿
èŠããããŸãïŒã次ã«ã倧æ°ãåãé€ããŸããããã¯ãç¯å²ã«é¢ä¿ãªããç
§æã®æãããäœäžããªãããšãæå³ããŸããè·é¢ã«å¿ããŠã©ã€ãã®æãããæãããããšãå®è£
ããã®ã¯ããã»ã©é£ãããããŸããããããããããããããã«ããã§ã¯ã¹ãããããŸããå
æº
å
ã¯ã©ããããæ¥ãªããã°ãªããŸããããã®ã»ã¯ã·ã§ã³ã§ã¯ã3çš®é¡ã®å
æºãå®çŸ©ããŸãããã€ã³ããœãŒã¹
ç¹å
æºã¯ããã®äœçœ®ãšåŒã°ãã空éå
ã®åºå®ç¹ããå
ãæŸåºããŸããå
ã¯ãã¹ãŠã®æ¹åã«åçã«æŸåºãããŸãããããå
šæ¹åç
§æãšãåŒã°ããçç±ã§ãããããã£ãŠãç¹å
æºã¯ããã®äœçœ®ãšæããã«ãã£ãŠå®å
šã«ç¹åŸŽä»ããããŸããçœç±ç¯ã¯ã1ã€ã®è¿äŒŒå€ãç
§æã®ç¹å
æºã§ããçŸå®äžçã®è¯ãäŸã§ããçœç±ç¯ã¯1ã€ã®ãã€ã³ãããå
ãæŸå°ãããå®å
šã«å
šæ¹åæ§ã§ã¯ãããŸããããè¿äŒŒã¯éåžžã«è¯å¥œã§ãããã¯ãã«ãèšå®ããŸãããâã·ãŒã³å
ã®ãã€ã³ãPããå
æºQãžã®æ¹åãšããŠã® Lããã®ãã¯ãã«ã¯ã©ã€ããã¯ãã«ãšåŒã°ããåã«Q - P ã
Qã¯åºå®ãããŠãããPã¯ã·ãŒã³å
ã®ä»»æã®ãã€ã³ãã«ã§ãããããäžè¬çãªå Žå â Lã¯ãã·ãŒã³ã®åãã€ã³ãã§ç°ãªããŸãã
æåæ§ãœãŒã¹
ç¹å
æºãçœç±ç¯ã®é©åãªè¿äŒŒã§ããå Žåã倪éœã®è¿äŒŒãšããŠåœ¹ç«ã€ãã®ã¯äœã§ããïŒããã¯é£ãã質åã§ãããçãã¯äœãã¬ã³ããªã³ã°ããããã«ãã£ãŠç°ãªããŸãã倪éœç³»ã®èŠæš¡ã§ã¯ã倪éœã¯ã»ãŒç¹å
æºãšèŠãªãããšãã§ããŸããæçµçã«ãããç¹ããïŒããªã倧ãããšã¯ããïŒå
ãæŸå°ãããã¹ãŠã®æ¹åã«æŸå°ããŸããã€ãŸããäž¡æ¹ã®èŠä»¶ã«é©åããŸãããã ããã·ãŒã³å
ã§ã¢ã¯ã·ã§ã³ãå°çäžã§çºçããå Žåãããã¯ããŸãé©åãªè¿äŒŒã§ã¯ãããŸããã倪éœã¯éåžžã«é¢ããŠãããããåå
ç·ã¯å®éã«ã¯åãæ¹åã«ãªããŸãïŒæ³šïŒãã®è¿äŒŒå€ã¯éœåžã¹ã±ãŒã«ã§ä¿æãããŸãããå®éã«ã¯é ãã§ã¯ãããŸãããå®éãå€ä»£ã®ãªã·ã£äººã¯ç°ãªãæ¹åã«åºã¥ããŠé©ãã»ã©æ£ç¢ºã«å°çã®ååŸãèšç®ã§ããŸããããŸããŸãªå Žæã®æ¥å
ãïŒãã·ãŒã³ããé ãé¢ããç¹å
æºã䜿çšããŠãããè¿äŒŒããããšã¯å¯èœã§ããããã®è·é¢ãšã·ãŒã³å
ã®ãªããžã§ã¯ãéã®è·é¢ã¯å€§ãããéåžžã«ç°ãªããããæ°å€ã®ç²ŸåºŠã«èª€å·®ãçããå¯èœæ§ããããŸãããã®ãããªå Žåãæåæ§å
æºãå®çŸ©ããŸãããç¹å
æºãšåæ§ã«ãæåæ§å
æºã«ã¯æããããããŸãããããããšã¯ç°ãªããäœçœ®ã¯ãããŸããã代ããã«ãåœŒã¯æ¹åãæã£ãŠããŸããç¹å®ã®æ¹åã«èŒãç¡éé ã®ç¹å
æºãšããŠèªèããããšãã§ããŸããç¹å
æºã®å Žåãæ°ããå
ãã¯ãã«ãèšç®ããå¿
èŠããããŸãâã·ãŒã³ã®åãã€ã³ãPã«å¯Ÿã㊠Lããã ããã®å Žåâ LãäžããããŸãã倪éœãšå°çã®ããã·ãŒã³ã§â Lã¯çãããªããŸãïŒå€ªéœã®äžå¿ïŒ- ïŒå°çã®äžå¿ïŒ ã

ã¢ã³ããšã³ãç
§æ
å®éã®ç
§æã¯ãç¹å
æºãŸãã¯æåæ§å
æºãšããŠã¢ãã«åã§ããŸããïŒã»ãšãã©åžžã«ããã§ãïŒãã ããããã¯å¿
ãããåçŽã§ã¯ãããŸããããŸãŒã³ç
§æïŒãã£ãã¥ãŒã¶ãŒã®èåŸã«ããå
æºãæ³åããŠãã ããïŒã¯ããã®è¡šé¢äžã®å€ãã®ç¹å
æºã«ãã£ãŠè¿äŒŒã§ããŸãããããã¯é£ãããèšç®ã³ã¹ããé«ããçµæã¯çæ³çã§ã¯ãããŸããïŒããããã®2çš®é¡ã®ãœãŒã¹ã¯ãç§ãã¡ã®ç®çã«ååã§ããïŒæ®å¿µãªããããããŸããã
æã§äœãèµ·ãã£ãŠãããæ³åããŠã¿ãŠãã ãããè¿ãã«ããå¯äžã®éèŠãªå
æºã¯å€ªéœã§ããã€ãŸãã倪éœã«å¯Ÿããæã®ãåååãã¯ãã¹ãŠã®ç
§æãåãããåŸãååãã¯å®å
šãªæéã®äžã«ãããŸããç§ãã¡ã¯ãããå°çäžã®ããŸããŸãªè§åºŠããèŠãŠããããã®å¹æã¯ç§ãã¡ãæã®ãäœçžããšåŒã¶ãã®ãäœãåºããŸããããããå°çäžã®ç¶æ³ã¯ãããã«ç°ãªããŸããå
æºããçŽæ¥å
ãåããªããã€ã³ãã§ãããå®å
šã«æéã§ã¯ãããŸããïŒããŒãã«ã®äžã®åºãèŠãŠãã ããïŒãå
æºã®ããã¥ãŒããäœãã«ãã£ãŠé®ãããŠããå Žåãå
ç·ã¯ã©ã®ããã«ããŠãããã®ãã€ã³ãã«å°éããŸããïŒã«ã©ãŒã¢ãã«ã»ã¯ã·ã§ã³ã§è¿°ã¹ãããã«å
ããªããžã§ã¯ãã«åœãããšããã®äžéšã¯åžåãããŸãããæ®ãã¯ã·ãŒã³å
ã§æ£ä¹±ããŸããããã¯ãå
ãå
æºããã ãã§ãªããå
æºãããããåãåãããããæ£ä¹±ãããä»ã®ãªããžã§ã¯ããããæ¥ãããšãæå³ããŸãããããããªãããã«ãã ããã®ã§ããããïŒæ¡æ£ããç
§æã¯ãä»ã®ãªããžã§ã¯ãã«åœãŠããããã®äžéšãåžåãããäžéšãåã³ã·ãŒã³ã«æ£ãã°ããŸããåå°ãããã³ã«ãå
ã¯æããã®äžéšã倱ããŸãããçè«çã«ã¯ç¡éã«ç¶ããããšãã§ããŸãïŒæ³šïŒå
ã¯éåçæ§è³ªã§ãããããå®éã«ã¯ããã§ã¯ãããŸããããããã«ååã«è¿ãã§ãïŒãããã¯ãåãªããžã§ã¯ããç
§æã®å
æºãšèŠãªãå¿
èŠãããããšãæå³ããŸããããæ³åã®ãšãããããã«ããã¢ãã«ã®è€éãã倧å¹
ã«å¢å ããããããã®æ¹æ³ã¯äœ¿çšããŸããïŒãã ããå°ãªããšãã°ããŒãã«ã€ã«ãããŒã·ã§ã³ãã°ãŒã°ã«æ€çŽ¢ããŠçŸããç»åãèŠãããšãã§ããŸãïŒããã ããåãªããžã§ã¯ããçŽæ¥ç
§ãããããå®å
šã«æããããããããšã¯æã¿ãŸããïŒå€ªéœç³»ã®ã¢ãã«ãã¬ã³ããªã³ã°ããªãéãïŒããã®éå£ãå
æããããã«ãæããã®ã¿ã«ãã£ãŠç¹åŸŽä»ãããããã¢ã³ããšã³ãã©ã€ããšåŒã°ãã3çªç®ã®ã¿ã€ãã®å
æºãå®çŸ©ããŸããã·ãŒã³ã®ãããããã€ã³ãã«ç
§æã®ç¡æ¡ä»¶ã®å¯äžããããããšèããããŠããŸããããã¯ãå
æºãšã·ãŒã³ãµãŒãã§ã¹éã®éåžžã«è€éãªçžäºäœçšãéåžžã«åŒ·åã«åçŽåãããã®ã§ãããæ©èœããŸããã·ã³ã°ã«ãã€ã³ãç
§æ
äžè¬ã«ãã·ãŒã³ã«ã¯ãã¢ã³ããšã³ãç
§æã®1ã€ã®ãœãŒã¹ïŒã¢ã³ããšã³ãç
§æã«ã¯èŒåºŠå€ã®ã¿ãããããããã®ä»»æã®æ°ãã¢ã³ããšã³ãç
§æã®åäžã®ãœãŒã¹ã«ç°¡åã«çµåãããããïŒãšãä»»æã®æ°ã®ãã€ã³ãããã³æ¹åãœãŒã¹ããããŸãããã€ã³ãã®ç
§åºŠãèšç®ããã«ã¯ãåå
æºãå°å
¥ããå
éãèšç®ããããããå ç®ããŠããã€ã³ããåãåãç·å
éã衚ã1ã€ã®æ°å€ãååŸããã ãã§ããæ¬¡ã«ããã®ãã€ã³ãã®è¡šé¢ã®è²ã«ãã®æ°å€ãæããŠãé©åã«ç
§æãããè²ãååŸããŸããããã§ãæ¹åãæã€å
ç·ãâæåãŸãã¯ç¹å
æºããã® Lã¯ãã·ãŒã³å
ã®ãããªããžã§ã¯ãã®ç¹Pã«èœã¡ãŸããïŒçŽèгçã«ã¯ããªããžã§ã¯ããå
ã§ã©ã®ããã«åäœãããã«å¿ããŠããªããžã§ã¯ããããããããšãããªãªã¢ã³ããã®2ã€ã®äžè¬çãªã¯ã©ã¹ã«åããããšãã§ããŸããç§ãã¡ã®åšãã®ã»ãšãã©ã®ãªããžã§ã¯ãã¯ãäžéæããšèŠãªãããšãã§ããã®ã§ããããããå§ããŸããæ¡æ£æ£ä¹±
å
ç·ãäžéæãªãªããžã§ã¯ãã«åœãããšãé¡åŸ®é¡ã¬ãã«ã§ã®è¡šé¢ã®ç²ãã«ãããå
ç·ã¯ãã¹ãŠã®æ¹åã«åäžã«ã·ãŒã³ã«åå°ãããŸããã€ãŸãããæ¡æ£ãïŒãæ¡æ£ãïŒåå°ãåŸãããŸããããã確èªããããã«ãå£ãªã©ã®äžéæãªãªããžã§ã¯ããæ³šææ·±ãèŠãŠãã ãããå£ã«æ²¿ã£ãŠç§»åããŠããè²ã¯å€ãããŸãããã€ãŸãããªããžã§ã¯ãããåå°ãããå
ã¯ããªããžã§ã¯ããèŠãå Žæã«é¢ä¿ãªãåãã§ããäžæ¹ãåå°å
ã®éã¯ãå
ç·ãšè¡šé¢ã®éã®è§åºŠã«äŸåããŸããçŽèгçã«ã¯ãããã¯çè§£ã§ããŸã-ããŒã ã«ãã£ãŠè»¢éããããšãã«ã®ãŒã¯ãè§åºŠã«å¿ããŠãããå°ããªãŸãã¯ãã倧ããªè¡šé¢ã«åæ£ããå¿
èŠããããŸããã€ãŸããã·ãŒã³ã«åæ ãããåäœé¢ç©ãããã®ãšãã«ã®ãŒã¯ããããé«ããŸãã¯äœããªããŸãã
ãããæ°åŠçã«è¡šçŸããããã«ããã®æ³ç·ãã¯ãã«ã«ãã£ãŠè¡šé¢ã®åããç¹åŸŽä»ããŸããããæ³ç·ãã¯ãã«ããŸãã¯åã«ãæ³ç·ãã¯ãããç¹ã§è¡šé¢ã«åçŽãªãã¯ãã«ã§ãããŸããåäœãã¯ãã«ã§ããã€ãŸããé·ãã¯1ã§ãããã®ãã¯ãã«ãåŒã³åºããŸããâ N ã
æ¡æ£åå°ã¢ããªã³ã°
ã ãããæ¹åãæã€å
ç· â Lãšæããæ³ç·ã§è¡šé¢ã«èœã¡ãâ N ã
ã©ã®éšå ç§ã¯ã·ãŒã³ã颿°ãšããŠåæ ããŸããç§ã¯ ã
â N ãããŠ
â L ïŒ
幟äœåŠçãªé¡æšã®ããã«ãå
ã®æãããããŒã ã®ãå¹
ããšããŠæ³åããŠã¿ãŸãããããã®ãšãã«ã®ãŒã¯ããµã€ãºããšã«è¡šé¢ã«ååžããŸãA ã ãã€
â N ãããŠ
â Lã«ã¯1ã€ã®æ¹åããããŸããã€ãŸããããŒã ã¯è¡šé¢ã«åçŽã§ããI = Aãããã¯ãåäœé¢ç©ãããã®åå°ãšãã«ã®ãŒãåäœé¢ç©ãããã®å
¥å°ãšãã«ã®ãŒã«çããããšãæå³ããŸãã<ç§ã¯A =1 ã
äžæ¹ãè§åºŠã â L ãããŠ
â Nåã®ã¢ãããŒã90 â ã
Aãè¿ã¥ããŠããŸãâãã€ãŸããåäœé¢ç©ãããã®ãšãã«ã®ãŒã¯0ã«è¿ã¥ããŸããLIM A â â IA =0 ã
ããããéã«äœãèµ·ããã®ã§ããããïŒãã®ç¶æ³ãäžã®å³ã«ç€ºããŸããç¥ã£ãŠãâ N ã
â L ãããŠ
P ;
è§åºŠã远å ããŸãã a l p h a ãããŠ
\ããŒã¿ã ãã§ãªãããã€ã³ãQ ã
â R ãããŠ
Sãã®ã¹ããŒã ã«é¢é£ããèšé²ãç°¡åã«ããŸããæè¡çã«å
ç·ã«ã¯å¹
ããªãããããã¹ãŠãç¡éã«å°ããªå¹³ããªè¡šé¢é åã§çºçãããšæ³å®ããŸããããšããããçäœã®è¡šé¢ã§ãã£ãŠããå°çãå°ããªã¹ã±ãŒã«ã§å¹³ãã«èŠããããã«ãèæ
®äžã®é åã¯ç¡éã«å°ãããçäœã®ãµã€ãºã«å¯ŸããŠã»ãŒå¹³ãã§ããå¹
ã®ããå
ã®ããŒã
ããå°ç¹ã§æ°Žé¢ã«èœã¡ãæãã® P\ããŒã¿ ã
ãã€ã³ãã§æ£åžž Pã¯çããâ Nãããã³ããŒã ã«ãã£ãŠéã°ãããšãã«ã®ãŒã¯A ã
èšç®ããå¿
èŠããããŸã ç§ã¯A ã
æ€èšããŸã S RããŒã ã®ãå¹
ããå®çŸ©ã«ãããåçŽã§ãâ Lããããæ¹åã§ãP Q ã ã ãã
P Q ãããŠ
Q Rã¯çŽè§ã圢æããå転ããŸãP Q RãçŽè§äžè§åœ¢ã«ããŸããã³ãŒããŒã®1ã€P Q Rã¯æ¬¡ãšçãã90 âãããã³ãã®ä»-\ããŒã¿ ã
次ã«ã3çªç®ã®è§åºŠã¯ 90 â - β ã
ããããããã«æ³šæããå¿
èŠããããŸã â N ãããŠ
P Rã¯ãŸãçŽè§ã圢æããŸããα + βã90 â ã ã ãã
^ Q R P =α ïŒ
äžè§åœ¢ãèŠãŠã¿ãŸããã P Q R ã
ãã®è§åºŠã¯çãã a l p h a ã
\ããŒã¿ ãããŠ
90 â ã
ããŒãã£ãŒ Q Rã¯æ¬¡ãšçããç§ã¯2ãããã³åŽé¢P Rã¯æ¬¡ãšçããA2 ã
ãããŠä»...äžè§æ³ã¯æ¥ãã§å©ãã«ãªããŸãïŒå®çŸ©ã«ããc o s ïŒÎ± ïŒ= Q RP r ;
åãæ¿ãã Q R ã«
ç§ã¯2 ããããŠ
P r ã«
A2ããããŠæã
ã¯åŸãc o s ïŒÎ± ïŒ= I2A2
ã«å€æããããã®c o s ïŒÎ± ïŒ= IA
ã»ãŒå®äºã§ãã a l p h aã¯ãâ N ãããŠ
â Lãã€ãŸãc o s ïŒÎ± ïŒã¯ãC O S ïŒÎ± ïŒ= âš â Nãâ L â©| â N | | â L |
ãããŠæåŸã«ç§ã¯A =âš â Nã â L â©| â N | | â L |
ãã®ãããå
ã®åå°éšåãšã衚é¢ã®æ³ç·ãšå
ã®æ¹åãšã®éã®è§åºŠãçµã¶éåžžã«ç°¡åãªæ¹çšåŒãåŸãŸããããã倧ããè§åºŠã§æ³šæããŠãã ãã90 â 䟡å€
c o s ïŒÎ± ïŒã¯è² ã«ãªããŸãããã®å€ã䜿çšããããšããããããªããã°ãå
ãå·®ãåŒãå
æºã«ãªããŸããããã«ã¯ç©ççãªæå³ã¯ãããŸãããè§åºŠã倧ãã90 âå
ãå®éã«å°éããããšãåã«æå³åŸé¢ãããã³ç
§æãã€ã³ãã®ã«ãã¬ããžã«å¯äžããŸãããã€ãŸããc o s ïŒÎ± ïŒã¯è² ã«ãªããããããçãããšèãã0 ã
æ¡æ£åå°æ¹çšåŒ
ããã§ããã€ã³ããåãåãå
ã®ç·éãèšç®ããæ¹çšåŒãå®åŒåã§ããŸã éåžžã® Pâåšå²ã®æãããããã·ãŒã³ã® NI A ãããŠ
Nãã€ã³ããŸãã¯èŒåºŠã§æåæ§å
I nããã³ã©ã€ããã¯ãã«â L næ¢ç¥ïŒæåå
æºã®å ŽåïŒããŸãã¯Pã«å¯ŸããŠèšç®ïŒç¹å
æºã®å ŽåïŒïŒI P = I A + N Σ㯠iã= 1 I I âš â Nãâ L Iã â©| â N | | â L i |
ã¡ã³ããŒã âš â Nãâ L iã â© < 0ã¯ãå
ãã€ã³ãã«è¿œå ãããã¹ãã§ã¯ãããŸãããéåžžã®ç
ããã§å¯äžã®äºçްãªäºãæ¬ ããŠããŸãïŒæ³ç·ã¯ã©ãããæ¥ãŸããïŒãã®è³ªåã¯ãèšäºã®ç¬¬2éšã§èŠãããã«ãèŠãããããã¯ããã«è€éã§ãã幞ããªããšã«ãåæããŠããå Žåã«ã¯ãéåžžã«ç°¡åãªè§£æ±ºçããããŸããçã®ä»»æã®ç¹ã®æ³ç·ãã¯ãã«ã¯ãçã®äžå¿ãéãç·äžã«ãããŸããã€ãŸããçäœã®äžå¿ãCãæ¬¡ã«ç¹ã®æ³ç·ã®æ¹åP çãã
P - C ïŒ
ãæ®éãã§ã¯ãªããæ®éã®æ¹åããšæžããã®ã¯ãªãã§ããïŒè¡šé¢ã«å¯ŸããåçŽæ§ã«å ããŠãæ³ç·ã¯åäœãã¯ãã«ã§ãªããã°ãªããŸãããããã¯ãçã®ååŸãçããå Žåã«åœãŠã¯ãŸããŸã1ãããã¯åžžã«æ£ãããšã¯éããŸãããæ³ç·èªäœãèšç®ããã«ã¯ããã¯ãã«ããã®é·ãã§é€ç®ããŠãé·ããååŸããå¿
èŠããããŸã1 ïŒ
â N = P - C| P - C |
äžèšã®ã©ã€ãã£ã³ã°æ¹çšåŒã«ã¯ã | â N | ããããè¯ãã¢ãããŒãã¯ãçã®ãæ³ç·ãäœæããããšã§ããããã«ãããä»åŸã®äœæ¥ãç°¡çŽ åãããŸããæ¡æ£åå°ã¬ã³ããªã³ã°
ããããã¹ãŠãæ¬äŒŒã³ãŒãã«å€æããŸãããããŸããã·ãŒã³ã«ããã€ãã®å
æºã远å ããŸãããã ã©ã€ã{
ã¿ã€ã=ã¢ã³ããšã³ã
匷床= 0.2
}
ã©ã€ã{
ã¿ã€ã=ãã€ã³ã
匷床= 0.6
äœçœ®=ïŒ2ã1ã0ïŒ
}
ã©ã€ã{
ã¿ã€ã=æ¹å
匷床= 0.2
æ¹å=ïŒ1ã4ã4ïŒ
}
æããã䟿å©ã«ç©ã¿éãªãããšã«æ³šæããŠãã ãã 1.0ã¯ãã©ã€ãã£ã³ã°ã®åŒããããã€ã³ãã1ãããé«ãå
ã®èŒåºŠãæã€ããšã¯ã§ããªãããã§ããããã¯ããé²åºãå€ãããããšãªã¢ãååŸããªãããšãæå³ããŸããã©ã€ãã£ã³ã°ã®æ¹çšåŒã¯ãæ¬äŒŒã³ãŒãã«å€æããã®ã¯éåžžã«ç°¡åã§ãã ComputeLightingïŒPãNïŒ{
i = 0.0
scene.Lights {
light.type == ambient {
i + = light.intensity
} else {
light.type ==ãã€ã³ãã®å Žå
L = light.position-P
ä»ã«
L = light.direction
n_dot_l =ãããïŒNãLïŒ
n_dot_l> 0ã®å Žå
i + = light.intensity * n_dot_l /ïŒé·ãïŒNïŒ*é·ãïŒLïŒïŒ
}
}
ç§ãè¿ã
}
ãããŠãå¯äžã®ããšã¯ãå·Š-ã䜿çšããããšComputeLighting
ã«TraceRay
ãçã®è²ãè¿ãæååã眮ãæããŸã nearest_sphere.colorãè¿ããŸã
ãã®ã¹ããããã«ïŒ P = O + nearest_t * DïŒäº€å·®ç¹ã®èšç®
N = P-nearest_sphere.centerïŒäº€å·®ç¹ã§ã®çã®æ³ç·ãèšç®ããŸã
N = N /é·ãïŒNïŒ
æãè¿ã_sphere.colorãè¿ããŸã* ComputeLightingïŒPãNïŒ
楜ãã¿ã®ããã«ã倧ããªé»è²ã®çäœã远å ããŸãããã sphere {
color =ïŒ255ã255ã0ïŒïŒé»è²
äžå€®=ïŒ0ã-5001,0ïŒ
ååŸ= 5000
}
ã¬ã³ãã©ãŒãå®è¡ãããšãèŠã-çäœãã€ãã«çäœã®ããã«èŠãå§ããŸããïŒ
ãœãŒã¹ã³ãŒããšåäœãã¢>>ããããåŸ
ã£ãŠãã ããã倧ããªé»è²ãçäœã¯ã©ã®ããã«ããŠå¹³ããªé»è²ãåºã«å€ãããŸãããïŒããã¯ããã§ã¯ãããŸããã§ãããä»ã®3ã€ãšæ¯ã¹ãŠéåžžã«å€§ãããã«ã¡ã©ã¯éåžžã«è¿ããå¹³ãã«èŠããŸããå°çäžã«ç«ã€ãšãå°çãå¹³ãã«èŠããããã«ãæ»ãããªè¡šé¢åå°
次ã«ããå
æ²¢ã®ããããªããžã§ã¯ãã«æ³šç®ããŸãã ããããããªããžã§ã¯ããšã¯ç°ãªãããè¯éºãªããªããžã§ã¯ãã¯ãããŸããŸãªè§åºŠããèŠããšãã«å€èгãå€åããŸããããªã€ãŒãããŒã«ãåãããè»ãæŽãã ãã§ãããã®ãããªãªããžã§ã¯ãã§ã¯ãå
ã®äŒæã®ç¹å¥ãªãã¿ãŒã³ã衚瀺ãããŸããéåžžã¯ãåšããæ©ããšåãããã«èŠããæããé åããããŸããããããªããžã§ã¯ããšã¯ç°ãªãããããã®ãªããžã§ã¯ãã®è¡šé¢ãèªèããæ¹æ³ã¯ãå®éã«ã¯èŠç¹ã«ãã£ãŠç°ãªããŸããèµ€ãããªã€ãŒãããŒã«ã¯2ã3æ©äžãã£ãŠãèµ€ã®ãŸãŸã§ããããå
æ²¢ã®ãããå€èгãäžããæããçœãã¹ãããã¯åãããã§ããããã¯ãæ°ããå¹æãæ¡æ£åå°ã«ä»£ãããã®ã§ã¯ãªãããããè£å®ããããšãæå³ããŸãããªããããèµ·ãã£ãŠããã®ã§ããïŒ
ããããªããžã§ã¯ãã§ãããèµ·ãããªãçç±ããå§ããŸããããåã®ã»ã¯ã·ã§ã³ã§èŠãããã«ãå
ç·ãããããªããžã§ã¯ãã®è¡šé¢ã«åœãããšãå
ç·ã¯ãã¹ãŠã®æ¹åã«åäžã«æ£ä¹±ããŠã·ãŒã³ã«æ»ããŸããçŽèгçã«ã¯ãããã¯ãªããžã§ã¯ãã®è¡šé¢ã®äžåäžæ§ã®ããã«çºçããŸããã€ãŸããé¡åŸ®é¡ã¬ãã«ã§ã¯ãã©ã³ãã ãªæ¹åãåããå€ãã®å°ããªè¡šé¢ã®ããã«èŠã
ãŸãããã1ã€ã®æ¥µç«¯ãªäŸãå®å
šã«æŽç·Žããããã©ãŒãèŠãŠã¿ãŸããããå
ç·ããã©ãŒã«åœãããšããã©ãŒã®æ³ç·ã«å¯Ÿããå
¥å°è§ã«å¯Ÿç§°ãªåäžæ¹åã«åå°ããŸããåå°å
ã®æ¹åãåŒã¶ãšâ Rãšç§ãã¡ã¯åæããŸãâ Lã¯å
æºã瀺ããæ¬¡ã®ãããªç¶æ³ã«ãªããŸãããç 磚ãããã衚é¢ã®çšåºŠã«å¿ããŠãå€ããå°ãªããé¡ã®ããã§ããã€ãŸãããé¡ãåå°ïŒã©ãã³èªãé¡ãããã®é¡é¢åå°ãã€ãŸããé¡ãïŒãååŸããŸããå®å
šã«ç£šãããé¡ã®å Žåãå
¥å°å
ç·
â Lã¯åäžã®æ¹åã«åæ ãããŸãâ R ã
ããã«ããããã©ãŒå
ã®ãªããžã§ã¯ããæç¢ºã«èŠãããšãã§ããŸããå
¥å°å
ç·ããšã« â Lã¯å¯äžã®åå°ããŒã ã§ãâ R ã
ãããããã¹ãŠã®ãªããžã§ã¯ããå®å
šã«æŽç·ŽãããŠããããã§ã¯ãããŸãããã»ãšãã©ã®å
ã¯æ¹åã«åå°ãããŸããâ Rããã®äžéšã¯è¿ãã®æ¹åã«åæ ãããŸãâ R ;
ã«è¿ã â Rããã®æ¹åã«ããå€ãã®å
ãåå°ãããŸãããªããžã§ã¯ãã®ãèŒããã¯ãé¢ãããšãã«åå°å
ãã©ãã ãéãæžå°ããããæ±ºå®ããŸãâ R ïŒ
ç§ãã¡ã¯ã©ã®ãããã®å
ãèŠã€ããã®ã«èå³ããããŸã â Lã¯èŠç¹ã®æ¹åã«åå°ãããŸãïŒåç¹ã®è²ã決å®ããããã«äœ¿çšããã®ã¯å
ã ããã§ãïŒããã
â Vã¯ã以äžã瀺ãã調æ»ãã¯ãã«ãã§ãã«ã¡ã©ã« P Lã®Pã®æéA -ãšã®éã®è§åºŠâ R ãããŠ
â Vãããã¯ç§ãã¡ãæã£ãŠãããã®ã§ãïŒ
ã§
α = 0 âå
šãŠã®å
ãåå°ããŸããã§
α = 90 âå
ãåå°ãããŸãããæ¡æ£åå°ãšåæ§ã«ãäžéå€ã§äœãèµ·ããããæ±ºå®ããæ°åŒãå¿
èŠã§ã a l p h a ã
ãã©ãŒåå°ã®ã¢ããªã³ã°
ãã¹ãŠã®ã¢ãã«ãç©çã¢ãã«ã«åºã¥ããŠããããã§ã¯ãªãããšãå
ã»ã©èª¬æããããšãèŠããŠããŸããïŒããŠãããã«ãã®äžäŸããããŸãã以äžã«ç€ºãã¢ãã«ã¯ä»»æã§ãããèšç®ãç°¡åã§èŠæ ããè¯ãããã䜿çšãããŸãããšããŸãããc o s ïŒÎ± ïŒ ã
åªããç¹æ§ããããŸãã c o s ïŒ0 ïŒ= 1 ã
c o s ïŒÂ± 90 ïŒ= 0ã§ãå€ã¯åŸã
ã«æžå°ããŸã0 åã«
éåžžã«çŸããæ²ç·ã«æ²¿ã£ã 90ïŒ
c o s ïŒÎ± ïŒã¯ãããã©ãŒãåå°æ©èœã®ãã¹ãŠã®èŠä»¶ãæºãããŠããã®ã§ã䜿çšããªãã®ã¯ãªãã§ããïŒãããããã1ã€è©³çްããããŸããããã®å®åŒåã§ã¯ããã¹ãŠã®ãªããžã§ã¯ããçããèŒããŸããæ¹çšåŒã倿ŽããŠç°ãªãå
沢床ãåŸãæ¹æ³ã¯ïŒãã®å
æ²¢ã¯ãåå°é¢æ°ãå¢å ããã«ã€ããŠã©ãã ãéãæžå°ãããã®å°ºåºŠã§ããããšãå¿ããªãã§ãã ãã a l p h a ã
ç°ãªãå
床æ²ç·ãååŸããéåžžã«ç°¡åãªæ¹æ³ã¯ã次æ°ãèšç®ããããšã§ã c o s ïŒããã€ãã®æ£ã®ææšã® αs ã 以æ¥
0 †C ãO ãS ïŒÎ± ïŒâ€ 1ãããã¯æããã§ã0 †C ãO ãS ïŒÎ± ïŒS †1 ; ããã¯
c o s ïŒÎ± ïŒsã¯ã次ãšãŸã£ããåãããã«åäœããŸããc o s ïŒÎ±ãããã§ã«ãã®ã¿ãããã«
ç°ãªãå€ã® c o s ïŒÎ± ïŒss ïŒ
ããé«ãäŸ¡å€ sãããã§ã«ãã¯è¿åã®é¢æ°ã«ãªããŸã0ãããã³ãªããžã§ã¯ããããèŒãããã«èŠããŸããsã¯éåžžãåå°ã€ã³ããã¯ã¹ãšåŒã°ãã衚é¢ç¹æ§ã§ããã¢ãã«ã¯ç©çççŸå®ã«åºã¥ããŠããªããããæå³sã¯è©Šè¡é¯èª€ã«ãã£ãŠã®ã¿ãã€ãŸããèªç¶ãã«èŠãããŸã§å€ã調æŽããããšã«ãã£ãŠã®ã¿æ±ºå®ã§ããŸãïŒæ³šïŒç©çåŠããŒã¹ã®ã¢ãã«ã䜿çšããã«ã¯ã2ããŒã åå°é¢æ°ïŒDFOSïŒãåç
§ããŠãã ããïŒããã¹ãŠäžç·ã«ããŸããããã¬ã€â Lã¯ç¹ã§è¡šé¢ã«èœã¡ãŸãPã¯æ³ç·â Nãããã³åå°ææ°ã¯s ã
èŠç·æ¹åã«åå°ãããå
ã®é â V ïŒ
ãã®å€ã¯ã c o s ïŒÎ± ïŒs ã©ãã§
a l p h aã¯ãâ V ãããŠ
â Ré çªã«ãããâ Lã¯ãæ¯èŒçåå°ããŸããâ N ã
ã€ãŸããæåã®ã¹ãããã¯èšç®ããããšã§ã â R ãã
â N ãããŠ
â L ã
åè§£ã§ããŸã â Lãã2ã€ã®ãã¯ãã«â L P ãããŠ
â L Nããã«ãâ L = â L P + â L N ã©ãã§
â L Nã¯å¹³è¡â N ããããŠ
â L Pã¯åçŽâ N ïŒ
â L Nã¯æåœ±â L ã«
â N ;
ã¹ã«ã©ãŒç©ã®ç¹æ§ã«åŸããæ¬¡ã®äºå®ã«åºã¥ã㊠| â N | = 1ããã®æåœ±ã®é·ãã¯âš â Nãâ L â© ã
ç§ãã¡ã¯ãããæ±ºå®ããŸãã â L Nã¯å¹³è¡ã«ãªããŸãâ Nãããâ L N = â N âš â Nã â L â© ã
以æ¥
â L = â L P + â L Nãããã«ååŸã§ããŸãâ L P = â L - â L N = â L - â N âš â Nã â L â© ã
ä»èŠãŠ â R ;
察称çã ãã â Lçžå¯Ÿâ Nããã®ã³ã³ããŒãã³ãã䞊åâ Nãåãâ Lãããã³åçŽæåã¯æåã®å察ã§ãâ L ; ããã¯
â R = â L N - â L P ïŒ
åã«ååŸããåŒã代å
¥ãããšã次ã®ããã«ãªããŸãâ R = â N âš â Nã â L â©- â L + â N âš â Nã â L â©
å°ãç°¡ç¥åãããšãâ R =2 â N âš â Nã â L â©- â L
ãé¡ãåå°ã®äŸ¡å€
ããã§ããé¡ãåå°ã®æ¹çšåŒãæžãæºåãã§ããŸãããâ R =2 â N âš â Nã â L â©- â L
I S = I L ïŒâš â Rãâ V â©| â R | | â V | ïŒs
æ¡æ£ç
§æãšåæ§ã«ã c o s ïŒÎ± ïŒã¯è² ã®å€ã«ãªãå¯èœæ§ããããããå床ç¡èŠããªããã°ãªããŸãããããã«ããã¹ãŠã®ãªããžã§ã¯ããçŽ æŽãããããã§ã¯ãããŸããããã®ãããªãªããžã§ã¯ãïŒããã¯ãS = - 1ïŒäžè¬ã«ããã©ãŒãã®å€ãç®åºãããŸãããé¡åã¬ã³ããªã³ã°
çŸåšäœæ¥äžã®ããã©ãŒãåå°ãã·ãŒã³ã«è¿œå ããŸãããããŸããã·ãŒã³èªäœã«ããã€ãã®å€æŽãå ããŸãã sphere {
center =ïŒ0ã-1ã3ïŒ
ååŸ= 1
color =ïŒ255ã0ã0ïŒïŒèµ€
é¡é¢åå°= 500ïŒããªãªã¢ã³ã
}
sphere {
äžå€®=ïŒ-2ã1ã3ïŒ
ååŸ= 1
color =ïŒ0ã0ã255ïŒïŒé
é¡é¢åå°= 500ïŒããªãªã¢ã³ã
}
sphere {
äžå€®=ïŒ2ã1ã3ïŒ
ååŸ= 1
color =ïŒ0ã255ã0ïŒïŒç·
é¡é¢åå°= 10ïŒå°ãè¯éº
}
sphere {
color =ïŒ255ã255ã0ïŒïŒé»è²
äžå€®=ïŒ0ã-5001,0ïŒ
ååŸ= 5000
é¡é¢åå°= 1000ïŒéåžžã«çŽ æŽããã
}
ã³ãŒãã§ã¯ãå¿
èŠã«ComputeLighting
å¿ããŠããã©ãŒãªã³ã°ãã®å€ãèšç®ããäžè¬çãªç
§æã«è¿œå ããããã«å€æŽããå¿
èŠããããŸããä»åœŒãå¿
èŠãšããããšã«æ³šæããŠãã ããâ V ãããŠ
s ïŒ
ComputeLightingïŒPãNãVãsïŒ{
i = 0.0
scene.Lights {
light.type == ambient {
i + = light.intensity
} else {
light.type ==ãã€ã³ãã®å Žå
L = light.position-P
ä»ã«
L = light.direction
ïŒæ¡æ£
n_dot_l =ãããïŒNãLïŒ
n_dot_l> 0ã®å Žå
i + = light.intensity * n_dot_l /ïŒé·ãïŒNïŒ*é·ãïŒLïŒïŒ
ïŒãã©ãŒãªã³ã°
if sïŒ= -1 {
R = 2 * N *ãããïŒNãLïŒ-L
r_dot_v =ãããïŒRãVïŒ
r_dot_v> 0ã®å Žå
i + = light.intensity * powïŒr_dot_v /ïŒé·ãïŒRïŒ*é·ãïŒVïŒïŒãsïŒ
}
}
}
ç§ãè¿ã
}
æåŸã«ãTraceRay
æ°ãããã©ã¡ãŒã¿ãæž¡ãããã«å€æŽããå¿
èŠããããŸãComputeLighting
ãsã¯æããã§ããçäœã®ããŒã¿ããååŸãããŸããããããã©ãã§ããâ V ïŒ
â Vã¯ããªããžã§ã¯ãããã«ã¡ã©ãæããã¯ãã«ã§ãã幞ããªããšã«ãã«ã¡ã©ãããªããžã§ã¯ãã«åãããããã¯ãã«ãæ¢ã«ãããŸã-ããTraceRay
â Dããã¬ãŒã¹ãããå
ç·ã®æ¹åïŒããã¯
â Vã¯ãã - â D ã
TraceRay
ããã©ãŒããªãã¬ã¯ã·ã§ã³ã䜿çšããæ°ããã³ãŒããæ¬¡ã«ç€ºããŸãã TraceRayïŒOãDãt_minãt_maxïŒ{
æãè¿ãt = inf
nearest_sphere = NULL
scene.Spheres {ã®çã®å Žå
t1ãt2 = IntersectRaySphereïŒOãDãçäœïŒ
[t_minãt_max]ã®t1ããã³t1 <closest_tã®å Žå
æãè¿ãt = t1
æãè¿ãçäœ=çäœ
[t_minãt_max]ã®t2ããã³t2 <closest_tã®å Žå
æãè¿ãt = t2
æãè¿ãçäœ=çäœ
}
nearest_sphere == NULLã®å Žå
BACKGROUND_COLORãè¿ããŸã
P = O + nearest_t * DïŒäº€å·®ç¹ã®èšç®
N = P-nearest_sphere.centerïŒäº€å·®ç¹ã§ã®çã®æ³ç·ãèšç®ããŸã
N = N /é·ãïŒNïŒ
æãè¿ã_sphere.colorãè¿ã* ComputeLightingïŒPãNã-Dãsphere.specularïŒ
}
ãããŠããã¹ãŠãã®ãžã£ã°ãªã³ã°ãã¯ãã«ã«ã€ããŠãåœç€Ÿã®å ±é
¬ïŒ
ãœãŒã¹ã³ãŒããšäœæ¥ã®ãã¢>>圱
å
ãšç©äœããããšããã«ã¯ã圱ããªããã°ãªããŸãããããã§ç§ãã¡ã®åœ±ã¯ã©ãã«ããã®ã§ããããïŒããåºæ¬çãªè³ªåããå§ããŸãããããªãã¹ãã§åœ±ãïŒåœ±ã¯å
ããããšããã«çŸããŸããããã®å
ç·ã¯ãªããžã§ã¯ãã«å°éã§ããŸããããã¹ã«å¥ã®ãªããžã§ã¯ããããããã§ããåã®ã»ã¯ã·ã§ã³ã§ã¯è§åºŠãšãã¯ãã«ã«é¢å¿ããããŸããããå
æºãšè²ä»ãããå¿
èŠãããç¹ã®ã¿ãèæ
®ããã·ãŒã³ã§çºçããä»ã®ãã¹ãŠãå®å
šã«ç¡èŠããŸãã-ããšãã°ãéªéã«ãªã£ããªããžã§ã¯ãã代ããã«ãããã€ã³ããšãœãŒã¹ã®éã«ãªããžã§ã¯ããããå Žåããã®ãœãŒã¹ããã®ç
§æã远å ããå¿
èŠã¯ãããŸããããšããå°ããªããžãã¯ã远å ããå¿
èŠããããŸããæ¬¡ã®2ã€ã®ã±ãŒã¹ã匷調ããŸãã
ããã«å¿
èŠãªããŒã«ã¯ãã¹ãŠæã£ãŠããããã§ããæåæ§ãœãŒã¹ããå§ããŸããããç¥ã£ãŠãP ;
ãããç§ãã¡ã®èå³ãåŒããã€ã³ãã§ããç¥ã£ãŠãâ L ;
ããã¯å
æºã®å®çŸ©ã®äžéšã§ããæã£ãŠããP ãããŠ
â Lãã€ãŸãå
ç·ãèšå®ã§ããŸããP + t â Lãããç¹ããç¡éé ã®å
æºãŸã§ééããŸãããã®å
ç·ã¯å¥ã®ãªããžã§ã¯ããšäº€å·®ããŸããïŒããã§ãªãå Žåã¯ããã€ã³ããšãœãŒã¹ã®éã«äœããããŸãããã€ãŸãããã®ãœãŒã¹ããç
§æãèšç®ãããããåèšç
§æã«è¿œå ã§ããŸãã亀差ããå Žåããã®ãœãŒã¹ãç¡èŠããŸããå
ç·ãšçäœã®éã®æãè¿ã亀差ç¹ãèšç®ããæ¹æ³ã¯ãã§ã«ç¥ã£ãŠããŸããã«ã¡ã©ããã®å
ç·ã远跡ããããã«äœ¿çšããŸããåã³äœ¿çšããŠãå
ç·ãšã·ãŒã³ã®æ®ãã®éšåãšã®éã®æãè¿ã亀差ãèšç®ã§ããŸãããã ãããªãã·ã§ã³ã¯ãããã«ç°ãªããŸããã«ã¡ã©ããéå§ãã代ããã«ãP ã
æ¹åãçãããªã ïŒV - O ïŒ ããããŠ
â L ã
ãããŠãç§ãã¡ã¯ãã¹ãŠã®åŸãšäº€å·®ããããšã«èå³ããããŸã Pããç¡éã®è·é¢ããšããããšã§ãt m i n = 0 ãããŠ
t m a x = + â ã
ãã€ã³ããœãŒã¹ã¯éåžžã«äŒŒãæ¹æ³ã§åŠçã§ããŸããã2ã€ã®äŸå€ããããŸãããŸããèšå®ãããŠããŸããâ Lã§ããããœãŒã¹ã®äœçœ®ããèšç®ããã®ã¯éåžžã«ç°¡åã§ããP ã
第äºã«ã以äžããå§ãŸã亀差ç¹ã«èå³ããããŸã Pããã ããŸã§LïŒãã以å€ã®å Žåãå
æºã®èåŸã«ãããªããžã§ã¯ãã圱ãäœæããå¯èœæ§ããããŸãïŒïŒ; ã€ãŸãããã®å Žåt m i n = 0 ãããŠ
t m a x = 1 ã
èæ
®ãã¹ãå¢çç·ã®ã±ãŒã¹ã1ã€ãããŸããå
ç·ãåãP + t â L ã
ã§å§ãŸã亀差ç¹ãæ¢ããš t m i n = 0ã®å ŽåãP ã§
t = 0ã®çç±Pã¯å®éã«çäœäžã«ãããP + 0 â L = P ;
èšãæããã°ãåãªããžã§ã¯ãã¯ããèªèº«ã«åœ±ãèœãšããŸãïŒæ³šïŒããæ£ç¢ºã«ã¯ããªããžã§ã¯ãå
šäœã§ã¯ãªãããã€ã³ããããèªäœã«åœ±ãèœãšãç¶æ³ãé¿ãããã§ã;çäœãããè€éãªåœ¢ç¶ã®ãªããžã§ã¯ãïŒã€ãŸããå¹é¢ãªããžã§ã¯ãïŒèªäœã«çã®åœ±ãèœãšãããšãã§ããŸãïŒãããåŠçããæãç°¡åãªæ¹æ³ã¯ãå€ã®äžéã䜿çšããããšã§ãt ã®ä»£ããã«
0äœãå€\ã€ã¹ãŒãã·ãã³ ã
幟äœåŠçã«ã衚é¢ããå°ãé¢ãããšãããã€ãŸãã Pã§ã¯ãªãæ£ç¢ºã«P ã
ã€ãŸããæåãœãŒã¹ã®å Žåãéé㯠[ ϵ ã+ â ]ããã³ç¹-[ ϵ ã1 ] ã
圱ä»ãã®ã¬ã³ããªã³ã°
ãããæ¬äŒŒã³ãŒãã«å€ããŸããããåã®ããŒãžã§ã³ã§TraceRay
ã¯ãããŒã ãšçäœã®æãè¿ã亀差ç¹ãèšç®ããæ¬¡ã«äº€å·®ç¹ã®ç
§æãèšç®ããŸããã圱ãèšç®ããããã«åã³äœ¿çšãããããæãè¿ã亀差ç¹ã®ã³ãŒããæœåºããå¿
èŠããããŸãã ClosestIntersectionïŒOãDãt_minãt_maxïŒ{
æãè¿ãt = inf
nearest_sphere = NULL
scene.Spheres {ã®çã®å Žå
t1ãt2 = IntersectRaySphereïŒOãDãçäœïŒ
[t_minãt_max]ã®t1ããã³t1 <closest_tã®å Žå
æãè¿ãt = t1
æãè¿ãçäœ=çäœ
[t_minãt_max]ã®t2ããã³t2 <closest_tã®å Žå
æãè¿ãt = t2
æãè¿ãçäœ=çäœ
}
æãè¿ã_sphereãæãè¿ã_tãè¿ã
}
çµæTraceRay
ã¯ã¯ããã«ç°¡åã§ãïŒ TraceRayïŒOãDãt_minãt_maxïŒ{
nearest_sphereãclosest_t = ClosestIntersectionïŒOãDãt_minãt_maxïŒ
nearest_sphere == NULLã®å Žå
BACKGROUND_COLORãè¿ããŸã
P = O + nearest_t * DïŒäº€å·®ç¹ã®èšç®
N = P-nearest_sphere.centerïŒäº€å·®ç¹ã§ã®çã®æ³ç·ãèšç®ããŸã
N = N /é·ãïŒNïŒ
æãè¿ã_sphere.colorãè¿ã* ComputeLightingïŒPãNã-Dãsphere.specularïŒ
}
次ã«ComputeLighting
ãã·ã£ããŠãã§ãã¯ã远å ããå¿
èŠããããŸãã ComputeLightingïŒPãNãVãsïŒ{
i = 0.0
scene.Lights {
light.type == ambient {
i + = light.intensity
} else {
light.type == point {
L = light.position-P
t_max = 1
} else {
L = light.direction
t_max = inf
}
ïŒã·ã£ããŠãã§ãã¯
shadow_sphereãshadow_t = ClosestIntersectionïŒPãLã0.001ãt_maxïŒ
shadow_sphereïŒ= NULLã®å Žå
ç¶ãã
ïŒæ¡æ£
n_dot_l =ãããïŒNãLïŒ
n_dot_l> 0ã®å Žå
i + = light.intensity * n_dot_l /ïŒé·ãïŒNïŒ*é·ãïŒLïŒïŒ
ïŒãã©ãŒãªã³ã°
if sïŒ= -1 {
R = 2 * N *ãããïŒNãLïŒ-L
r_dot_v =ãããïŒRãVïŒ
r_dot_v> 0ã®å Žå
i + = light.intensity * powïŒr_dot_v /ïŒé·ãïŒRïŒ*é·ãïŒVïŒïŒãsïŒ
}
}
}
ç§ãè¿ã
}
æ°ããã¬ã³ããªã³ã°ãããã·ãŒã³ã¯æ¬¡ã®ããã«ãªããŸãã
ãœãŒã¹ã³ãŒããšåäœãã¢>>ããã§ããã§ã«äœããååŸããŠããŸãããªãã¬ã¯ã·ã§ã³
å
æ²¢ã®ãããªããžã§ã¯ããåŸãããŸãããããããå®éã«ãã©ãŒã®ããã«åäœãããªããžã§ã¯ããäœæããããšã¯å¯èœã§ããïŒãã¡ãããå®éã«ã¯ãã¬ã€ãã¬ãŒãµãŒã§ã®å®è£
ã¯éåžžã«åçŽã§ãããæåã¯ãããã«ãããããããŸããããã©ãŒã®ä»çµã¿ãèŠãŠã¿ãŸããããé¡ãèŠããšãé¡ããåå°ããå
ç·ãèŠããŸããå
ç·ã¯ã衚é¢ã®æ³ç·ã«å¯ŸããŠå¯Ÿç§°ã«åå°ãã
ãŸããå
ç·ããã¬ãŒã¹ãããã©ãŒãæãè¿ã亀差ç¹ã§ãããšããŸããå
ç·ã¯äœè²ã§ããïŒæããã«ãããã¯ãã©ãŒã®è²ã§ã¯ãªããåå°ããŒã ãæã€ä»»æã®è²ã§ããå¿
èŠãªã®ã¯ãåå°å
ç·ã®æ¹åãèšç®ãããã®æ¹åããèœã¡ãŠããå
ã®è²ãäœã§ãããã調ã¹ãããšã§ããäžããããå
ç·ã«å¯ŸããŠãã®æ¹åããèœã¡ãå
ã®è²ãè¿ã颿°ãããã°...ãããåŸ
ã£ãŠãç§ãã¡ã¯ãããæã£ãŠããŸãïŒããã¯åŒã°ãTraceRay
ãŸããããã§ãã¡ã€ã³ã«ãŒãTraceRay
ããå§ããŠãã«ã¡ã©ããæŸåºããããå
ç·ãããèŠãããã®ã確èªããŸããTraceRay
å
ç·ãåå°ãªããžã§ã¯ããèªèããŠãããšå€æããå Žåãåå°å
ç·ã®æ¹åãèšç®ããŠ...ãåŒã³åºãã ãã§æžã¿ãŸãããã®æç¹ã§ãæåŸã®3ã€ã®æ®µèœãçè§£ãããŸã§èªã¿çŽãããšããå§ãããŸããååž°çãªã¬ã€ãã¬ãŒã·ã³ã°ã«ã€ããŠåããŠèªãå Žåã¯ãæ°åèªã¿çŽããŠãå®éã«çè§£ããåã«å°ãèããå¿
èŠããããŸããæéããããŠããåŸ
ã¡ãã ããã...
ãŠãŒã¬ã«ã®ãã®çŽ æŽãããç¬éããã®å¹žçŠæïŒå°ãå¯ãŠããããå°ã圢åŒåããŸãããããã¹ãŠã®ååž°ã¢ã«ãŽãªãºã ã§æãéèŠãªããšã¯ãç¡éã«ãŒããé²ãããšã§ãããã®ã¢ã«ãŽãªãºã ã«ã¯æãããªçµäºæ¡ä»¶ããããŸããå
ç·ãéåå°ãªããžã§ã¯ãã«åœããããäœã«ãåœãããªãå Žåã§ããããããç¡éã®ãµã€ã¯ã«ã«é¥ãããšãã§ããåçŽãªã±ãŒã¹ããããŸããç¡éã®å»äžã®å¹æã§ããé¡ãå¥ã®é¡ã®å察åŽã«çœ®ããŠãèªåã®äžã®ç¡éã®ã³ããŒãèŠããšçŸããŸãïŒãã®åé¡ãé²ãã«ã¯å€ãã®æ¹æ³ããããŸããã¢ã«ãŽãªãºã ã®ååž°å¶éãå°å
¥ããŸãã圌ã¯åœŒãè¡ãããšãã§ãããæ·±ãããå¶åŸ¡ããŸãã圌ã«é»è©±ããŸãããr ã ã§
r = 0ããªããžã§ã¯ãã衚瀺ãããŸãããåå°ã¯ãããŸãããã§
r = 1ããã€ãã®ãªããžã§ã¯ããšããã€ãã®ãªããžã§ã¯ãã®åå°ã衚瀺ãããŸããã§
r = 2ããã€ãã®ãªããžã§ã¯ããããã€ãã®ãªããžã§ã¯ãã®åå°ãããã³ããã€ãã®ãªããžã§ã¯ãã®åå°ã®åå°ã衚瀺ãããŸãããªã©ãªã©ã
äžè¬çãªå Žåããã®æ®µéã§ã¯ãã§ã«éããã»ãšãã©ç®ç«ããªãããã2ã3ã¬ãã«ä»¥äžã«æ·±ãè¡ãããšã¯ã»ãšãã©æå³ããããŸãããå¥ã®åºå¥ãäœæããŸãããåå°çãã«ã¯ããã©ããããšããæå³ããããŸããããªããžã§ã¯ãã¯éšåçã«åå°ããéšåçã«è²ä»ãããããšãã§ããŸããåé¢ã«çªå·ãå²ãåœãŠãŸã0 åã«
1ããã®åå°çãæ±ºå®ããŸãããã®åŸããã®æ°å€ã«æ¯äŸããŠãããŒã«ã«ã«ç¹ç¯ããè²ãšåå°ããè²ãæ··åããŸãããããŠæåŸã«ãååž°åŒã³åºããåãåããã©ã¡ãŒã¿ãŒã決å®ããå¿
èŠããããŸããïŒå
ç·ã¯ãªããžã§ã¯ãã®è¡šé¢ãã€ãŸãç¹ããå§ãŸããŸãTraceRay
P ã
ããŒã ã®æ¹åã¯ãåå°ããå
ã®æ¹åã§ã P ;
ã§TraceRay
æã
ãæã£ãŠããŸãâ Dãã€ãŸãã«ã¡ã©ããã®æ¹åPãå
ã®åããšã¯å察ãã€ãŸãåå°ããŒã ã®æ¹åã¯â - Dã®åå°ã«å¯ŸããŠãâ N ã
圱ã§èµ·ããããšãšåæ§ã«ããªããžã§ã¯ãã«èªåèªèº«ãåæ ãããããªãã®ã§ã t m i n = ϵ ã
ãªããžã§ã¯ãã®è·é¢ã«é¢ä¿ãªãããªããžã§ã¯ããåæ ãããã®ã確èªãããã®ã§ã t m a x = + â ã
ãããŠæåŸ-ååž°å¶éã¯ãçŸåšã®ååž°å¶éããã1ã€å°ãªãã§ããåå°ã¬ã³ããªã³ã°
ã¬ã€ãã¬ãŒãµãŒã³ãŒãã«åå°ã远å ããŸããããåãšåæ§ã«ããŸããã·ãŒã³ã倿ŽããŸãã sphere {
center =ïŒ0ã-1ã3ïŒ
ååŸ= 1
color =ïŒ255ã0ã0ïŒïŒèµ€
é¡é¢åå°= 500ïŒããªãªã¢ã³ã
åå°= 0.2ïŒãããã«åå°
}
sphere {
äžå€®=ïŒ-2ã1ã3ïŒ
ååŸ= 1
color =ïŒ0ã0ã255ïŒïŒé
é¡é¢åå°= 500ïŒããªãªã¢ã³ã
åå°= 0.3ïŒããå°ãåå°
}
sphere {
äžå€®=ïŒ2ã1ã3ïŒ
ååŸ= 1
color =ïŒ0ã255ã0ïŒïŒç·
é¡é¢åå°= 10ïŒå°ãè¯éº
åå°= 0.4ïŒããã«åå°
}
sphere {
color =ïŒ255ã255ã0ïŒïŒé»è²
äžå€®=ïŒ0ã-5001,0ïŒ
ååŸ= 5000
é¡é¢åå°= 1000ïŒéåžžã«çŽ æŽããã
åå°= 0.5ïŒååå°
}
ããã€ãã®å Žæã§ãåå°ããŒã ãåŒã䜿çšããŠããã®ã§ããããåãé€ãããšãã§ããŸãã圌女ã¯ããŒã ãååŸããŸãâ Rããã³éåžžâ Nãæ»ãâ Rãæ¯èŒçåå°â N ïŒ
ReflectRayïŒRãNïŒ{
return 2 * N * dotïŒNãRïŒ-R;
}
å¯äžã®å€æŽComputeLighting
ã¯ãåå°æ¹çšåŒããã®æ°ããæ¹çšåŒã«çœ®ãæããããšReflectRay
ã§ããmainã¡ãœããã«ããããªå€æŽãå ããããŸãã- TraceRay
ååž°å¶éãäžäœã¬ãã«ã«æž¡ãå¿
èŠããããŸãã color = TraceRayïŒOãDã1ãinfãrecursion_depthïŒ
宿°recursion_depth
ã¯ã3ãŸãã¯5ãªã©ã®åŠ¥åœãªå€ã«èšå®ã§ããŸããéèŠãªå€æŽTraceRay
ã¯ãåå°ãååž°çã«èšç®ããæåŸã®è¿ãã§ã®ã¿çºçããŸãã TraceRayïŒOãDãt_minãt_maxãæ·±åºŠïŒ{
closest_sphere, closest_t = ClosestIntersection(O, D, t_min, t_max)
if closest_sphere == NULL
return BACKGROUND_COLOR
#
P = O + closest_t*D #
N = P - closest_sphere.center #
N = N / length(N)
local_color = closest_sphere.color*ComputeLighting(P, N, -D, sphere.specular)
# ,
r = closest_sphere.reflective
if depth <= 0 or r <= 0:
return local_color
#
R = ReflectRay(-D, N)
reflected_color = TraceRay(P, R, 0.001, inf, depth - 1)
return local_color*(1 - r) + reflected_color*r
}
çµæããããïŒ
ãœãŒã¹ã³ãŒããšäœæ¥ãã¢>>ååž°ã®æ·±ãã®å¶éãããããçè§£ããããã«ã次ã®ããã«ã¬ã³ããªã³ã°ã詳ããèŠãŠã¿ãŸããããr = 1 ïŒ
ãããŠãããã¯åãã·ãŒã³ã®åãæ¡å€§å³ã§ãä»å㯠r = 3 ïŒ
ã芧ã®ãšãããéãã¯ããªããžã§ã¯ãã®åå°ã®åå°ã®åå°ãèŠãã®ãããªããžã§ã¯ãã®åå°ã ããèŠãã®ãã§ããä»»æã®ã«ã¡ã©
ã¬ã€ãã¬ãŒã·ã³ã°ã®èª¬æã®æåã«ã2ã€ã®éèŠãªä»®å®ãç«ãŠãŸãããã«ã¡ã©ã¯ ïŒ0 ã0 ã0 ïŒãšæ¹åä»ãâ Z +ãäžæ¹åã¯â Y + ã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ããããã®å¶éãåãé€ããã·ãŒã³å
ã®ä»»æã®å Žæã«ã«ã¡ã©ãé
眮ããä»»æã®æ¹åã«åããããšãã§ããããã«ããŸããç¶æ³ããå§ããŸããããããããæ°ã¥ããã§ãããOã¯ãæ¬äŒŒã³ãŒãå
šäœã§1åã ã䜿çšãããŸãããããã¬ãã«ã¡ãœããã§ã«ã¡ã©ããçºããããå
ç·ã®éå§ç¹ãšããŠãã«ã¡ã©ã®äœçœ®ã倿Žãããå Žåãããå¯äžã®ããšã¯ãç°ãªãå€ã䜿çšããããšã§ãO ã
äœçœ®ã倿Žãããšãå
ç·ã®æ¹åã«åœ±é¿ããŸããïŒæ±ºããŠãå
ç·ã®æ¹åã¯ãã«ã¡ã©ããæåœ±é¢ã«ééãããã¯ãã«ã§ããã«ã¡ã©ãç§»åãããšãæåœ±é¢ã¯ã«ã¡ã©ãšãšãã«ç§»åããŸããã€ãŸãããããã®çžå¯Ÿäœçœ®ã¯å€åããŸãããæ¬¡ã«ãæ¹åã«æ³šç®ããŸããããå転ããå転è¡åããããšããŸãããïŒ0 ã0 ã1 ïŒãã¥ãŒã®ææã®æ¹åã«ãããã³ïŒ0 ã1 ã0 ïŒ -峿¹åã«ãã¢ãããïŒåã³ãšããŠã次ã«å®çŸ©ããããšã«ãã£ãŠããããè¡ãããã«å¿
èŠãšãããã¹ãã§ããå転è¡åã§ãããŸãïŒ1 ã0 ã0 ïŒ ïŒ
ã«ã¡ã©ãåçŽã«å転ãããŠããã«ã¡ã©ã®äœçœ®ã¯å€ãããŸãããããããæ¹åã¯å€åããŠãããã«ã¡ã©å
šäœãšåãå転ã ããåããŸããã€ãŸããæ¹åæ§ãããã°â Dãšå転è¡åRãå転ãããDã¯ãã â D R ã
ãããã¬ãã«ã®æ©èœã®ã¿ã倿ŽãããŸãïŒ [-Cw / 2ãCw / 2]ã®xã®å Žå{
[-Ch / 2ãCh / 2]ã®yã®å Žå{
D = camera.rotation * CanvasToViewportïŒxãyïŒ
color = TraceRayïŒcamera.positionãDã1ãinfïŒ
canvas.PutPixelïŒxãyãè²ïŒ
}
}
å¥ã®äœçœ®ããå¥ã®åãã§èгå¯ãããšãã·ãŒã³ã¯æ¬¡ã®ããã«ãªããŸãã
ãœãŒã¹ã³ãŒããšäœæ¥ãã¢>>次ã«è¡ãå Žæ
ãŸã 調æ»ããŠããªãããã€ãã®è峿·±ããããã¯ã®ç°¡åãªæŠèŠã§ãäœæ¥ã®æåã®éšåãçµäºããŸããæé©å
ã¯ããã«è¿°ã¹ãããã«ãããŸããŸãªå¯èœæ§ã説æããå®è£
ããæãçè§£ããããæ¹æ³ãæ€èšããŸããããããã£ãŠãã¬ã€ãã¬ãŒãµãŒã¯å®å
šã«æ©èœããŸãããç¹ã«é«éã§ã¯ãããŸããã以äžã«ããã¬ãŒãµãŒãé«éåããããã«ç¬èªã«èª¿æ»ã§ããã¢ã€ãã¢ãããã€ã瀺ããŸããã¡ãã£ãšããæ¥œãã¿ã®ããã«ãå®è£
ã®ååŸã«ã©ã³ã¿ã€ã ãæž¬å®ããŠã¿ãŠãã ãããããªãã¯éåžžã«é©ãã§ãããïŒäžŠåå
ã¬ã€ãã¬ãŒãµãŒãé«éåããæãæçœãªæ¹æ³ã¯ãè€æ°ã®ã¬ã€ãåæã«ãã¬ãŒã¹ããããšã§ããã«ã¡ã©ããã®åããŒã ã¯ä»ã®ãã¹ãŠã®ããŒã ããç¬ç«ããŠãããã»ãšãã©ã®æ§é ã¯èªã¿åãå°çšã§ãããããåæã®åé¡ã«ããå°é£ãå°é£ã䌎ãããšãªããäžå€®åŠçè£
眮ã®ã³ã¢ããšã«1ã€ã®ããŒã ããã¬ãŒã¹ã§ããŸããå®éãã¬ã€ãã¬ãŒãµãŒã¯ããã®æ§è³ªäžãéåžžã«ç°¡åã«äžŠååã§ãããããéåžžã«äžŠååå¯èœãšåŒã°ããã¢ã«ãŽãªãºã ã®ã¯ã©ã¹ã«å±ããŸããå€ã®ãã£ãã·ã¥
IntersectRaySphere
ã¬ã€ãã¬ãŒãµãŒãéåžžã»ãšãã©ã®æéãè²»ããèšç®å€ãæ€èšããŠãã ããã k1 =ãããïŒDãDïŒ
k2 = 2 *ãããïŒOCãDïŒ
k3 =ãããïŒOCãOCïŒ-r * r
ãããã®å€ã®äžéšã¯ãã·ãŒã³å
šäœã§äžå®ã§ã-çäœãã©ã®ããã«é
眮ãããŠããããç¥ããšããã«ãr*r
ãããdot(OC, OC)
ã¯ãã¯ãå€åããŸãããã·ãŒã³ã®ããŒãäžã«ããããäžåºŠèšç®ããã¬ã«ã èªäœã«ä¿åã§ããŸããçäœã次ã®ãã¬ãŒã ã§ç§»åããå¿
èŠãããå Žåã¯ãããããåã«ãŠã³ãããå¿
èŠããããŸããdot(D, D)
äžããããå
ç·ã®å®æ°ã§ãã®ã§ããããèšç®ãClosestIntersection
ãŠæž¡ãããšãã§ããŸãIntersectRaySphere
ãã·ã£ããŠã®æé©å
éäžã§å¥ã®ãªããžã§ã¯ããèŠã€ããã®ã§ãªããžã§ã¯ãã¯ãå
æºã«åœ±ã®çžå¯Ÿçã«äœçœ®ãããŠããå Žåã¯ãåå åããªããžã§ã¯ããžã®åœŒå¥³ã®ãã€ã³ããšã®é£äººã¯ãããŸãã«ããïŒãããåŒã³åºãããå
æºã«å¯Ÿãã圱ã«ãªã£ãŠããããšãé«ã確çãããã圱ã®äžè²«æ§ïŒïŒ
ã€ãŸãã¯ããã€ã³ããšå
æºã®éã®ãªããžã§ã¯ããæ¢ããšããæåã«ãåãå
æºã«é¢é£ããŠåã®ãã€ã³ãã«ã·ã£ããŠãé©çšããæåŸã®ãªããžã§ã¯ããçŸåšã®ãã€ã³ããã·ã£ããŠããªããã©ããã確èªã§ããŸãããããããªããæã
ã¯çµäºããããšãã§ããŸããããã§ãªãå Žåã¯ãéåžžã®æ¹æ³ã§ä»ã®ãªããžã§ã¯ãã®ãã§ãã¯ãç¶ããŸããåæ§ã«ãå
ç·ãšã·ãŒã³å
ã®ãªããžã§ã¯ããšã®äº€å·®ãèšç®ããå Žåãå®éã«ã¯æãè¿ã亀差ã¯å¿
èŠãããŸãããå°ãªããšã1ã€ã®äº€å·®ãããããšãç¥ã£ãŠããã ãã§ããClosestIntersection
æåã®äº€å·®ç¹ãèŠã€ãããšããã«çµæãè¿ãç¹å¥ãªããŒãžã§ã³ã䜿çšã§ããŸãïŒãã®ããã«closest_t
ãã§ã¯ãªãããŒã«å€ãèšç®ããŠè¿ãå¿
èŠããããŸãïŒãç©ºéæ§é
å
ç·ãšåçã®äº€å·®ãèšç®ããããšã¯ããªãœãŒã¹ã®ããªãã®ç¡é§ã§ããåã
ã®äº€å·®ãèšç®ããå¿
èŠãªãããªããžã§ã¯ãã®ã°ã«ãŒãå
šäœãäžæ°ã«ããããã§ããå€ãã®ããŒã¿æ§é ããããŸãããã®ãããªæ§é ã®è©³çŽ°ãªæ€èšã¯ããã®èšäºã®ãããã¯ã«ã¯é¢ä¿ãããŸããããäžè¬çãªèãæ¹ã¯æ¬¡ã®ãšããã§ããäºãã«è¿ãè€æ°ã®é åããããšããŸããããããã¹ãŠã®çãå«ãæå°ã®çã®äžå¿ãšååŸãèšç®ã§ããŸããå
ç·ããã®å¢ççãšäº€å·®ããªãå Žåã¯ãå
ç·ãå«ãŸããçãšäº€å·®ããªãããšã確èªã§ãã亀差ã®1åã®ãã§ãã¯ã§ãããè¡ãããšãã§ããŸãããã¡ãããçäœãšäº€å·®ããå Žåããã®çäœã«å«ãŸããçäœãšäº€å·®ãããã©ããã確èªããå¿
èŠããããŸããããã«ã€ããŠã¯ãããŠã³ãã£ã³ã°ããªã¥ãŒã ã®éå±€ã«ã€ããŠèªãããšã§åŠç¿ã§ããŸããããŠã³ãµã³ããªã³ã°
以äžã«ã¬ã€ãã¬ãŒãµãŒãäœæããç°¡åãªæ¹æ³ã瀺ããŸãã Nåé«éïŒã§èšç®Nåå°ãªããã¯ã»ã«ïŒãã¯ã»ã«ã®å
ç·ããã¬ãŒã¹ãããšããŸãïŒ10 ã100 ïŒ ãããŠ
ïŒ12 ã100 ïŒãåã³ããããåããªããžã§ã¯ãã«èœã¡ãŸããè«ççã«ã¯ããã¯ã»ã«ã®å
ç·ã¯ïŒ11 ã100 ïŒããåãç®çã«å
¥ããã¹ãŠã®ã¹ããŒãžäžãã亀差ç¹ã®åæãµãŒããã¹ãããããŠããã®æç¹ã§ã®è²ã®èšç®ã«çŽæ¥è¡ããŸããæ°Žå¹³æ¹åãšåçŽæ¹åã«ãããè¡ããšãããŒã ã·ãŒã³ã®äº€å·®ã®äž»èŠãªèšç®ãããæå€§75ïŒ
å°ãªãå®è¡ãå¯èœã§ãããã¡ããããã®æ¹æ³ã§éåžžã«èããªããžã§ã¯ããç°¡åã«ã¹ãããã§ããŸãã以åã«æ€èšãããã®ãšã¯ç°ãªããããã¯ãééã£ããæé©åã§ãããã®äœ¿çšçµæã¯ããããªãã§åŸããã®ãšåäžã§ã¯ãªãããã§ããããæå³ããã®ç¯çŽãããŸãããŠããŸããããªãã¯ã¯ãæ£ããä¿åããããšãæšæž¬ããæºè¶³ã®ããçµæãæäŸããããšã§ãããã®ä»ã®ããªããã£ã
åã®ã»ã¯ã·ã§ã³ã§ã¯ãçäœãæ°åŠçãªèгç¹ããç°¡åã«æäœã§ãããããçäœãããªããã£ããšããŠäœ¿çšããŸããããããããããéæããããä»ã®ããªããã£ããç°¡åã«è¿œå ã§ããŸãããã¥ãŒã®èгç¹ããTraceRay
ãä»»æã®ãªããžã§ã¯ããé©åã§ããå¯èœæ§ãããããšã«æ³šæããŠãã ããããã®ããã«ã¯ã2ã€ã®å€ã®ã¿ãèšç®ããå¿
èŠããããŸããããŒã ãšãªããžã§ã¯ãéã®æãè¿ã亀ç¹ãããã³äº€ç¹ã§ã®æ³ç·ã® tãã¬ã€ãã¬ãŒãµãŒã®ä»ã®ãã¹ãŠã¯ããªããžã§ã¯ãã®ã¿ã€ãã«äŸåããŸãããäžè§åœ¢ã¯è¯ãéžæã§ãããŸããå
ç·ãšäžè§åœ¢ãå«ãå¹³é¢ãšã®äº€å·®ãèšç®ããå¿
èŠããããŸãã亀差ãããå Žåã¯ããã€ã³ããäžè§åœ¢ã®å
åŽã«ãããã©ããã倿ããŸããæ§é ãããã¯åœ¢ç¶
å®è£
ãæ¯èŒçç°¡åãªéåžžã«è峿·±ãã¿ã€ãã®ãªããžã§ã¯ãããããŸããä»ã®ãªããžã§ã¯ãéã®ããŒã«æŒç®ã§ããããšãã°ã2ã€ã®çäœã®äº€ç¹ã¯ã¬ã³ãºã«äŒŒããã®ãäœæã§ãã倧ããªçäœããå°ããªçäœãå·®ãåŒããšããã¹ã¹ã¿ãŒã«äŒŒããã®ãåŸãããšãã§ããŸããã©ã®ããã«æ©èœããŸããïŒ
ãªããžã§ã¯ãããšã«ãå
ç·ããªããžã§ã¯ãã«åºå
¥ãããå Žæãèšç®ã§ããŸããããšãã°ãçã®å Žåãå
ç·ã¯m i n ïŒt 1ãt 2ïŒããã³m a x ïŒt 1ãt 2ïŒ ã
2ã€ã®çã®äº€å·®ãèšç®ããå¿
èŠããããšããŸããå
ç·ã¯ãäž¡æ¹ã®çã®å
åŽã«ããå Žåã¯äº€å·®ã®å
åŽã«ãããå察ã®å Žåã«ã¯å€åŽã«ãããŸããæžç®ã®å Žåãå
ç·ã¯æåã®ãªããžã§ã¯ãã®å
åŽã«ãããšãã«å
åŽã«ãããŸããã2çªç®ã®ãªããžã§ã¯ãã®å
åŽã«ã¯ãããŸãããããäžè¬çã«ã¯ãå
ç·ãšA âš B ïŒã©ã
âšã¯ããŒã«æŒç®åã§ãïŒãæåã«å
ç·ã®äº€å·®ãåå¥ã«èšç®ããå¿
èŠããããŸãAãšããŒã Bãåãªããžã§ã¯ãã®ãå
éšãééãæäŸããŸãR A ãããŠ
R B ã
次ã«èšç®ãã R A âš R Bã®ãå
åŽãã®ç¯å²å
ã«äœçœ®ããA âš B ã
æåã®å€ãèŠã€ããã ãã§ã tã¯ããå
éšãééãšééã®äž¡æ¹ã«ãããŸã[ t m i nãt m a x ]ïŒäº€å·®ç¹ã§ã®æ³ç·ã¯ã亀差ç¹ãäœæãããªããžã§ã¯ãã®æ³ç·ããŸãã¯å
ã®ãªããžã§ã¯ãã®ãå€åŽããããŸãã¯ãå
åŽãããã®ã©ã¡ãã«èŠãããã«å¿ããŠããã®å察ã§ãããã¡ãã
A ãããŠ
Bã¯ããªããã£ãã§ããå¿
èŠã¯ãããŸããããããèªäœãããŒã«æŒç®ã®çµæã«ãªãå¯èœæ§ããããŸãïŒãããçŽç²ã«å®è£
ããå Žåãããããã亀差ç¹ãšæ³ç·ãååŸã§ããéããããããäœã§ããããç¥ãå¿
èŠãããããŸããããããã£ãŠã3ã€ã®çäœã䜿çšããŠãããšãã°æ¬¡ã®ããã«èšç®ã§ããŸããïŒA ⪠B ïŒâ© C ã
éææ§
ãã¹ãŠã®ãªããžã§ã¯ããäžéæã§ããå¿
èŠã¯ãªããäžéšã¯éæã§ããå ŽåããããŸããéæåºŠã®å®è£
ã¯ãåå°ã®å®è£
ã«éåžžã«äŒŒãŠããŸããããŒã ãéšåçã«éæãªè¡šé¢ã«åœãããšã以åãšåæ§ã«ãããŒã«ã«è²ãšåå°è²ãèšç®ããŸããã远å ã®è²- å¥ã®åŒã³åºãã§åä¿¡ãããªããžã§ã¯ããééããå
ã®è²ãèšç®ããŸãTraceRay
ãæ¬¡ã«ããªããžã§ã¯ãã®éæåºŠãèæ
®ããŠããã®è²ãšããŒã«ã«è²ããã³åå°è²ãæ··ããå¿
èŠããããŸããããã ãã§ãã屿
å®éã«ã¯ãå
ç·ãéæãªãªããžã§ã¯ããééãããšãæ¹åãå€ãããŸãïŒãããã£ãŠãã¹ãããŒãã³ããäžæ¯ã®æ°Žã«æµžããããšããå£ãããããã«èŠããŸãïŒãæ¹åã®å€åã¯ã次ã®åŒã«åŸã£ãŠåææã®å±æçã«äŸåããŸããsã®I N ïŒÎ± 1ïŒsã®I N ïŒÎ± 2ïŒ =N2n 1
ã©ãã§
α 1 ãããŠ
α 2 -亀差ç¹ã®ååŸã®é¢ã®å
ç·ãšæ³ç·ãšã®éã®è§åºŠã§ããããããŠn 1 ãããŠ
n 2ã¯ãç©äœã®å€åŽãšå
åŽã®ææã®å±æçã§ããäŸãã°
n ã¯x ã§çŽz d ã§ãã»ãŒçãã1.0 ããããŠ
N ã«ãããD Sã«ã»ãŒçããã§ãã1.33 ã
ã€ãŸããããè§åºŠã§æ°Žã«å
¥ãããŒã ã®å Žå 60 â GETsã®I N ïŒ60 ïŒsã®I N ïŒÎ± 2ïŒ =1.331.0
sã®I N ïŒÎ± 2 ïŒ= sã®I N ïŒ60 ïŒ1.33
α 2 = A R C S I N ïŒsã®I N ïŒ60 ïŒ1.33ïŒ=40.628â
å°ãã®é忢ããŠãã ããïŒå»ºèšçãªãããã¯ãžãªã¡ããªãšéæåºŠãå®è£
ãããšãç©ççã«æ£ããè«çŒé¡ã®ããã«åäœããè«çŒé¡ïŒ2ã€ã®çã®äº€ç¹ïŒãã·ãã¥ã¬ãŒãã§ããŸãïŒã¹ãŒããŒãµã³ããªã³ã°
ã¹ãŒããŒãµã³ããªã³ã°ã¯ãé床ã§ã¯ãªã粟床ã远æ±ãããšãã®ãµããµã³ããªã³ã°ã®å€§ãŸããªå察ã§ãã 2ã€ã®é£æ¥ãããã¯ã»ã«ã«å¯Ÿå¿ããå
ç·ã2ã€ã®ç°ãªããªããžã§ã¯ãã«åœãããšããŸããåãã¯ã»ã«ã察å¿ããè²ã§çè²ããå¿
èŠããããŸãããã ããæåã«è¡ã£ãã¢ãããžãŒãå¿ããªãã§ãã ãããåå
ç·ã¯ããã°ãªãããã®åæ£æ¹åœ¢ã®ãå®çŸ©ãè²ãæå®ããå¿
èŠããããŸããæžã蟌ã¿ããšã«1ã€ã®å
ç·ã䜿çšããŠãæ£æ¹åœ¢ã®äžå€®ãééããå
ç·ã®è²ãæ£æ¹åœ¢å
šäœã決å®ããããšãæ¡ä»¶ä»ãã§æ±ºå®ããŸãããããã§ãªãå ŽåããããŸãããã®åé¡ã解決ããã«ã¯ããã¯ã»ã«ããšã«è€æ°ã®å
ç·ïŒ4ã9ã16ãªã©ïŒããã¬ãŒã¹ããããããå¹³åããŠãã¯ã»ã«ã®è²ãååŸããŸãããã¡ããããã®å Žåãã¬ã€ãã¬ãŒãµãŒã¯4åã9åããŸãã¯16åé
ããªããŸããããã¯ãããŠã³ãµã³ããªã³ã°ããããè¡ãã®ãšåãçç±ã§ãã Nåé«éã幞ããªããšã«ã劥åç¹ããããŸãã衚é¢ã«æ²¿ã£ããªããžã§ã¯ãã®ããããã£ã¯æ»ããã«å€åããŸããã€ãŸãããã¯ã»ã«ããšã«4ã€ã®å
ç·ãæŸåºããããããã«ç°ãªããã€ã³ãã§1ã€ã®ãªããžã§ã¯ãã«åœãããšãã·ãŒã³ã®å€èгã¯å€§ããæ¹åãããŸããããããã£ãŠããã¯ã»ã«ããšã«1ã€ã®ã¬ã€ããéå§ãã飿¥ããã¬ã€ãæ¯èŒã§ããŸããä»ã®ãªããžã§ã¯ãã«åœãããã倿ããããããå€ãããè²ãç°ãªãå Žåã¯ãäž¡æ¹ã«ãã¯ã»ã«åå²ãé©çšããŸããã¬ã€ãã¬ãŒãµãŒã®æ¬äŒŒã³ãŒã
以äžã¯ãã¬ã€ãã¬ãŒã·ã³ã°ã®ç« ã§äœæããæ¬äŒŒã³ãŒãã®å®å
šçã§ãã CanvasToViewportïŒxãyïŒ{
returnïŒx * Vw / Cwãy * Vh / ChãdïŒ
}
ReflectRayïŒRãNïŒ{
return 2 * N * dotïŒNãRïŒ-R;
}
ComputeLightingïŒPãNãVãsïŒ{
i = 0.0
scene.Lights {
light.type == ambient {
i + = light.intensity
} else {
light.type == point {
L = light.position-P
t_max = 1
} else {
L = light.direction
t_max = inf
}
ïŒåœ±ã確èªãã
shadow_sphereãshadow_t = ClosestIntersectionïŒPãLã0.001ãt_maxïŒ
shadow_sphereïŒ= NULLã®å Žå
ç¶ãã
ïŒæ¡æ£
n_dot_l =ãããïŒNãLïŒ
n_dot_l> 0ã®å Žå
i + = light.intensity * n_dot_l /ïŒé·ãïŒNïŒ*é·ãïŒLïŒïŒ
ïŒã·ã£ã€ã³
if sïŒ= -1 {
R = ReflectRayïŒLãNïŒ
r_dot_v =ãããïŒRãVïŒ
r_dot_v> 0ã®å Žå
i + = light.intensity * powïŒr_dot_v /ïŒé·ãïŒRïŒ*é·ãïŒVïŒïŒãsïŒ
}
}
}
ç§ãè¿ã
}
ClosestIntersectionïŒOãDãt_minãt_maxïŒ{
æãè¿ãt = inf
nearest_sphere = NULL
scene.Spheres {ã®çã®å Žå
t1ãt2 = IntersectRaySphereïŒOãDãçäœïŒ
[t_minãt_max]ã®t1ããã³t1 <closest_tã®å Žå
æãè¿ãt = t1
æãè¿ãçäœ=çäœ
[t_minãt_max]ã®t2ããã³t2 <closest_tã®å Žå
æãè¿ãt = t2
æãè¿ãçäœ=çäœ
}
æãè¿ã_sphereãæãè¿ã_tãè¿ã
}
TraceRayïŒOãDãt_minãt_maxãæ·±åºŠïŒ{
nearest_sphereãclosest_t = ClosestIntersectionïŒOãDãt_minãt_maxïŒ
nearest_sphere == NULLã®å Žå
BACKGROUND_COLORãè¿ããŸã
ïŒããŒã«ã«ã«ã©ãŒã®èšç®
P = O +æãè¿ã_t * DïŒäº€ç¹ã®èšç®
N = P-nearest_sphere.centerïŒäº€å·®ç¹ã§ã®çã®æ³ç·ãèšç®ããŸã
N = N /é·ãïŒNïŒ
local_color = nearest_sphere.color * ComputeLightingïŒPãNã-Dãsphere.specularïŒ
ïŒååž°å¶éã«å°éããå ŽåããŸãã¯ãªããžã§ã¯ããåå°ããŠããªãå Žåãå®äºã§ã
r = nearest_sphere.reflective
æ·±ã<= 0ãŸãã¯r <= 0ã®å ŽåïŒ
local_colorãè¿ããŸã
ïŒåå°è²ã®èšç®
R = ReflectRayïŒ-DãNïŒ
reflected_color = TraceRayïŒPãRã0.001ãinfãdepth-1ïŒ
local_color *ïŒ1-rïŒ+åå°è²* rãè¿ããŸã
}
[-Cw / 2ãCw / 2]ã®xã®å Žå{
[-Ch / 2ãCh / 2]ã®yã®å Žå{
D = camera.rotation * CanvasToViewportïŒxãyïŒ
color = TraceRayïŒcamera.positionãDã1ãinfïŒ
canvas.PutPixelïŒxãyãè²ïŒ
}
}
ãããŠãäŸãã¬ã³ããªã³ã°ããããã«äœ¿çšãããã·ãŒã³ã¯æ¬¡ã®ãšããã§ãã viewport_size = 1 x 1
projection_plane_d = 1
sphere {
center =ïŒ0ã-1ã3ïŒ
ååŸ= 1
color =ïŒ255ã0ã0ïŒïŒèµ€
é¡é¢åå°= 500ïŒããªãªã¢ã³ã
åå°= 0.2ïŒãããã«åå°
}
sphere {
äžå€®=ïŒ-2ã1ã3ïŒ
ååŸ= 1
color =ïŒ0ã0ã255ïŒïŒé
é¡é¢åå°= 500ïŒããªãªã¢ã³ã
åå°= 0.3ïŒããå°ãåå°
}
sphere {
äžå€®=ïŒ2ã1ã3ïŒ
ååŸ= 1
color =ïŒ0ã255ã0ïŒïŒç·
é¡é¢åå°= 10ïŒå°ãè¯éº
åå°= 0.4ïŒããã«åå°
}
sphere {
color =ïŒ255ã255ã0ïŒïŒé»è²
äžå€®=ïŒ0ã-5001,0ïŒ
ååŸ= 5000
é¡é¢åå°= 1000ïŒéåžžã«çŽ æŽããã
åå°= 0.5ïŒååå°
}
ã©ã€ã{
ã¿ã€ã=ã¢ã³ããšã³ã
匷床= 0.2
}
ã©ã€ã{
ã¿ã€ã=ãã€ã³ã
匷床= 0.6
äœçœ®=ïŒ2ã1ã0ïŒ
}
ã©ã€ã{
ã¿ã€ã=æ¹å
匷床= 0.2
æ¹å=ïŒ1ã4ã4ïŒ
}