ãœãããŠã§ã¢ã¬ã³ããªã³ã°ã¯ãGPUã®å©ããåããã«ç»åãäœæããããã»ã¹ã§ãã ãã®ããã»ã¹ã¯ã2ã€ã®ã¢ãŒãã®ããããã§å®è¡ã§ããŸãããªã¢ã«ã¿ã€ã ïŒã²ãŒã ãªã©ã®å¯Ÿè©±åã¢ããªã±ãŒã·ã§ã³ã§ã¯ã1ç§ãããã®å€æ°ã®ãã¬ãŒã ã®èšç®ãå¿
èŠïŒããã³ããªãã©ã€ã³ãã¢ãŒãïŒ1ã€ã®ãã¬ãŒã ã®èšç®ã«è²»ããããšãã§ããæéïŒå³å¯ã«å¶éãããŠããããã§ã¯ãããŸãã-èšç®ã¯æ°æéãŸãã¯æ°æ¥ç¶ãããšããããŸãïŒã ãªã¢ã«ã¿ã€ã ã¬ã³ããªã³ã°ã¢ãŒãã®ã¿ãæ€èšããŸãã
ãã®ã¢ãããŒãã«ã¯ãæ¬ ç¹ãšå©ç¹ã®äž¡æ¹ããããŸãã æãããªæ¬ ç¹ã¯ããã©ãŒãã³ã¹ã§ã-ãã®é åã§ã¯ãCPUã¯ææ°ã®ã°ã©ãã£ãã¯ã¹ã«ãŒããšç«¶åã§ããŸããã å©ç¹ã«ã¯ããããªã«ãŒãããã®ç¬ç«æ§ãå«ãŸããŸãããã®ããããããªã«ãŒãã1ã€ãŸãã¯å¥ã®æ©èœããµããŒãããªãå ŽåïŒãããããœãããŠã§ã¢ãã©ãŒã«ããã¯ïŒãããŒããŠã§ã¢ã¬ã³ããªã³ã°ã®ä»£ãããšããŠäœ¿çšãããŸãã ãŸããDirect3D 11ã®äžéšã§ããWARPãªã©ãããŒããŠã§ã¢ã¬ã³ããªã³ã°ããœãããŠã§ã¢ã§å®å
šã«çœ®ãæããããšãç®çãšãããããžã§ã¯ãããããŸãã
ããããäž»ãªå©ç¹ã¯ããã®ãããªã¬ã³ãã©ãŒãèªåã§äœæã§ããããšã§ãã ããã¯æè²ç®çã«åœ¹ç«ã¡ãç§ã®æèŠã§ã¯ãåºç€ãšãªãã¢ã«ãŽãªãºã ãšååãç解ããããã®æè¯ã®æ¹æ³ã§ãã
ããã¯ãŸãã«ãããã®èšäºã®ã·ãªãŒãºã§è°è«ããããã®ã§ãã ãŠã£ã³ããŠå
ã®ãã¯ã»ã«ãæå®ãããè²ã§å¡ãã€ã¶ãæ©èœããéå§ããããã«åºã¥ããŠã3Dã·ãŒã³ããªã¢ã«ã¿ã€ã ã§ã¬ã³ããªã³ã°ããæ©èœããã¯ã¹ãã£ã¢ãã«ãšç
§æã®ç§»åããã®ã·ãŒã³ã移åããæ©èœãæ§ç¯ããŸãã
ãã ããå°ãªããšãæåã®ããªãŽã³ã衚瀺ããã«ã¯ããã®ããªãŽã³ãæ§ç¯ãããŠããæ°åŠãç¿åŸããå¿
èŠããããŸãã æåã®éšåã¯åœŒå¥³å°çšã§ãããããå€ãã®ç°ãªããããªãã¯ã¹ãšä»ã®ãžãªã¡ããªãå«ãŸããŸãã
èšäºã®æåŸã«ããããžã§ã¯ãã®githubãžã®ãªã³ã¯ããããŸããããã¯å®è£
ã®äŸãšèããããšãã§ããŸãã
ãã®èšäºã§ã¯éåžžã«åºæ¬çãªããšã説æããŠããŸãããèªè
ã¯ç解ããããã«ç¹å®ã®åºç€ãå¿
èŠã§ãã ãã®åºç€ïŒäžè§æ³ãšå¹ŸäœåŠã®åºç€ããã«ã«ã座æšç³»ãšãã¯ãã«ã®åºæ¬æäœã®ç解ã ãŸããã²ãŒã éçºè
åãã®ç·åœ¢ä»£æ°ã®åºç€ã«é¢ããèšäºïŒããšãã°ã
ãã®èšäºïŒãèªãããšããå§ãããŸãããªããªããç§ã¯ããã€ãã®æäœã®èª¬æãã¹ãããããç§ã®èŠ³ç¹ããæãéèŠãªãã®ã ããåãäžããããã§ãã ãªãããã€ãã®éèŠãªå
¬åŒãå°ãåºãããã®ãã瀺ãã€ããã§ããããããã詳现ã«èª¬æããã€ããã¯ãããŸãããå®å
šãªèšŒæãèªåã§è¡ãããé¢é£æç®ã§èŠã€ããããšãã§ããŸãã ãã®èšäºã§ã¯ããŸãç¹å®ã®æŠå¿µã®ä»£æ°çå®çŸ©ã瀺ãã次ã«ãããã®å¹ŸäœåŠç解éã«ã€ããŠèª¬æããŸãã ã»ãšãã©ã®äŸã¯2次å
空éã«ãããŸãã3次å
空éãç¹ã«4次å
空éã§ã®ç§ã®æç»ã¹ãã«ã«ã¯ãå€ãã®èŠæãæ®ãããŠããããã§ãã ããã§ãããã¹ãŠã®äŸã¯ä»ã®æ¬¡å
ã®ç©ºéã«ç°¡åã«äžè¬åã§ããŸãã ãã¹ãŠã®èšäºã¯ãã³ãŒãã§ã®å®è£
ã§ã¯ãªããã¢ã«ãŽãªãºã ã®èª¬æã«çŠç¹ãåœãŠãŸãã
ãã¯ãã«
ãã¯ãã«ã¯ã3次å
ã°ã©ãã£ãã¯ã¹ã®éèŠãªæŠå¿µã®1ã€ã§ãã ãããŠãç·åœ¢ä»£æ°ã¯éåžžã«æœè±¡çãªå®çŸ©ãäžããŸãããç§ãã¡ã®åé¡ã®æ çµã¿ã§ã¯ã
n次å
ãã¯ãã«ã«ãã£ãŠã
n åã®å®æ°ã®é
åãã€ãŸã空é
R nã®èŠçŽ ãæå³ããããšãã§ããŸãïŒ

ãããã®æ°å€ã®è§£éã¯ãã³ã³ããã¹ãã«ãã£ãŠç°ãªããŸãã æãäžè¬çãª2ã€ïŒãããã®æ°å€ã¯ã空éå
ã®ãã€ã³ãã®åº§æšãŸãã¯æ¹åå€äœãæå®ããŸãã ãããã®è¡šç€ºã¯åãïŒ
nåã®å®æ°ïŒã§ãããšããäºå®ã«ããããããããããã®æŠå¿µã¯ç°ãªããŸã-ãã€ã³ãã¯åº§æšç³»ã§ã®äœçœ®ãè¡šããå€äœã¯ãã®ãããªäœçœ®ãæã¡ãŸããã å°æ¥çã«ã¯ããªãã»ããã䜿çšããŠãã€ã³ãã決å®ããããšãã§ããŸããããã¯ããªãã»ãããåç¹ããæ¥ãããšãæå³ããŸãã
ååãšããŠãã»ãšãã©ã®ã²ãŒã ããã³ã°ã©ãã£ãã¯ãšã³ãžã³ã«ã¯ãæ£ç¢ºã«æ°å€ã®ã»ãããšããŠãã¯ãã«ã®ã¯ã©ã¹ããããŸãã ãããã®çªå·ã®æå³ã¯ã䜿çšãããã³ã³ããã¹ãã«ãã£ãŠç°ãªããŸãã ãã®ã¯ã©ã¹ã¯ã幟äœãã¯ãã«ã®æäœïŒãã¯ãã«ç©ã®èšç®ãªã©ïŒããã³ãã€ã³ãïŒ2ç¹éã®è·é¢ã®èšç®ãªã©ïŒã®ã¡ãœãããå®çŸ©ããŸãã
æ··ä¹±ãé¿ããããã«ããã®èšäºã®æ çµã¿ã®äžã§ãããã¯ãã«ããšããåèªãæ°åã®æœè±¡çãªã»ãããšããŠç解ããããšã¯ã§ããªããªããŸãããããããªãã»ãããšåŒã³ãŸãã
ã¹ã«ã©ãŒç©
ïŒåºæ¬çãªæ§è³ªã®ããã«ïŒè©³çŽ°ã«èª¬æããããã¯ãã«ã®æäœã¯ãã¹ã«ã©ãŒç©ã®ã¿ã§ãã ååã瀺ãããã«ããã®äœæ¥ã®çµæã¯ã¹ã«ã©ãŒã§ããã次ã®åŒã«ãã£ãŠæ±ºå®ãããŸãã

ã¹ã«ã©ãŒç©ã«ã¯ã2ã€ã®éèŠãªå¹ŸäœåŠç解éããããŸãã
- ãã¯ãã«éã®è§åºŠã®æž¬å®ã
3ã€ã®ãã¯ãã«ããåŸããã次ã®äžè§åœ¢ãèããŸãã

圌ã®äœåŒŠå®çãæžããåŒãæžãããŠã次ã®ã¬ã³ãŒãã«å°éããŸãã

éãŒããã¯ãã«ã®é·ãã¯å®çŸ©ã«ãã0ããã倧ãããããè§åºŠã®ã³ãµã€ã³ã¯ã¹ã«ã©ãŒç©ã®ç¬Šå·ãšãŒããžã®ç䟡æ§ã決å®ããŸãã ååŸããŸãïŒè§åºŠã¯0ã360床ãšä»®å®ïŒïŒ

- ã¹ã«ã©ãŒç©ã¯ããã¯ãã«ã®ãã¯ãã«ãžã®æ圱ã®é·ããèšç®ããŸãã

è§åºŠã®ã³ãµã€ã³ã®å®çŸ©ãã次ã®ããã«ãªããŸãã

ãŸããåã®æ®µèœãã次ã®ããšããã§ã«ç¥ã£ãŠããŸãã

2çªç®ã®åŒããè§åºŠã®äœåŒŠãè¡šçŸããæåã®åŒã«ä»£å
¥ããŠ|| w ||ãä¹ç®ããŸã çµæãåŸãããŸãã

ãããã£ãŠã2ã€ã®ãã¯ãã«ã®ã¹ã«ã©ãŒç©ã¯ããã¯ãã«wã«ãã¯ãã«wã®é·ããä¹ç®ãããã¯ãã«vã®å°åœ±é·ã«çãããªããŸãã ãã®åŒã®é »ç¹ãªç¹æ®ãªã±ãŒã¹-wã«ã¯åäœé·ããããããã¹ã«ã©ãŒç©ã¯æ£ç¢ºãªæ圱é·ãèšç®ããŸãã
ãã®è§£éã¯ãã¹ã«ã©ãŒç©ããæå®ããã軞ã«æ²¿ã£ããã€ã³ãã®åº§æšïŒåç¹ããã®ãªãã»ãããæå³ãããã¯ãã«vã«ãã£ãŠäžããããïŒãèšç®ããããšã瀺ããããéåžžã«éèŠã§ãã æãç°¡åãªäŸïŒ

å°æ¥çã«ã¯ãã«ã¡ã©åº§æšç³»ãžã®å€æãæ§ç¯ãããšãã«ããã䜿çšããŸãã
座æšç³»
ãã®ã»ã¯ã·ã§ã³ã¯ããããªãã¯ã¹ã®å°å
¥ã®åºç€ãæºåããããšãç®çãšããŠããŸãã ã°ããŒãã«ã·ã¹ãã ãšããŒã«ã«ã·ã¹ãã ã®äŸã䜿çšããŠã1ã€ã§ã¯ãªãè€æ°ã®åº§æšç³»ã䜿çšãããçç±ãšã1ã€ã®åº§æšç³»ãå¥ã®åº§æšç³»ã«å¯ŸããŠã©ã®ããã«èšè¿°ãããã«ã€ããŠèª¬æããŸãã
ããšãã°ã2ã€ã®ã¢ãã«ã§ã·ãŒã³ãæãå¿
èŠããããšæ³åããŠãã ããã

ãã®ãããªå£°æããèªç¶ã«ç¶ã座æšç³»ã¯äœã§ããïŒ 1ã€ç®ã¯ãã·ãŒã³èªäœã®åº§æšç³»ã§ãïŒå³ã«ç€ºãããŠããŸãïŒã ããã¯ãæç»ããäžçãèšè¿°ãã座æšç³»ã§ããããããäžçããšåŒã°ããçç±ã§ãïŒåçã§ã¯ãäžçããšããåèªã§ç€ºãããŸãïŒã 圌女ã¯ãã·ãŒã³ã®ãã¹ãŠã®ãªããžã§ã¯ãããçµã³ä»ãããŸãã ããšãã°ããã®åº§æšç³»ã«ããããªããžã§ã¯ã
Aã®äžå¿ã®åº§æšã¯
ïŒ1ã1ïŒã§ããããªããžã§ã¯ã
Bã®äžå¿ã®åº§æšã¯
ïŒ-1ã-1ïŒã§ãã
ãããã£ãŠã1ã€ã®åº§æšç³»ãæ¢ã«ååšããŸãã 次ã«ãã·ãŒã³ã§äœ¿çšããã¢ãã«ãã©ã®ãããªåœ¢ã§ç»å Žããããèããå¿
èŠããããŸãã
ç°¡åã«ããããã«ãã¢ãã«ã¯åçŽã«ããããæ§æãããã€ã³ãïŒãããŒã¯ãïŒã®ãªã¹ãã«ãã£ãŠèšè¿°ããããšä»®å®ããŸãã ããšãã°ãã¢ãã«
Bã¯ã次ã®åœ¢åŒã®3ã€ã®ãã€ã³ãã§æ§æãããŠããŸãã
v 0 =ïŒx 0 ãy 0 ïŒ
v 1 =ïŒx 1 ãy 1 ïŒ
v 2 =ïŒx 2 ãy 2 ïŒ
äžèŠãå¿
èŠãªãäžçãã·ã¹ãã ã§æ¢ã«èª¬æãããŠãããšãã°ãããã§ãããã æ³åããŠã¿ãŠãã ãããã·ãŒã³ã«ã¢ãã«ãè¿œå ãããšããã§ã«å¿
èŠãªå Žæã«ãããŸãã ã¢ãã«
Bã®å Žåã次ã®ããã«ãªããŸãã
v 0 =ïŒ-1.5ã-1.5ïŒ
v 1 =ïŒ-1.0ã-0.5ïŒ
v 2 =ïŒ-0.5ã-1.5ïŒ
ãããããã®ã¢ãããŒãã䜿çšããŠãæ©èœããŸããã ããã«ã¯éèŠãªçç±ããããŸããç°ãªãã·ãŒã³ã§åãã¢ãã«ãåã³äœ¿çšããããšãäžå¯èœã«ãªãããã§ãã äžã®äŸã®ããã«ãã·ãŒã³ã«è¿œå ãããšãã«é©åãªå Žæã«è¡šç€ºãããããã«ã¢ãã«åãããã¢ãã«
Bãäžãããããšæ³åããŠãã ããã ãã®åŸãçªç¶ãéèŠãå€åããŸãã-ãããå®å
šã«ç°ãªãäœçœ®ã«ç§»åããããšæããŸãã ãã®ã¢ãã«ãäœæãã人ã¯ãèªåã§ã¢ãã«ã移åãããããããªãã«è¿ããªããã°ãªããªãããšãããããŸãã ãã¡ãããããã¯ãŸã£ããã°ãããŠããŸãã ããã«åŒ·åãªè°è«ã¯ãã€ã³ã¿ã©ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã®å Žåãã¢ãã«ã¯ã¹ããŒãžäžã§ç§»åãå転ãã¢ãã¡ãŒã·ã§ã³åã§ãããšããããšã§ããããã§ãã¢ãŒãã£ã¹ãã¯ãã¹ãŠã®å¯èœãªäœçœ®ã§ã¢ãã«ãå®è¡ã§ããŸããïŒ ããã¯ããã«æãã«èãããŸãã
ãã®åé¡ã®è§£æ±ºçã¯ãã¢ãã«ã®ãããŒã«ã«ã座æšç³»ã§ãã ãªããžã§ã¯ãã®äžå¿ïŒãŸãã¯æ¡ä»¶ä»ãã§åãå
¥ãããããã®ïŒãåç¹ã«äœçœ®ããããã«ãªããžã§ã¯ããã¢ãã«åããŸãã 次ã«ããªããžã§ã¯ãã®ããŒã«ã«åº§æšç³»ãããã°ã©ã ã§ã¯ãŒã«ãã·ã¹ãã ã®ç®çã®äœçœ®ã«åããŸãïŒç§»åãå転ãªã©ïŒã äžèšã®ã·ãŒã³ã«æ»ããšããªããžã§ã¯ã
A ïŒæèšåãã«45床å転ããåäœæ£æ¹åœ¢ïŒã¯æ¬¡ã®ããã«ã¢ãã«åã§ããŸãã

ãã®å Žåã®ã¢ãã«ã®èª¬æã¯æ¬¡ã®ããã«ãªããŸãã
v 0 =ïŒ-0.5ã0.5ïŒ
v 1 =ïŒ0.5ã0.5ïŒ
v 2 =ïŒ0.5ã-0.5ïŒ
v 3 =ïŒ-0.5ã-0.5ïŒ
ãããŠãããã«å¿ããŠã2ã€ã®åº§æšç³»-ã¯ãŒã«ããšããŒã«ã«ãªããžã§ã¯ã
Aã®ã·ãŒã³å
ã®äœçœ®ïŒ

ããã¯ãè€æ°ã®åº§æšç³»ãããããšã§éçºè
ïŒããã³ã¢ãŒãã£ã¹ãïŒïŒã®äœæ¥ã楜ã«ãªãçç±ã®äžäŸã§ãã ãŸããå¥ã®çç±ããããŸã-ç°ãªã座æšç³»ãžã®ç§»è¡ã¯ãå¿
èŠãªèšç®ãåçŽåã§ããŸãã
ãã座æšç³»ãšå¥ã®åº§æšç³»ã®èª¬æ
絶察座æšã®ãããªãã®ã¯ãããŸããã äœãã®èšè¿°ã¯åžžã«ããã座æšç³»ã«é¢é£ããŠèµ·ãããŸãã å¥ã®åº§æšç³»ã®èª¬æãå«ãã
äžèšã®äŸã§ã¯ã座æšç³»ã®äžçš®ã®éå±€ãæ§ç¯ã§ããŸãã
-ã¯ãŒã«ãã¹ããŒã¹
-ããŒã«ã«ã¹ããŒã¹ïŒãªããžã§ã¯ãAïŒ
-ããŒã«ã«ã¹ããŒã¹ïŒãªããžã§ã¯ãBïŒ
ç§ãã¡ã®å Žåããã®éå±€ã¯éåžžã«åçŽã§ãããå®éã®ç¶æ³ã§ã¯ããã匷åãªåå²ãæã€ããšãã§ããŸãã ããšãã°ããªããžã§ã¯ãã®ããŒã«ã«åº§æšç³»ã«ã¯ã身äœã®ç¹å®ã®éšåã®äœçœ®ãæ
åœããåã·ã¹ãã ãããå ŽåããããŸãã
åå座æšç³»ã¯ã次ã®å€ã䜿çšããŠèŠªãåºæºã«ããŠèšè¿°ã§ããŸãã
- 芪ã«å¯Ÿããåã·ã¹ãã ã®åç¹
- 芪ã«å¯Ÿããåã·ã¹ãã ã®åºæ¬ãã¯ãã«ã®åº§æš
ããšãã°ã次ã®å³ã§ã¯ã
x'y 'ã·ã¹ãã ã®åç¹ïŒ
O'ãšè¡šèšïŒã¯ç¹
ïŒ1ã1ïŒã«ããããã®åºåºãã¯ãã«
i 'ããã³
j'ã®åº§æšã¯
ïŒ0.7ã-0.7ïŒããã³
ïŒ 0.7ã0.7ïŒã§ãã ïŒ ïŒãããããæèšåãã«45床å転ãã軞ã«ã»ãŒå¯Ÿå¿ïŒã

äžç座æšç³»ã¯éå±€ã®ã«ãŒãã§ãããããäžç座æšç³»ãä»ã®åº§æšç³»ã«ã€ããŠèª¬æããå¿
èŠã¯ãããŸãããäžç座æšç³»ã®äœçœ®ãåãã¯é¢ä¿ãããŸããã ãããã£ãŠãããã説æããããã«ãæšæºããŒã¹ã䜿çšããŸãã

ããã·ã¹ãã ããå¥ã®ã·ã¹ãã ãžã®ãã€ã³ãã®åº§æšã®å€æ
芪座æšç³»ïŒ
P parentã§ç€ºãããïŒã®ç¹
Pã®åº§æšã¯ãåã·ã¹ãã ïŒ
P childã§ç€ºãããïŒã®ãã®ç¹ã®åº§æšãšã芪ã«å¯Ÿãããã®åã·ã¹ãã ã®æ¹åïŒåº§æšã®åç¹
O childããã³åºåºãã¯ãã«
i 'ã䜿çšããŠèª¬æãããŸãïŒããã³
j ' ïŒã¯æ¬¡ã®ãšããã§ãã

äžèšã®ãµã³ãã«ã·ãŒã³ã«æ»ããŸãã äžçã«å¯ŸããŠãªããžã§ã¯ã
Aã®ããŒã«ã«åº§æšç³»ãæ¹åä»ããŸããïŒ

æ¢ã«ç¥ã£ãŠããããã«ãã¬ã³ããªã³ã°ã®ããã»ã¹ã§ã¯ããªããžã§ã¯ãã®é ç¹ã®åº§æšãããŒã«ã«åº§æšç³»ããäžçã«å€æããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãäžçã«å¯ŸããããŒã«ã«åº§æšç³»ã®èª¬æãå¿
èŠã§ãã 次ã®ããã«ãªããŸãïŒç¹
ïŒ1ã1ïŒã®åç¹ãããã³åºåºãã¯ãã«ã®åº§æšã¯
ïŒ0.7ã-0.7ïŒããã³
ïŒ 0.7ã0.7ïŒã§ã ïŒå転åŸã®åºåºãã¯ãã«ã®åº§æšã®èšç®æ¹æ³ã«ã€ããŠã¯åŸè¿°ããŸãããä»ã®ãšããååãªçµæãåŸãããŠããŸãïŒ ã
ããšãã°ãæåã®é ç¹
v =ïŒ-0.5ã0.5ïŒãåããã¯ãŒã«ãã·ã¹ãã ã§ãã®åº§æšãèšç®ããŸãã

äžã®ç»åãèŠããšãçµæã®æ£ç¢ºæ§ã確èªã§ããŸãã
è¡å
次å
mxnã®è¡åã¯ã察å¿ããæ°å€ã®è¡šã§ãã ãããªãã¯ã¹ã®åæ°ãè¡æ°ãšçããå Žåããããªãã¯ã¹ã¯æ£æ¹ãšåŒã°ããŸãã ããšãã°ã
3 x 3ãããªãã¯ã¹ã¯æ¬¡ã®ãšããã§ãã

è¡åä¹ç®
M ïŒæ¬¡å
axb ïŒãš
N ïŒæ¬¡å
cxd ïŒã®2ã€ã®è¡åããããšããŸãã åŒ
R = Mã»N㯠ãè¡å
Mã®åæ°ãè¡å
Nã®è¡æ°ã«çããå Žåã«ã®ã¿å®çŸ©ãããŸãïŒã€ãŸãã
b = c ïŒã çµæã®è¡åã®æ¬¡å
ã¯
axdã«çãããªã
ãŸã ïŒã€ãŸããè¡ã®æ°ã¯è¡ã®æ°
Mã«çãããåã®æ°ã¯
Nã®åã®æ°ã«ãªããŸãïŒãäœçœ®
ijã«ããå€ã¯ã
jçªç®ã®
Mã® içªç®ã®è¡ã®ã¹ã«ã©ãŒç©ãšããŠèšç®ãããŸãå
N ïŒ

2ã€ã®è¡å
Mã»Nã®ä¹ç®ã®çµæ
ãå®çŸ©ãããŠããå Žåãéæ¹åã®ä¹ç®ã決å®ãããããšãæå³ããããã§ã¯ãããŸãã
-Nã»M ïŒè¡ãšåã®æ°ã¯äžèŽããªãå ŽåããããŸãïŒã äžè¬çãªå Žåãè¡åä¹ç®ã®æŒç®ãå¯æã§ã¯ãããŸããïŒ
Mã»Nâ Nã»Måäœè¡åãšã¯ãå¥ã®è¡åã«ä¹ç®ãããè¡åïŒã€ãŸãã
Mã»I = M ïŒãå€æŽããªãè¡åã§ããéåžžã®æ°å€ã®åäœã®äžçš®ã§ãã

è¡åãã¯ãã«
ãã¯ãã«ãè¡åãšããŠè¡šãããšãã§ããŸãã ãããè¡ãã«ã¯ããè¡ãã¯ãã«ããšãåãã¯ãã«ããšåŒã°ãã2ã€ã®æ¹æ³ããããŸãã ååã瀺ããšãããè¡ãã¯ãã«ã¯1è¡ã®è¡åãšããŠè¡šããããã¯ãã«ã§ãããåãã¯ãã«ã¯1åã®è¡åãšããŠè¡šããããã¯ãã«ã§ãã
æååãã¯ãã«ïŒ

åãã¯ãã«ïŒ

ããã«ãéåžžã«é »ç¹ã«ãã¯ãã«ïŒæ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãïŒã§ãããªãã¯ã¹ãä¹ç®ããæäœã«ééããå
ãèŠæ®ããŠãäœæ¥ãããããªãã¯ã¹ã¯
3 x 3ãŸãã¯
4 x 4ã®æ¬¡å
ãæã¡ãŸãã
3次å
ãã¯ãã«ã«
3 x 3è¡åãä¹ç®ããæ¹æ³ãæ€èšããŸãïŒä»ã®æ¬¡å
ã«ãåæ§ã®èæ
®äºé
ãé©çšãããŸãïŒã å®çŸ©ã«ãããæåã®è¡åã®åæ°ã2çªç®ã®è¡åã®è¡æ°ãšçããå Žåã2ã€ã®è¡åãä¹ç®ã§ããŸãã ãããã£ãŠã
1 x 3è¡åïŒè¡ãã¯ãã«ïŒãš
3 x 1è¡åïŒåãã¯ãã«ïŒã®äž¡æ¹ãšããŠãã¯ãã«ãè¡šçŸã§ããããã2ã€ã®å¯èœãªãªãã·ã§ã³ããããŸãã
- è¡åãå·Šãã«ãããã¯ãã«ã®ä¹ç®ïŒ

- è¡åãå³ãã«ãããã¯ãã«ã®ä¹ç®ïŒ

ã芧ã®ãšãããåã±ãŒã¹ã§ç°ãªãçµæãåŸãããŸãã ããã«ãããAPIã§äž¡åŽã§ãããªãã¯ã¹ããã¯ãã«ã§ä¹ç®ã§ããå Žåãã©ã³ãã ãšã©ãŒãçºçããå¯èœæ§ããããŸããããã¯ãåŸã§èª¬æããããã«ãå€æãããªãã¯ã¹ã¯ãã¯ãã«ã«2ã€ã®æ¹æ³ã®ããããã§ä¹ç®ãããããšãæå³ããããã§ã ã ãããç§ã®æèŠã§ã¯ãAPIã§ã¯2ã€ã®ãªãã·ã§ã³ã®ãã¡ã®1ã€ã ãã«åºå·ããæ¹ãè¯ãã§ãã ãããã®èšäºã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãæåã®ãªãã·ã§ã³ã䜿çšããŸã-ã€ãŸã ãã¯ãã«ã¯å·ŠåŽã®è¡åã§ä¹ç®ãããŸãã å¥ã®é åºã䜿çšããå Žåã¯ãæ£ããçµæãåŸãããã«ããã®èšäºã§åŸè¿°ãããã¹ãŠã®è¡åã転眮ãããè¡ããšããåèªããåãã«çœ®ãæããå¿
èŠããããŸãã ããã¯ãããã€ãã®å€æãååšããå Žåã®è¡åä¹ç®ã®é åºã«ã圱é¿ããŸãïŒè©³çŽ°ã«ã€ããŠã¯åŸè¿°ããŸãïŒã
ãŸããä¹ç®çµæãããç¹å®ã®æ¹æ³ã§ïŒèŠçŽ ã®å€ã«å¿ããŠïŒãããªãã¯ã¹ãä¹ç®ããããã¯ãã«ãå€æŽããããšãããããŸãã å転ãã¹ã±ãŒãªã³ã°ãªã©ã®å€æãå¯èœã§ãã
è¡åä¹ç®æŒç®ã®ãã1ã€ã®éåžžã«éèŠãªç¹æ§ã¯ãå°æ¥çã«ç§ãã¡ã«ãšã£ãŠæçšã«ãªããšæãããŸãããå ç®ã«é¢ããåé
æ§ã§ãã

幟äœåŠç解é
åã®ã»ã¯ã·ã§ã³ã§èŠãããã«ããããªãã¯ã¹ã¯ãã¯ãã«ã«ä¹ç®ããããã¯ãã«ãç¹å®ã®æ¹æ³ã§å€æããŸãã
ä»»æã®ãã¯ãã«ã¯åºåºãã¯ãã«ã®ç·åœ¢çµåãšããŠè¡šãããšãã§ããããšãããäžåºŠæãåºããŠãã ããã


ãã®åŒã«è¡åãä¹ç®ããŸãã

å ç®ã«é¢ããåé
æ§ã䜿çšããŠã以äžãååŸããŸãã

åã·ã¹ãã ãã芪ã·ã¹ãã ã«ãã€ã³ãã®åº§æšãå€æããæ¹æ³ãæ€èšãããšãã«ãããããã§ã«èŠãŸãããã次ã®ããã«ãªããŸããïŒ3次å
空éã®å ŽåïŒïŒ

2ã€ã®åŒã«ã¯2ã€ã®éãããããŸã-æåã®åŒã«ã¯åãããããŸããïŒ
O child ãç·åœ¢ããã³ã¢ãã£ã³å€æã«ã€ããŠèª¬æãããšãã«ãã®ç¬éããã詳现ã«æ€èšããŸãïŒããã¯ãã«
i ' ã
j'ããã³
k '㯠iM ã
jMããã³ãããã
kM ã ãããã£ãŠã
iM ã
jM ãããã³
kMã¯å座æšç³»ã®åºæ¬ãã¯ãã«ã§ãããç¹
v child ïŒv x ãv y ãv y ïŒããã®å座æšç³»ãã芪ïŒ
v transform = v parent M ïŒã«
å€æããŸãã
åæèšåãã®å転ã®äŸã§ã¯ãå€æããã»ã¹ã次ã®ããã«è¡šãããšãã§ããŸãïŒ
xyã¯å
ã®èŠªåº§æšç³»ã
x'y 'ã¯å€æã®çµæã®åšã§ãïŒã

念ã®ãããäžèšã§äœ¿çšããåãã¯ãã«ã®æå³ã確å®ã«ç解ã§ããããã«ãããããå床ãªã¹ãããŸãã
- v parentã¯ãå
ã
è¡åMã§ä¹ç®ãããã¯ãã«ã§ãã ãã®åº§æšã¯ã芪座æšç³»ãåºæºã«ããŠèšè¿°ãããŸãã
- v childã¯ããã®åº§æšããã¯ãã«v parentã«çãããã¯ãã«ã§ããããããã¯å座æšç³»ã«é¢é£ããŠèšè¿°ãããŸãã ããã¯ãåºæ¬ãã¯ãã«ãšåãæ¹æ³ã§å€æããããã¯ãã«v 芪ã§ã ïŒåã座æšã䜿çšããããïŒ
- å€æãããvã¯ã v childãšåããã¯ãã«ã§ããã座æšã¯èŠªåº§æšç³»ãåºæºã«ããŠåã«ãŠã³ããããŸãã ããã¯ããã¯ãã«v 芪ãå€æããæçµçµæã§ã
ããã§ãåºåºãã¯ãã«ã«è¡å
Mãæãããšã©ããªãããèããŠã¿ãŸãããã



è¡å
Mãä¹ç®ããŠåŸãããæ°ããåšåº§æšç³»ã®åºåºãã¯ãã«ã¯ãè¡åã®è¡ãšäžèŽããããšãããããŸãã ããã¯ç§ãã¡ãæ¢ããŠããéåžžã«å¹ŸäœåŠçãªè§£éã§ãã
ããŠãå€æè¡åãèŠããšããã§ããããäœãããŠããã®ããç解ããããã«ã©ããèŠãã¹ãããç¥ãããšãã§ããŸã-ãã®åº§æšç³»ãæ°ãã座æšç³»ã®åºåºãã¯ãã«ãšããŠæ³åããŠãã ããã座æšç³»ã§è¡ãããå€æã¯ããã¯ãã«ã«ãã®è¡åãæããŠè¡ãããå€æãšåãã§ãããŸãããããªãã¯ã¹åœ¢åŒã§è¡šãããå€æãäºãã«ä¹ç®ããããšã§çµåããããšãã§ããŸãã
ãããã£ãŠããããªãã¯ã¹ã¯ãå€æãèšè¿°ããã³çµåããããã®éåžžã«äŸ¿å©ãªããŒã«ã§ããç·åœ¢å€æ
æåã«ãæãäžè¬çã«äœ¿çšãããç·åœ¢å€æãæ€èšããŸããç·åœ¢å€æ-æºããäºã€ã®ç¹æ§ããšå€æïŒ
éèŠãªçµæã¯-ç·åœ¢å€æã移åããããšãå«ãããšãã§ããªãïŒããã¯ãŸããé·æççç±ã§ããOã®åã以éã第äºåŒã«ããã°ãåã®ã»ã¯ã·ã§ã³ã«ã¯ååšããªãïŒã¯0åžžã«ã§è¡šç€ºããã0ãå転
2次å
空éã§ã®å転ãèæ
®ããŠãã ãããããã¯ã座æšç³»ãç¹å®ã®è§åºŠã ãå転ãããå€æã§ãããã§ã«ããã£ãŠããããã«ãæ°ãã座æšè»žïŒç¹å®ã®è§åºŠã§å転ããåŸã«åŸãããïŒãèšç®ããããããå€æè¡åã®è¡ãšããŠäœ¿çšããã ãã§ååã§ããçµæã¯ãåºæ¬çãªãžãªã¡ããªããç°¡åã«ååŸã§ããŸãã

äŸïŒ
3次å
空éã§ã®å転ã®çµæãåæ§ã«ååŸãããŸããã2ã€ã®åº§æšè»žã§æ§æãããå¹³é¢ãå転ãã3çªç®ã®åº§æšè»žïŒå転ãçºçããåšèŸºïŒãåºå®ããç¹ã®ã¿ãç°ãªããŸããããšãã°ãx軞ã®åšãã®å転è¡åã¯æ¬¡ã®ãšããã§ãã
ã¹ã±ãŒãªã³ã°
次ã®ãããªãã¯ã¹ãé©çšããããšã«ããããã¹ãŠã®è»žã«å¯Ÿãããªããžã§ã¯ãã®ã¹ã±ãŒã«ãå€æŽã§ããŸãã
å€æããã座æšç³»ã®è»žã¯ãå
ã®åº§æšç³»ãšåãæ¹æ³ã§æ¹åä»ããããŸããã1枬å®åäœã«å¯ŸããŠSåã®æéãå¿
èŠã«ãªããŸãã
äŸïŒ
ãã¹ãŠã®è»žã«é¢ããŠåãä¿æ°ã§ã¹ã±ãŒãªã³ã°ããããšãåäžãšåŒã³ãŸããããããç°ãªã軞ã«æ²¿ã£ãŠç°ãªãä¿æ°ã§ã¹ã±ãŒãªã³ã°ããããšãã§ããŸãïŒäžåäžïŒã
ã·ãã
ååã瀺ãããã«ããã®å€æã¯åº§æšè»žã«æ²¿ã£ãŠã·ãããçæããæ®ãã®è»žã¯ãã®ãŸãŸæ®ããŸãã
ãããã£ãŠãy軞ã®ã·ãããããªãã¯ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
äŸïŒ
3次å
空éã®ãããªãã¯ã¹ãåæ§ã®æ¹æ³ã§äœæãããŸããããšãã°ãx軞ãã·ãããããªãã·ã§ã³ïŒ
ãã®å€æã¯ãã£ãã«äœ¿çšãããŸããããã¢ãã£ã³å€æãæ€èšãããšãã«å°æ¥äŸ¿å©ã«ãªããŸããåšåº«ã«ã¯ãã§ã«ããªãã®æ°ã®å€æãããã3 x 3ãããªãã¯ã¹ãšããŠè¡šãããšãã§ããŸããããã1ã€äžè¶³ããŠããŸã-å€äœãæ®å¿µãªãããå€äœã¯ç·åœ¢å€æã§ã¯ãªãããã3 x 3è¡åã䜿çšããŠ3次å
空éã§å€äœãè¡šçŸããããšã¯ã§ããŸããããã®åé¡ã®è§£æ±ºçã¯åçš®ã®åº§æšã§ããããã«ã€ããŠã¯åŸã§æ€èšããŸããäžå€®æ圱
æçµçãªç®æšã¯ã2次å
ã®ã¹ã¯ãªãŒã³ã«3次å
ã®ã·ãŒã³ãæãããšã§ãããããã£ãŠãäœããã®æ¹æ³ã§å¹³é¢äžã§ã·ãŒã³ãèšèšããå¿
èŠããããŸããæãäžè¬çã«äœ¿çšãããæ圱æ³ã«ã¯ãæ£å°æ圱æ³ãšäžå€®æ圱æ³ïŒå¥å-é è¿æ³ïŒã®2çš®é¡ããããŸãã人éã®ç®ã3次å
ã®ã·ãŒã³ãèŠããšã人éãèŠãæçµç»åã§ã¯ãããããé ãé¢ãããªããžã§ã¯ããå°ãããªããŸãããã®å¹æã¯é è¿æ³ãšåŒã°ããŸããæ£æ圱ã¯ãé è¿æ³ãç¡èŠããŸããããã¯ãããŸããŸãªCADã·ã¹ãã ïŒããã³2Dã²ãŒã ïŒã§äœæ¥ããå Žåã«äŸ¿å©ãªããããã£ã§ããäžå€®æ圱ã«ã¯ãã®ç¹æ§ãããããããªã¢ãªãºã ã®ããªãã®éšåãè¿œå ãããŸãããã®èšäºã§ã¯ã圌女ã ããæ€èšããŸããæ£å°æ圱ãšã¯ç°ãªããé è¿æ圱ã®ç·ã¯äºãã«å¹³è¡ã§ã¯ãªããæ圱ã®äžå¿ãšåŒã°ããç¹ã§äº€å·®ããŸããæ圱äžå¿ã¯ãã·ãŒã³ãèŠããç®ãã§ãããä»®æ³ã«ã¡ã©ã§ã
ãç»åã¯ãä»®æ³ã«ã¡ã©ããæå®ã®è·é¢ã«ããå¹³é¢äžã«åœ¢æãããŸãããããã£ãŠãã«ã¡ã©ããã®è·é¢ã倧ããã»ã©ãæ圱ãµã€ãºã¯å€§ãããªããŸãã
æãåçŽãªäŸãèããŠã¿ãŸããããã«ã¡ã©ã¯åç¹ã«ãããæ圱é¢ã¯ã«ã¡ã©ããè·é¢dã«ãããŸããæ圱ããããã€ã³ãã®åº§æšãããã£ãŠããŸãïŒïŒxãyãzïŒãå¹³é¢äžã®ãã®ç¹ã®æ圱ã®åº§æšx pãèŠã€ããŸãã
ãã®å³ã§ã¯ã2ã€ã®é¡äŒŒããäžè§åœ¢ã衚瀺ãããŠããŸã-CDPããã³CBAïŒ3ã€ã®è§åºŠã§ïŒïŒ
ãããããåŽé¢éã®é¢ä¿ãä¿æãããŸãïŒx座æš
ã®çµæãååŸããŸãïŒåæ§ã«ãy座æšã®å ŽåïŒãã®å€æã䜿çšããŠåœ¢æããå¿
èŠããããŸãæ圱ç»åããããŠãããã§åé¡ãçºçããŸã- ãããªãã¯ã¹ã䜿çšãã3次å
空éã§ã®z座æšãžã®åå²ã¯æ³åã§ããŸãããå€äœè¡åã®å Žåã®ããã«ããã®åé¡ã®è§£æ±ºçã¯å次座æšã§ãã

å°åœ±å¹Ÿäœãšå次座æš
ãããŸã§ã«ã2ã€ã®åé¡ãçºçããŸããããããã®åé¡ã¯äž¡æ¹ãšããåäžãªåº§æšã䜿çšããããšã§è§£æ±ºãããŸããå皮座æš-å°åœ±å¹ŸäœåŠããã®æŠå¿µãå°åœ±å¹ŸäœåŠã¯å°åœ±ç©ºéãç 究ããå次座æšã®å¹ŸäœåŠç解éãç解ããã«ã¯ãããããç¥ãå¿
èŠããããŸãã以äžã§ã¯ã2次å
å°åœ±ç©ºéã®å®çŸ©ãæ€èšããŸããããã¯ã2次å
å°åœ±ç©ºéã®æ¹ãæåããããããã§ããåæ§ã®èæ
®äºé
ã3次å
å°åœ±ç©ºéã«é©çšãããŸãïŒå°æ¥çã«äœ¿çšããŸãïŒã空éR 3ã®å
ç·ã次ã®ããã«å®çŸ©ããŸããå
ç·ã¯kv圢åŒã®ãã¯ãã«ã®ã»ããã§ãïŒkã¯ã¹ã«ã©ãŒãvã¯éãŒãã®ãã¯ãã«ã空éR 3ã®èŠçŽ ïŒãã€ãŸã
ãã¯ãã«vã¯å
ç·ã®æ¹åãå®çŸ©ããŸãïŒ
ããã§å°åœ±ç©ºéã®å®çŸ©ã«é²ãããšãã§ããŸããå°åœ±å¹³é¢ïŒããªãã¡ã次å
ãæã€å°åœ±ç©ºéã2ã«çããïŒP 2空éã«é¢é£ä»ããããR 3ã¯ãã§è€æ°ã®ããŒã ã§ããR 3ããããã£ãŠãP 2ã®ããã€ã³ããã¯R 3ã®å
ç·ã§ãããããã£ãŠãäžã®2ã€ã®ãã¯ãã«R 3ã»ããã®äžæ¹ãšã«åãèŠçŽ P 2ïŒãã®å Žåããããã¯1ã€ã®å
ç·äžã«ããããïŒããããã®äžæ¹ãã¹ã«ã©ã«ç§ãä¹ããŠåŸãããããšãã§ããã°ã
ããšãã°ããã¯ãã«ïŒ 1ã1ã1 ïŒãšïŒ5ã5ã5ïŒã¯åãå
ç·ãè¡šããŸããã€ãŸãããããã¯å°åœ±å¹³é¢ã®åãããã€ã³ããã§ãããããã£ãŠãæã
ã¯åäžãªåº§æšã«ãªããŸãããå°åœ±å¹³é¢ã®åèŠçŽ ã¯ã3ã€ã®åº§æšïŒxãyãwïŒã®å
ç·ã§å®çŸ©ãããŸãïŒæåŸã®åº§æšã¯ãzã®ä»£ããã«wãšåŒã°ãã-äžè¬ã«åãå
¥ããããŠããåæïŒ-ãããã®åº§æšã¯åçš®ãšåŒã°ããã¹ã«ã©ãŒãŸã§æ±ºå®ãããŸããããã¯ãã¹ã«ã©ãŒã®å次座æšã§ä¹ç®ïŒãŸãã¯é€ç®ïŒã§ããããšãæå³ããŸãããããã®åº§æšã¯ãå°åœ±å¹³é¢å
ã®åãããã€ã³ãããè¡šããŸããå°æ¥çã«ã¯ãåçš®ã®åº§æšã䜿çšããŠãã¢ãã£ã³ïŒåããå«ãïŒå€æãšæ圱ãè¡šããŸãããããããã®åã«ãã1ã€ã®åé¡ã解決ããå¿
èŠããããŸããäžããããã¢ãã«é ç¹ãå次座æšã®åœ¢ã§ã©ã®ããã«æ瀺ããã®ã§ãããããå次座æšãžã®ãå ç®ãã¯3çªç®ã®åº§æšwã®å ç®ã«ããçºçãããããåé¡ã¯ãwã®ã©ã®å€ã䜿çšããå¿
èŠãããããšããããšã«ãªããŸãããã®è³ªåã«å¯Ÿããçãã¯ãŒã以å€ã§ããwã®ç°ãªãå€ã䜿çšããéã®éãã¯ãããããæäœãã䟿å©ãã§ãã
ãããŠãããã«ç解ãããããã«ïŒãããŠãããã¯éšåçã«çŽæçã«æ確ã§ãïŒãwã®æã䟿å©ãªå€ã¯1ã§ãããã®éžæã®å©ç¹ã¯æ¬¡ã®ãšããã§ãã- ( )
- ( ) w , (.. w):

â w = 1 , w â , w
ãããã£ãŠãå€w = 1ãéžæããŸããããã¯ãå次座æšã®å
¥åããŒã¿ã次ã®ããã«ãªãããšãæå³ããŸãïŒãã¡ããããŠãããã¯æ¢ã«è¿œå ãããŠãããã¢ãã«ã®èª¬æèªäœã«ã¯å«ãŸããŸããïŒãv 0 =ïŒx 0ãy 0ã1ïŒã
V 1 =ïŒX 1ãY 1 1ïŒ
V 2 =ïŒX 2ãY 2ã1ïŒ
ãæäœãããšãä»ã§ã¯ç¹å¥ãªå Žåãèæ
®ããå¿
èŠãããwã®åº§æšã§ããã€ãŸãããŒãã«çãããwã®ä»»æã®å€ãéžæã§ãããšäžèšã§è¿°ã¹ãŸããããŒãã§ã¯ãªããå次座æšã«å±éããŸããç¹ã«ãw = 0ãåãããšã¯ã§ããŸããããªããªãããã®ç¹ã移åã§ããªãããã§ãïŒåŸã§èª¬æããããã«ãw座æšã®å€ã«ãã£ãŠç§»åãæ£ç¢ºã«è¡ãããããïŒããŸããç¹wã®åº§æšããŒãã®å Žåããç¡éãã«ããç¹ãšèŠãªãããšãã§ããŸãããªããªããå¹³é¢w = 1ã«æ»ãããšãããšããŒãã«ããé€ç®ãåŸãããããã§ãã
ãŸããã¢ãã«ã®é ç¹ã«nullå€ã䜿çšããããšã¯ã§ããŸãããããã¯ãã«ã«ã¯nullå€ã䜿çšã§ããŸãïŒããã¯ããã¯ãã«ãäœçœ®ãèšè¿°ããªããããå€æäžã«ãã¯ãã«ãå€äœã®åœ±é¿ãåããªããšããäºå®ã«ã€ãªãããŸããããšãã°ãæ³ç·ãå€æããå Žåãããã移åããããšã¯ã§ããŸãããããããªããšãééã£ãçµæãåŸãããŸãããã¯ãã«ã®å€æãå¿
èŠã«ãªã£ãå Žåãããããã詳现ã«æ€èšããŸããããã«é¢ããŠãw = 1ã®å Žåã¯ç¹ãèšè¿°ããw = 0ã®å Žåã¯ãã¯ãã«ãèšè¿°ãããšããæžãããŠããŸãããã§ã«æžããããã«ã2次å
ã®å°åœ±ç©ºéã®äŸã䜿çšããŸããããå®éã«ã¯3次å
ã®å°åœ±ç©ºéã䜿çšããŸããã€ãŸããåãã€ã³ãã¯4ã€ã®åº§æšã§èšè¿°ãããŸãïŒïŒxãyãzãwïŒ ãåäžãªåº§æšã䜿çšããŠç§»åãã
ããã§ãã¢ãã£ããã£å€æãèšè¿°ããããã«å¿
èŠãªããŒã«ããã¹ãŠæããŸãããã¢ããã€å€æ-ãã®åŸã®å€äœã䌎ãç·åœ¢å€æã4 x 4è¡åã䜿çšããŠãå次座æšã䜿çšããã¢ãã£ã³å€æãèšè¿°
ããããšãã§ããŸãïŒå次座æšãšããŠè¡šããããã¯ãã«ãä¹ç®ãã4 x 4è¡åãä¹ç®ããçµæãèããŸãïŒã芧ã®ããã«ãå€æãšã®éã3 x 3è¡åã®åœ¢åŒã§è¡šããã4çªç®ã®åº§æšãšãv wã»m 3i圢åŒã®å座æšã®æ°ããé
ã§æ§æãããŸããããã䜿çšããŠãw = 1ãæå³ããŸã

ãå€äœã次ã®ããã«è¡šãããšãã§ããŸãïŒ
ããã§ãw = 1ã®æ£ããéžæãæ€èšŒã§ããŸããå€äœdxãè¡šãã«ã¯ã圢åŒwã»dx / wã®é
ã䜿çšããŸãããããã£ãŠãè¡åã®æåŸã®è¡ã¯ïŒdx / wãdy / wãdz / wã1ïŒã®ããã«ãªããŸããw = 1ã®å Žåãåæ¯ãåçŽã«çç¥ã§ããŸãããã®ãããªãã¯ã¹ã«ã¯ã幟äœåŠçãªè§£éããããŸããåã«èª¿ã¹ãã·ããè¡åãæãåºããŠãã ããã圢åŒã¯ãŸã£ããåãã§ããå¯äžã®éãã¯ã4çªç®ã®è»žãã·ãããããããšã§ãããããã£ãŠãè¶
å¹³é¢w = 1ã«ãã3次å
éšå空éã察å¿ããå€ã ãã·ãããããŸããä»®æ³ã«ã¡ã©ã®èª¬æ
ä»®æ³ã«ã¡ã©ã¯ãã·ãŒã³ãèŠããç®ãã§ããå
ã«é²ãåã«ã空éå
ã®ã«ã¡ã©ã®äœçœ®ãã©ã®ããã«èšè¿°ã§ããããããã³æçµç»åã®åœ¢æã«å¿
èŠãªãã©ã¡ãŒã¿ãŒãç解ããå¿
èŠããããŸããã«ã¡ã©ãã©ã¡ãŒã¿ãŒã¯ãåãæšãŠããããã¥ãŒã®ãã©ãããïŒèŠéå°ïŒãæå®ããŸããããã«ãããã·ãŒã³ã®ã©ã®éšåãæçµç»åã«åé¡ããããã決ãŸã
ãŸãã- . , , . . «UVN» , .. . , u , v n ( ), right , up forward â , . .

API â . , , up ( up' ). :
- right forward up' :

- up , right forward :

, up' forward , up . OpenGL, gluLookAt .
â ,
- z-ã«ã¡ã©åº§æšç³»ã®ãã¢ããã³ãã¡ãŒã¯ãªããã³ã°ãã¬ãŒã³ïŒãã¢/ãã¡ãŒã¯ãªããã³ã°ãã¬ãŒã³ïŒã®åº§æš
- ã«ã¡ã©ã¢ã³ã°ã«ã ã¬ãã¥ãŒã®åãæšãŠããããã©ãããã®ãµã€ãºãæå®ããŸãã

ã·ãŒã³ã¯æ圱é¢ã«æ圱ãããããããã®å¹³é¢ã®ç»åã¯ã³ã³ãã¥ãŒã¿ãŒã®ç»é¢ã«è¡šç€ºãããŸãã ãããã£ãŠããã®å¹³é¢ãšç»åã衚瀺ããããŠã£ã³ããŠïŒãŸãã¯ãã®äžéšïŒã®ã¢ã¹ãã¯ãæ¯ãäžèŽããããšãéèŠã§ãã ããã¯ãAPIãŠãŒã¶ãŒã«1ã€ã®è¡šç€ºè§åºŠã®ã¿ãæå®ãããŠã£ã³ããŠã®ã¢ã¹ãã¯ãæ¯ã«åŸã£ãŠ2çªç®ã®è¡šç€ºè§åºŠãèšç®ããæ©èœãæäŸããããšã§å®çŸã§ããŸãã ããšãã°ãæ°Žå¹³æ¹åã®èŠéè§ãããã£ãŠããå Žåã次ã®ããã«åçŽæ¹åãèšç®ã§ããŸãã

äžå€®æ圱ã«ã€ããŠèª¬æãããšããæ圱é¢ãã«ã¡ã©ããé ããªãã»ã©ãçµæã®ç»åã®ãµã€ãºã倧ãããªãããšãããããŸãããã«ã¡ã©ããïŒåç¹ã«ãããšä»®å®ããŠïŒ z軞ã«æ²¿ã£ãå€æ°dã®æ圱é¢ãŸã§ã®è·é¢ã瀺ããŸãã ãããã£ãŠã dã®å€ãéžæããå¿
èŠããããšããåé¡ã解決ããå¿
èŠããããŸãã å®éããŒã以å€ã®å€ã dã®å¢å ãšãšãã«ç»åãµã€ãºãå¢å ãããšããäºå®ã«ããããããããã¥ãŒã®ãã©ããããšäº€å·®ããæ圱é¢ã®éšåã¯æ¯äŸããŠå¢å ããå¹³é¢ã®ãã®éšåã®å¯žæ³ã«å¯ŸããŠåãç»åã¹ã±ãŒã«ãæ®ããŸãã å°æ¥çã«ã¯ã䟿å®äžd = 1ã䜿çšããŸãã
2Dã®äŸïŒ

ãã®çµæãç»åã®çž®å°ºãå€æŽããã«ã¯ãèŠéè§ãå€æŽããå¿
èŠããããŸããããã«ãããæ圱ãã©ããããšäº€å·®ããæ圱é¢ã®éšåã®ãµã€ãºãå€æŽãããæ圱ãµã€ãºã¯åããŸãŸã«ãªããŸãã
ã«ã¡ã©ã移åããã³å転ããŠããã®åº§æšç³»ã®äœçœ®ãšæ¹åãå€æŽã§ããŸãã ã³ãŒãäŸïŒ
é衚瀺ã®ããã¹ãvoid camera::move_right(float distance) { m_position += m_right * distance; } void camera::move_left(float const distance) { move_right(-distance); } void camera::move_up(float const distance) { m_position += m_up * distance; } void camera::move_down(float const distance) { move_up(-distance); } void camera::move_forward(float const distance) { m_position += m_forward * distance; } void camera::move_backward(float const distance) { move_forward(-distance); } void camera::yaw(float const radians) { matrix3x3 const rotation{matrix3x3::rotation_around_y_axis(radians)}; m_forward = m_forward * rotation; m_right = m_right * rotation; m_up = m_up * rotation; } void camera::pitch(float const radians) { matrix3x3 const rotation{matrix3x3::rotation_around_x_axis(radians)}; m_forward = m_forward * rotation; m_right = m_right * rotation; m_up = m_up * rotation; }
ã°ã©ãã£ãã¯ã³ã³ãã¢
ããã§ãã³ã³ãã¥ãŒã¿ãŒç»é¢äžã®3次å
ã·ãŒã³ã®ç»åãååŸããããã«å¿
èŠãªã¹ããããã¹ãããã§èª¬æããããã«å¿
èŠãªãã¹ãŠã®åºç€ãã§ããŸããã ç°¡åã«ããããã«ããã€ãã©ã€ã³ã¯äžåºŠã«1ã€ã®ãªããžã§ã¯ããæç»ãããšä»®å®ããŸãã
ã€ã³ããŠã³ããã€ãã©ã€ã³ãã©ã¡ãŒã¿ãŒïŒ
- äžç座æšç³»ã§ã®ãªããžã§ã¯ããšãã®åã
- ç»åãã³ã³ãã€ã«ãããšãã«ãã©ã¡ãŒã¿ã䜿çšããã«ã¡ã©
1.äžç座æšç³»ãžã®ç§»è¡
ãã®æ®µéã§ããªããžã§ã¯ãã®é ç¹ãããŒã«ã«åº§æšç³»ããäžçã«å€æããŸãã
äžç座æšç³»ã§ã®ãªããžã§ã¯ãã®æ¹åã¯ã次ã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠå®çŸ©ããããšä»®å®ããŸãã
- ã¯ãŒã«ã座æšç³»ã®ã©ã®ç¹ã«ãªããžã§ã¯ããããã®ãââïŒ ïŒx world ãy world ãz world ïŒ
- ãªããžã§ã¯ãã®å転æ¹æ³ïŒ ïŒr x ãr y ãr z ïŒ
- ãªããžã§ã¯ãã¹ã±ãŒã«ïŒ ïŒs x ãs y ãs z ïŒ
ãããã®å€æã®è¡åããããã
T ã
Rãããã³
SãšåŒã³ãŸãã ãªããžã§ã¯ããäžç座æšç³»ã«å€æããæçµçãªãããªãã¯ã¹ãååŸããã«ã¯ãããããä¹ç®ããã ãã§ååã§ãã ããã§ãè¡åã®ä¹ç®ã®é åºã圹å²ãæããããšã«æ³šæããããšãéèŠã§ããããã¯ãè¡åã®ä¹ç®ãéå¯æã§ãããšããäºå®ããçŽæ¥çããŸãã
ã¹ã±ãŒãªã³ã°ã¯åç¹ãåºæºã«ããŠçºçããããšãæãåºããŠãã ããã æåã«ãªããžã§ã¯ããç®çã®ãã€ã³ãã«ç§»åããŠããã¹ã±ãŒã«ãé©çšãããšãééã£ãçµæãåŸãããŸããã¹ã±ãŒãªã³ã°åŸã«ãªããžã§ã¯ãã®äœçœ®ãåã³å€æŽãããŸãã ç°¡åãªäŸïŒ

åæ§ã®èŠåãå転ã«é©çšãããŸã-åç¹ãåºæºã«ããŠçºçããŸããã€ãŸããæåã«ç§»åãããšãªããžã§ã¯ãã®äœçœ®ãå€ãããŸãã
ãããã£ãŠããã®å Žåã®æ£ããã·ãŒã±ã³ã¹ã¯æ¬¡ã®ãšããã§ããã¹ã±ãŒãªã³ã°-å転-å€äœïŒ

2.ã«ã¡ã©åº§æšç³»ãžã®ç§»è¡
ç¹ã«ãã«ã¡ã©åº§æšç³»ãžã®ç§»è¡ã¯ããããªãèšç®ãç°¡çŽ åããããã«äœ¿çšãããŸãã ãã®åº§æšç³»ã§ã¯ãã«ã¡ã©ã¯åç¹ã«é
眮ããããã®è»žã¯åã®ã»ã¯ã·ã§ã³ã§èª¿ã¹ã
forward ã
right ã
upã®ãã¯ãã«
ã§ã ã
ã«ã¡ã©åº§æšç³»ãžã®ç§»è¡ã¯ã2ã€ã®ã¹ãããã§æ§æãããŸãã
- ã«ã¡ã©ã®äœçœ®ãåç¹ãšäžèŽããããã«äžçã移åããŸã
- èšç®ããã軞right ã up ã forwardã䜿çšããŠããããã®è»žã«æ²¿ã£ããªããžã§ã¯ãã®é ç¹ã®åº§æšãèšç®ããŸãïŒãã®æé ã¯ãã«ã¡ã©ã®åº§æšç³»ãå転ãããŠã¯ãŒã«ã座æšç³»ãšäžèŽãããããšãšèŠãªãããšãã§ããŸãïŒ
æåã®ã¹ãããã¯ã
ïŒ-pos x ã-pos y ã-pos z ïŒäžã®å€äœè¡åãšããŠç°¡åã«è¡šãããšãã§ããŸããããã§ã
posã¯äžç座æšç³»ã®ã«ã¡ã©äœçœ®ã§ãã

2çªç®ã®ãã€ã³ããå®è£
ããã«ã¯ãæåã«æ€èšããã¹ã«ã©ãŒç©ã®ããããã£ã䜿çšããŸããã¹ã«ã©ãŒç©ã¯ãæå®ããã軞ã«æ²¿ã£ãæ圱ã®é·ããèšç®ããŸãã ãããã£ãŠããã€ã³ã
Aãã«ã¡ã©ã®åº§æšç³»ã«å€æããã«ã¯ïŒã«ã¡ã©ãåç¹ã«ãããšããäºå®ãèæ
®ããŠãæåã®æ®µèœã§ãããè¡ããŸããïŒããã¯ã¿ãŒã®ã¹ã«ã©ãŒç©ã
up ã
forwardãååŸããã ãã§ãã äžç座æšç³»
vã®ç¹ãšãã«ã¡ã©ã®åº§æšç³»
v 'ã«å€æãããåãç¹ã瀺ããŸãïŒ

ãã®æäœã¯ããããªãã¯ã¹ãšããŠè¡šãããšãã§ããŸãã

ãããã®2ã€ã®å€æãçµã¿åãããŠãã«ã¡ã©åº§æšç³»ã®é·ç§»è¡åãååŸããŸãã

æŠç¥çã«ããã®ããã»ã¹ã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸãã

3.åäžãªã¯ãªããã³ã°ã¹ããŒã¹ãžã®ç§»è¡ãšåº§æšã®æ£èŠå
åã®æ®µèœã®çµæãšããŠãã«ã¡ã©åº§æšç³»ã§ãªããžã§ã¯ãã®é ç¹ã®åº§æšãååŸããŸããã 次ã«è¡ãããšã¯ããããã®é ç¹ãå¹³é¢ã«æ圱ããäœåãªé ç¹ããåãåããããšã§ãã ãªããžã§ã¯ãã衚瀺ãã©ãããã®å€åŽã«ããå Žåããªããžã§ã¯ãã®äžéšã¯åãåãããŸãïŒã€ãŸãããã®æ圱ã¯ã衚瀺ãã©ããããèŠãå¹³é¢ã®äžéšã«ãããŸããïŒã ããšãã°ã次ã®å³ã®é ç¹
v 1 ïŒ

ãããã®ã¿ã¹ã¯ã¯äž¡æ¹ãšããå°åœ±è¡åã«ãã£ãŠéšåçã«è§£æ±ºãããŸãã ãéšåçã«ã-æ圱èªäœã¯çæãããŸãããããã®ããã«é ç¹ã®
w座æšãæºåããããã§ãã ãã®ããããæ圱è¡åããšããååã¯ããŸããµãããããããŸãããïŒããã¯ããªãäžè¬çãªçšèªã§ããïŒãåãæšãŠããã衚瀺ãã©ããããå質ãªã¯ãªããã³ã°ã¹ããŒã¹ïŒå質ãªïŒã¯ãªããã¹ããŒã¹ïŒã
ãããããŸãæåã«ã ãã®ãããæåã¯æ圱ã®æºåã§ãã ãããè¡ãã«ã¯ãé ç¹ã®
z座æšã
w座æšã«é
眮ããŸãã æ圱èªäœïŒã€ãŸãã
zã«ããé€ç®ïŒã¯ãw座æšãããã«æ£èŠåãããšçºçããŸãã 空é
w = 1ã«æ»ããšãã
ãã®ãããªãã¯ã¹ã次ã«è¡ãã¹ãããšã¯ããªããžã§ã¯ãã®é ç¹ã®åº§æšãã«ã¡ã©ç©ºéããåçš®ã®ã¯ãªãã空éã«å€æããããšã§ãã ããã¯ãæ圱ãé©çšããåŸïŒã€ãŸããå€ã
z座æšãä¿åãããã
w座æšã§é€ç®ããåŸïŒãé ç¹ã®åº§æšãæ£èŠåãããããã«ãåãæšãŠãããŠããªãé ç¹ã®åº§æšã§ãã空éã§ãã 次ã®æ¡ä»¶ãæºããã
z座æšã®äžçåŒã¯ãAPIã«ãã£ãŠç°ãªãå ŽåããããŸãã ããšãã°ãOpenGLã§ã¯ãäžäœã®ãã®ã«å¯Ÿå¿ããŸãã Direct3Dã§ã¯ã
z座æšã¯éé
[0ã1]ã§è¡šç€ºãããŸãã OpenGLã§åãå
¥ããããééãã€ãŸã
[-1ã1] ã
ãã®ãããªåº§æšã¯ãæ£èŠåããã€ã¹åº§æšïŒãŸãã¯åã«NDCïŒãšåŒã°ããŸãã
座æšã
wã§é€ç®ããããšã«ããNDC座æšãååŸãããããã¯ãªããã³ã°ç©ºéã®é ç¹ã¯æ¬¡ã®æ¡ä»¶ãæºãããŸãã

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

å
šäœãšããŠããã®æ®µéã¯æ¬¡ã®æé ã§æ§æãããŸãã
- ã«ã¡ã©ç©ºéã®é ç¹ãååŸããŸã
- ã«ãããªããããªãã¯ã¹ãä¹ç®-ã«ãããªãã¹ããŒã¹ã«ç§»å
- äžèšã®äžçåŒã§ãã§ãã¯ããŠãã«ãããªãé ç¹ãããŒã¯ããŸã
- åé ç¹ã®åº§æšããã®w-座æšã§é€ç®-æ£èŠåããã座æšã«ç§»å
次ã«ãã«ã¡ã©ç©ºéããã¯ãªããã³ã°ç©ºéã«åº§æšããããã³ã°ããæ¹æ³ãæ€èšããŸãã æ圱平é¢
z = 1ã䜿çšããããšã«ããããšãæãåºããŠãã ããã æåã«ãåºé
[-1ã1]ã®ãã¥ãŒã®ãã©ããããšæ圱é¢ã®äº€ç¹ã«ãã座æšã衚瀺ããé¢æ°ãèŠã€ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãå¹³é¢ã®ãã®éšåãå®çŸ©ããç¹ã®åº§æšãèŠã€ããŸãã ãããã®2ã€ã®ãã€ã³ãã«ã¯ã座æš
ïŒå·ŠãäžïŒãš
ïŒå³ãäžïŒããããŸãã ãã¥ãŒã®ãã©ããããã«ã¡ã©ã®æ¹åã«å¯ŸããŠå¯Ÿç§°ã§ããå Žåã®ã¿ãèæ
®ããŸãã

衚瀺è§åºŠã䜿çšããŠããããèšç®ã§ããŸãã

ååŸãããã®ïŒ

åæ§ã«
topãš
bottomã«ã€ããŠã ïŒ

ãããã£ãŠãéé
[leftãright] ã
[bottomãtop] ã
[nearãfar]ã
[-1;ã«ãããã³ã°ããå¿
èŠããã
ãŸãã 1] ã
å·Šãš
å³ã«ãã®ãããªçµæãäžããç·åœ¢é¢æ°ãèŠã€ããŸãïŒ

åæ§ã«ã
bottomãš
topã®é¢æ°ãååŸããŸãïŒ
zã®åŒã¯ç°ãªããŸãã 圢åŒ
az + bã®é¢æ°ãèæ
®ãã代ããã«ãé¢æ°
aã»1 / z + bãèæ
®ããŸããããã¯ãå°æ¥ã深床ãããã¡ãå®è£
ãããšãã«ãz座æšã®éæ°ãç·åœ¢è£éããå¿
èŠãããããã§ãã ä»ã¯ãã®åé¡ãèæ
®ãããåœç¶ã®ããšãšèããŠããŸãã ååŸãããã®ïŒ

ãããã£ãŠãæ£èŠåããã座æšã¯ãã«ã¡ã©ç©ºéã®åº§æšãã次ã®ããã«ååŸããããšæžãããšãã§ããŸãã
zã«ããé€ç®ã¯åŸã§è¡ããã
w座æšãæ£èŠåãããããããããã®åŒãããã«é©çšããããšã¯ã§ããŸããã ãããå©çšããŠã代ããã«æ¬¡ã®å€ãèšç®ãïŒzã§ä¹ç®ïŒã
wã§é€ç®ããåŸãæ£èŠåããã座æšã«ãªããŸãã

ãããã®åŒã䜿çšããŠãã«ãããªãã¹ããŒã¹ã«å€æããŠããŸãã ãã®å€æãè¡å圢åŒã§æžãããšãã§ããŸãïŒããã«
zã
w座æšã«å
¥ããããšãæãåºããŠãã ããïŒïŒ

ã¹ã¯ãªãŒã³åº§æšç³»ã«ç§»å
çŸåšã®æ®µéã§ã¯ãNDCã®ãªããžã§ã¯ãã®é ç¹ã®åº§æšããããŸãã ããããã¹ã¯ãªãŒã³åº§æšç³»ã«å€æããå¿
èŠããããŸãã æ圱é¢ã®å·Šäžé
ãïŒ-1ã1ïŒã«ãããã³ã°ãããå³äžé
ãïŒ1ã-1ïŒã«ãããã³ã°ãããããšãæãåºããŠãã ããã ç»é¢ã§ã¯ã座æšç³»ã®åç¹ãšããŠå·Šäžé
ã䜿çšãã軞ã¯å³äžãæããŸãã

ãã®ãã¥ãŒããŒãå€æã¯ãåçŽãªåŒã䜿çšããŠå®è¡ã§ããŸãã

ãŸãã¯ããããªãã¯ã¹åœ¢åŒã§ïŒ

ããã¹ãããã¡ãå®è£
ããããã«z
ndcã®äœ¿çšã¯ãã®ãŸãŸã«ããŸãã
ãã®çµæãç»é¢äžã®é ç¹ã®åº§æšãåŸãããããã䜿çšããŠæç»ããŸãã
ã³ãŒãå®è£
äžèšã®æ¹æ³ã䜿çšããŠãã€ãã©ã€ã³ãå®è£
ããã¯ã€ã€ãã¬ãŒã ã¢ãŒãã§ã¬ã³ããªã³ã°ãå®è¡ããïŒã€ãŸããé ç¹ãç·ã§åçŽã«æ¥ç¶ããïŒã³ãŒãã®äŸã次ã«ç€ºããŸãã ãŸãããªããžã§ã¯ãã¯ãé ç¹ã®ã»ãããšããã®ããªãŽã³ãæ§æããé ç¹ïŒé¢ïŒã®ã€ã³ããã¯ã¹ã®ã»ããã«ãã£ãŠèšè¿°ãããããšãæå³ããŸãã
é衚瀺ã®ããã¹ã void pipeline::draw_mesh( std::shared_ptr<mesh const> mesh, vector3 const& position, vector3 const& rotation, camera const& camera, bitmap_painter& painter) const { matrix4x4 const local_to_world_transform{ matrix4x4::rotation_around_x_axis(rotation.x) * matrix4x4::rotation_around_y_axis(rotation.y) * matrix4x4::rotation_around_z_axis(rotation.z) * matrix4x4::translation(position.x, position.y, position.z)}; matrix4x4 const camera_rotation{ camera.get_right().x, camera.get_up().x, camera.get_forward().x, 0.0f, camera.get_right().y, camera.get_up().y, camera.get_forward().y, 0.0f, camera.get_right().z, camera.get_up().z, camera.get_forward().z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; matrix4x4 const camera_translation{ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, -camera.get_position().x, -camera.get_position().y, -camera.get_position().z, 1.0f}; matrix4x4 const world_to_camera_transform{camera_translation * camera_rotation}; float const projection_plane_z{1.0f}; float const near{camera.get_near_plane_z()}; float const far{camera.get_far_plane_z()}; float const right{std::tan(camera.get_horizontal_fov() / 2.0f) * projection_plane_z}; float const left{-right}; float const top{std::tan(camera.get_vertical_fov() / 2.0f) * projection_plane_z}; float const bottom{-top}; matrix4x4 const camera_to_clip_transform{ 2.0f * projection_plane_z / (right - left), 0.0f, 0.0f, 0.0f, 0.0f, 2.0f * projection_plane_z / (top - bottom), 0.0f, 0.0f, (left + right) / (left - right), (bottom + top) / (bottom - top), (far + near) / (far - near), 1.0f, 0.0f, 0.0f, -2.0f * near * far / (far - near), 0.0f}; matrix4x4 const local_to_clip_transform{ local_to_world_transform * world_to_camera_transform * camera_to_clip_transform}; std::vector<vector4> transformed_vertices; for (vector3 const& v : mesh->get_vertices()) { vector4 v_transformed{vector4{vx, vy, vz, 1.0f} * local_to_clip_transform}; if ((v_transformed.x > v_transformed.w) || (v_transformed.x < -v_transformed.w)) { mark_vector4_as_clipped(v_transformed); } else if ((v_transformed.y > v_transformed.w) || (v_transformed.y < -v_transformed.w)) { mark_vector4_as_clipped(v_transformed); } else if ((v_transformed.z > v_transformed.w) || (v_transformed.z < -v_transformed.w)) { mark_vector4_as_clipped(v_transformed); } transformed_vertices.push_back(v_transformed); } float const width{static_cast<float>(painter.get_bitmap_width())}; float const height{static_cast<float>(painter.get_bitmap_height())}; matrix4x4 const ndc_to_screen{ width / 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, -height / 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, width / 2.0f, height / 2.0f, 0.0f, 1.0f}; for (vector4& v : transformed_vertices) { if (is_vector4_marked_as_clipped(v)) { continue; } float const w_reciprocal{1.0f / vw}; vx *= w_reciprocal; vy *= w_reciprocal; vz *= w_reciprocal; vw = 1.0f; v = v * ndc_to_screen; } for (face const& f : mesh->get_faces()) { vector4 const& v1{transformed_vertices[f.index1]}; vector4 const& v2{transformed_vertices[f.index2]}; vector4 const& v3{transformed_vertices[f.index3]}; bool const v1_clipped{is_vector4_marked_as_clipped(v1)}; bool const v2_clipped{is_vector4_marked_as_clipped(v2)}; bool const v3_clipped{is_vector4_marked_as_clipped(v3)}; if (!v1_clipped && !v2_clipped) { painter.draw_line( point2d{static_cast<unsigned int>(v1.x), static_cast<unsigned int>(v1.y)}, point2d{static_cast<unsigned int>(v2.x), static_cast<unsigned int>(v2.y)}, color{255, 255, 255}); } if (!v3_clipped && !v2_clipped) { painter.draw_line( point2d{static_cast<unsigned int>(v2.x), static_cast<unsigned int>(v2.y)}, point2d{static_cast<unsigned int>(v3.x), static_cast<unsigned int>(v3.y)}, color{255, 255, 255}); } if (!v1_clipped && !v3_clipped) { painter.draw_line( point2d{static_cast<unsigned int>(v3.x), static_cast<unsigned int>(v3.y)}, point2d{static_cast<unsigned int>(v1.x), static_cast<unsigned int>(v1.y)}, color{255, 255, 255}); } } }
SDL2ã®å®è£
äŸ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãSDL2ã䜿çšããŠã¬ã³ããªã³ã°ãå®è£
ããæ¹æ³ã«ã€ããŠç°¡åã«èª¬æããŸãã
åæåããã¯ã¹ãã£äœæ
æåã®æ¹æ³ã¯ããã¡ãããã©ã€ãã©ãªã®åæåãšãŠã£ã³ããŠã®äœæã§ãã SDLããã°ã©ãã£ãã¯ã®ã¿ãå¿
èŠãªå Žåã¯ã
SDL_INIT_VIDEOãã©ã°ã§åæåã§ããŸãã
é衚瀺ã®ããã¹ã if (SDL_Init(SDL_INIT_VIDEO) < 0) { throw std::runtime_error(SDL_GetError()); } m_window = SDL_CreateWindow( "lantern", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_SHOWN); if (m_window == nullptr) { throw std::runtime_error(SDL_GetError()); } m_renderer = SDL_CreateRenderer(m_window, -1, SDL_RENDERER_ACCELERATED); if (m_renderer == nullptr) { throw std::runtime_error(SDL_GetError()); }
次ã«ãæç»ãããã¯ã¹ãã£ãäœæããŸãã
ARGB8888圢åŒã䜿çšããŸããããã¯ããã¯ã¹ãã£ã®åãã¯ã»ã«ã«4ãã€ããå²ãåœãŠãããããšãæå³ããŸããRGBãã£ã³ãã«ã«3ãã€ããã¢ã«ãã¡ãã£ã³ãã«ã«1ãã€ãã§ãã
é衚瀺ã®ããã¹ã m_target_texture = SDL_CreateTexture( m_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, width, height); if (m_target_texture == nullptr) { throw std::runtime_error(SDL_GetError()); }
ã¢ããªã±ãŒã·ã§ã³ã®çµäºæã«SDLãšããããååŸãããã¹ãŠã®å€æ°ããã¯ãªã¢ãããããšãå¿ããªãã§ãã ããã
é衚瀺ã®ããã¹ã if (m_target_texture != nullptr) { SDL_DestroyTexture(m_target_texture); m_target_texture = nullptr; } if (m_renderer != nullptr) { SDL_DestroyRenderer(m_renderer); m_renderer = nullptr; } if (m_window != nullptr) { SDL_DestroyWindow(m_window); m_window = nullptr; } SDL_Quit();
æç»ãç»é¢ã«è¡šç€º
SDL_UpdateTextureã䜿çšããŠãã¯ã¹ãã£ãæŽæ°ãããããç»é¢ã«è¡šç€ºã§ããŸãã ãã®é¢æ°ã¯ããšãããã次ã®ãã©ã¡ãŒã¿ãŒãåãå
¥ããŸãã
- ããŒã¿ã¯ãã€ãã®é
åã§ã察å¿ããå€ãæã€ãã¯ã»ã«ã®é
åã§ã
- ç»åã®1è¡ã®ãã€ãæ°ïŒãããïŒã¯ããã¯ã»ã«æ°ã«4ãæããå€ãšããŠèšç®ãããŸãïŒåœ¢åŒãARGB8888ã§ããããïŒ
æç»æ©èœããã€ãã®é
åã§è¡šããããã¯ã¹ãã£ã«åé¢ããå¥ã®ã¯ã©ã¹ã«ããããšã¯è«ççã§ãã é
åã«ã¡ã¢ãªãå²ãåœãŠããã¯ã¹ãã£ãã¯ãªã¢ãããã¯ã»ã«ãšã©ã€ã³ãæç»ããŸãã ãã¯ã»ã«æç»ã¯æ¬¡ã®ããã«å®è¡ã§ããŸãïŒãã€ãé ã¯
SDL_BYTEORDERã«ãã£ãŠç°ãªã
ãŸã ïŒ
é衚瀺ã®ããã¹ã void bitmap_painter::draw_pixel(point2d const& point, color const& c) { unsigned int const pixel_first_byte_index{m_pitch * point.y + point.x * 4}; #if SDL_BYTEORDER == SDL_BIG_ENDIAN m_data[pixel_first_byte_index + 0] = cb; m_data[pixel_first_byte_index + 1] = cg; m_data[pixel_first_byte_index + 2] = cr;
ç·ã®æç»ã¯ãããšãã°
Bresenhamã¢ã«ãŽãªãºã ã«åŸã£ãŠå®è£
ã§ããŸãã
SDL_UpdateTextureã䜿çšããåŸããã¯ã¹ãã£ã
SDL_Rendererã«ã³ããŒãã
SDL_RenderPresentã䜿çšããŠè¡šç€ºããå¿
èŠããããŸãã ãã¹ãŠäžç·ã«ïŒ
é衚瀺ã®ããã¹ã SDL_UpdateTexture(m_target_texture, nullptr, m_painter.get_data(), m_painter.get_pitch()); SDL_RenderCopy(m_renderer, m_target_texture, nullptr, nullptr); SDL_RenderPresent(m_renderer);
以äžã§ãã ãããžã§ã¯ããžã®ãªã³ã¯ïŒ
https :
//github.com/loreglean/lantern