ð ææ ã®ç«äœå²åŠã¢ãã« â çäœãšããŠã®å¿ãšæµåååŠ
ç§ãã¡ããææ
ããšåŒã¶ãã®ã¯ãåãªãç¹ãç·ã§è¡šãããã®ã§ã¯ãããŸãããåæå楜ãå®å¿ãäžå®ãåžæãèè€ã¯ãç§ãã¡ã®å
åŽã§è€éã«çµ¡ã¿åãã瀟äŒãæŽå²ãæåã®äžã§åŸªç°ããŠããŸãã
ããã§ã¯ãææ
ãç«äœçã«æããå²åŠã¢ãã«ã玹ä»ãããã®æ°åŠçã»å¿çåŠçæå³ãèå¯ããŸãã
1. ææ ã¯çäœã§ãã
ææ ã¯å€å±€çã«åºããçäœãšããŠæããããã
å åŽã»ã©å人çã»æ¬èœçãå€åŽã»ã©ç€ŸäŒçã»ææçã
æ å ±ã»ææ ã»è¡åãçäœå ã§åŸªç°ããçµ¶ããå€åããã
å¿ã®äœçœ®ãç€ºãæºããç¹ã¯ãåžžã«æ¯åããŠããããã®ç¹ã®é£éãææ ã®çæã»æ¶æ» ãçãã
å¿çåŠçã«ã¯ããã®æ¯åã¯ç¥çµæŽ»åããã«ã¢ã³ãèšæ¶ã®åå¿ãã¿ãŒã³ãšå¯Ÿå¿ãããšèããããŸããæ°åŠçã«ã¯ã倿¬¡å 空éäžã®ç¹ã®éåãšããŠã¢ãã«åã§ããç¹ã®äœçœ®ãé床ãå±€éã®çžäºäœçšã§ææ ã®ç¶æ ãå®éåå¯èœã§ãã
2. 4å±€æ§é ãšææ ã®çžè»¢ç§»
ææ çäœã¯ãå åŽããå€åŽãžåãã£ãŠ4å±€ã«åããããããããçžè»¢ç§»ã®ç¶æ ãšå¯Ÿå¿ããŸãã
æ žå±€ïŒå人ã»å äœïŒ
å äœã®ç¶æ ïŒèŒãã»èªèŠã»çŽæã»æã
å æ žã®ç±ãèŒãããåäººã®æèãä»è ãžã®åœ±é¿åãçã
å²åŠçã«ã¯ãèªå·±ã®ååšããšå®å®çæèãçµã¶å±€
身äœå±€ïŒæŽå²ã»æ°äœïŒ
æ°äœã®ç¶æ ïŒèªç±ã»åµé ã»è¡šçŸ
éå»ã®èšæ¶ãäœéšãåªä»ãšããŠææ ãæ¡æ£
å人ã®å é¢ããå€çãžãšææ ãåºãã圹å²
æèå±€ïŒç€ŸäŒã»æ¶²äœïŒ
æ¶²äœã®ç¶æ ïŒåŸªç°ã»é©å¿ã»å ±æ
瀟äŒã»æåã»çµç¹ãšã®çžäºäœçšã§ææ ãåªä»
å±€éå¹²æžã§å人ãšç€ŸäŒã®èª¿åãèè€ãçã
ææå±€ïŒææã»åºäœïŒ
åºäœã®ç¶æ ïŒå®å®ã»ç§©åºã»æå¶
瀟äŒãå¶åºŠã®å§åãå åŽã«è¿ããææ ã®åŸªç°ãäœã
æŽå²ãæåã®å¶çŽãšããŠãææ ã®æ¡æ£ã埪ç°ã«å¶éãäžãã
ãã®å¯Ÿå¿é¢ä¿ã«ãããææ ã¯å åŽããå€åŽãžãšèšåŒµã»åæããæµäœååŠãæã¡ãŸãã
3. å±€éå¹²æžãšææ çæ
å±€ã®å¢çã§ã¯ãç°ãªãå±€ã®ãšãã«ã®ãŒãå¹²æžãã
æ°ããææ ã®ç¹ãçãŸããããå€ãç¹ãæ¶ããããã
æ žå±€ã®èŒããæèå±€ã»èº«äœå±€ãšå¹²æžãããšå²åŠçã»åµé çææ ãçãŸãã
ææå±€ã®å§åãå åŽã«æ²éãããšãäžå®ãåŠæ ãè¡åå¶çŽãšããŠçŸãã
ç¹ã®æ¯åã»å ±é³Žã»å¹²æžãé£éããããšã§ãæºããçäœãšããŠã®ãããããã圢æããã
å¿çåŠçã«ã¯ãããã¯å人ã®èªç¥ãšæ åã®çžäºäœçšã瀟äŒçãã£ãŒãããã¯ãã¹ãã¬ã¹åå¿ãšããŠçè§£ã§ããŸããæ°åŠçã«ã¯ãå€å±€ç©ºéã§ã®éç·åœ¢çžäºäœçšãšããŠã¢ãã«åå¯èœã§ãã
4. ææ ã®åŸªç° â æµåååŠãšããŠã®å¿
æ žå±€ã®å äœã®èŒããã身äœå±€ã»æèå±€ãéããŠè¡åãæåã«åœ±é¿
ææå±€ã®å§åãå åŽã«æ»ããæ°ããªææ ã®ç¹ãçã
ãã®åŸªç°ã«ãããææ ã¯çæã»æ¶æ» ã»å ±é³Žããå人ã»ç€ŸäŒã»æŽå²ã»ææã®éã§æµåãã
æµåååŠçèŠç¹ã§ã¯ãææ ã¯ãšãã«ã®ãŒã®åŸªç°ç³»ãšããŠãå人ãšç€ŸäŒãçµã¶ãããã¯ãŒã¯ã圢æãã
5. çµè«
ææ ã¯å€å±€çã»åçã»çžäºäœçšçãªçŸè±¡ã§ãã
å äœïŒå人ã®èŒããç©èªã人éé¢ä¿ã®ååŠãäœã
å±€éå¹²æžã»åŸªç°ã®çè§£ã«ãããå¿çæåã»æåæåã»ç©èªçæãçµ±åçã«è¡šçŸã§ãã
æ°åŠçã«ã¯ãç¹ã®äœçœ®ã»éåºŠã»æ¯åã»å¹²æžãã¢ãã«åããããšã§ãææ ã®æµããå®éåå¯èœ
å²åŠçã«ã¯ãèªå·±ãšä»è ãå人ãšç€ŸäŒãæŽå²ãšææãçµã¶æèã®ç«äœãšããŠçè§£ã§ãã
ð¡ åµäœã»å®è·µãžã®å¿çš
ãã®ã¢ãã«ã¯ãå°èª¬ãç©èªãå¿çåŠçåæã瀟äŒãæåã®ç ç©¶ã«å¿çšå¯èœã§ããå人ã®ãæºããç¹ããæãããšã§ããã£ã©ã¯ã¿ãŒã®å¿çã人éé¢ä¿ã瀟äŒç圱é¿ãŸã§çµ±åçã«å¯èŠåã§ããŸãã
ð¡ ææ çäœã¢ãã«ã®æ°åŠçã»ç©ççèå¯ïŒãªãã±ïŒ
1. ææ çäœãæµäœååŠçã«èãã
ææ ã®åŸªç°ã¯ãæµäœã®åãããšäŒŒãŠãã
æ žå±€ïŒå äœïŒ â æ°äœçã«æ¡æ£ã»è¡šçŸã»èŒã
身äœå±€ïŒæŽå²ïŒ â æ°äœã®ããã«èªç±ã«æ¡æ£ãç¹ã®æ¯åãåºãã
æèå±€ïŒç€ŸäŒïŒ â æ¶²äœç埪ç°ã»å ±æã»åç
ææå±€ïŒææïŒ â åºäœçã»ç§©åºã»æå¶ã埪ç°ã¯ãã£ãã
å¢çã§ã®å¹²æžã¯ãä¹±æµçŸè±¡ãã«äŒŒã
ç°ãªãå±€ã®é床差ãå§åå·®ããæžŠãæ°ããç¹ã®çæã»æ¶å€±ãšããŠè¡šãã
æ°åŠçã¢ãã«
ãããšâã¹ããŒã¯ã¹æ¹çšåŒãé£ç¶äœååŠã®æ¹çšåŒã§ãç¹ã®å¯åºŠã»é床ã»å§åã»æµéãå®çŸ©
åå±€ãç°ãªãç²åºŠã»å¯åºŠã®æµäœãšããŠæ±ãããšã§ã埪ç°ãå¹²æžãã·ãã¥ã¬ãŒã·ã§ã³å¯èœ
2. å±€ããšã®ãµã€ã¯ã«é床ã®éã
å äœïŒå人ïŒ
å æ žã®èŒããçŽæã¯ãç¥çµæŽ»åãç¬æã®ææ å€åã«å¯Ÿå¿
ãµã€ã¯ã«ã¯çããé«éã§æ¯åã»æ¡æ£
æ°äœïŒèº«äœã»æŽå²ïŒ
èšæ¶ãäœéšã®æ¡æ£ã¯å äœããå°ãé ã
ç¹ã®æ¯åã»æ¡æ£ãåºç¯å²ã«åœ±é¿
æ¶²äœïŒæèã»ç€ŸäŒïŒ
瀟äŒçé©å¿ãå ±æã¯ããã«ãã£ãã
åšå²ã®ä»è ãçµç¹ã®åœ±é¿ãåãã€ã€åŸªç°
åºäœïŒææïŒ
ææã»å¶åºŠã»æåã®å§åã¯æãé ãå€å
埪ç°ã¯é·åšæã§å®å®æ§ã»ç§©åºã圢æ
ãŸãšãããšãå äœãæ©ãå転ããããšã§å³æçãªåœ±é¿ãäœããåºäœã¯ãã£ããåãããšã§å šäœã®ç§©åºãä¿ã€ã
ãã®é床差ããå±€éå¹²æžã»æµåååŠç埪ç°ã®åæ ãçãã
3. ææ ã®éåå ŽãšããŠã®å¯èŠå
å äœïŒå人ã®èŒãã¯ãåšå²ã«åŒåã»åœ±é¿åãçã
æ³åçã«ãä»è ã瀟äŒã®å±€ã«åœ±é¿
éåå Žã®ããã³ã·ã£ã«ãšããŠç¹ãé 眮ãããšãç¹ãéãŸããããé åãæ¡æ£é åãå¯èŠåã§ãã
å±€éå¹²æžã¯ãéåå Žã®éãªãåãã»æœ®æ±å¹æã«é¡äŒŒ
é«éãªå äœã®ç¹ãåšå²ã®æ¶²äœãæ°äœãåŒãå¯ããã
åºäœå±€ã¯éã質éãšããŠã埪ç°ãé ãå®å®åã
4. å¯èŠåã®å ·äœçã¢ã€ãã¢
çäœ3Dã¢ãã«
å±€ããšã«è²åãïŒæ žïŒé»è²å äœã身äœïŒéæ°äœãæèïŒç·æ¶²äœãææïŒç°åºäœïŒ
ç¹ãç²åãšããŠé 眮ããé床差ãèšå®
æµäœã·ãã¥ã¬ãŒã·ã§ã³
åå±€ãç°ãªãç²åºŠã®æµäœãšããŠæµã
å¢çã§ã®å¹²æžãæžŠã»æ³¡ã®çæãšããŠè¡šçŸ
éåå Žãããã³ã°
å äœã®ç¹ãéåæºãä»ã®å±€ã®ç¹ãç²åãšããŠæ£åž
ç¹ã®ç§»åã»éçµã»å ±é³Žãè»éãšããŠå¯èŠå
ãµã€ã¯ã«ã®æéã¹ã±ãŒã«
å äœïŒ1ãæ°ç§åäœã®é«éæ¯å
æ°äœïŒæ°ç§ãæ°åç§åäœ
æ¶²äœïŒæ°ååäœ
åºäœïŒæ°æéãæ°æ¥åäœ
é床差ãå¯èŠåããããšã§ãå±€éå¹²æžã埪ç°ã®ãã€ããã¯ã¹ãçŽæçã«çè§£å¯èœ
5. èå¯
ãã®ã¢ãã«ã¯ãææ ãå²åŠçãªååšãšããŠçè§£ããã ãã§ãªããæ°åŠçã»ç©ççã«å¯èŠåå¯èœã§ãã
æµäœååŠãšéåå Žã®æŠå¿µãçšããããšã§ãææ ã®åŸªç°ãå ±é³Žãå¹²æžã®ãã€ããã¯ã¹ãçŽæçã«æãããã
å äœã®é«éæ¯åãšåºäœã®é ããµã€ã¯ã«ããææ ã®å€å±€çãã©ã³ã¹ãçã¿åºã
åµäœã»å¿çåŠã»ç€ŸäŒç§åŠã»ã²ãŒã ãã¶ã€ã³ãªã©ãå¹ åºãå¿çšå¯èœãªã¢ãã«ã§ãã
ð ææ ã®ç«äœå²åŠã¢ãã« â çäœãšããŠã®å¿ïŒæ°åŠçå¯èŠåçïŒ
1. ææ ãçäœãšããŠæãã
ææ ã¯ç¹ã§ãç·ã§ããªããçäœãã®ããã«å€å±€çã«ååšãã
çäœã®äžå¿ã«ãæ žïŒå人ïŒãããã®åšå²ã«ã身äœïŒæŽå²ïŒããæèïŒç€ŸäŒïŒããææïŒå¶åºŠïŒãã®å±€ãåºãã
çäœå ã®åå±€ã«ã¯ãçŸåšã®å¿ã®äœçœ®ãç€ºãæºããç¹ãååš
ç¹ã¯åžžã«æ¯åããå±€ããŸããã§å ±é³Žããããšã§ææ ãçãŸãã
2. ææ ã®å±€ãšçžè»¢ç§»
ææ ã¯ç©è³ªã®ç¶æ ã®ããã«çžè»¢ç§»ãã
åºäœïŒææå±€ïŒïŒå®å®ã»ç§©åºã»æå¶ãå€åã¯é ã
æ¶²äœïŒç€ŸäŒå±€ïŒïŒå ±æã»é©å¿ã»åŸªç°ãå€åã¯äžçšåºŠ
æ°äœïŒèº«äœå±€ïŒïŒèªç±ã»æ¡æ£ã»è¡šçŸãå€åã¯éã
å äœïŒåäººå±€ã»æ žïŒïŒçŽæã»æãã»èŒããå€åã¯æãéã
åå±€ã®é床差ããç¹ã®æ¯åãšå±€éå¹²æžãçã¿ãææ ã®åŸªç°ãå ±é³Žãäœã
3. çäœå ã®ç¹ã®éåïŒããã¹ãåŒïŒ
ç¹ i ã®äœçœ® r_i(t) ã¯ä»¥äžã®ããã«è¡šçŸå¯èœïŒ
r_i'' = -k_i * (r_i - r0) - γ_i * r_i' + F_ij
r_i'' ïŒå é床ïŒç¹ã®æºãã®åŒ·ãïŒ
k_i ïŒå åã埩å åïŒå®å®åºŠïŒ
γ_i ïŒæžè¡°ä¿æ°ïŒæµæã»åºäœåã®åºŠåãïŒ
F_ij ïŒä»å±€ã»åå±€ããã®å¹²æžå
å äœå±€ã¯ k_i å°ãγ_i å° â é«éæ¯å
åºäœå±€ã¯ k_i 倧ãγ_i 倧 â äœéæ¯å
4. æµäœååŠçã¢ãã«ïŒããã¹ãåŒïŒ
ææ ãå±€ããšã«æµäœãšããŠæ±ããšã次ã®åŒã§è¡šçŸå¯èœïŒ
Ï * (v' + (v ã» â)v) = -âp + ÎŒ â^2 v + f_interaction
Ï ïŒææ å¯åºŠïŒç¹ã®å¯åºŠïŒ
v ïŒéåºŠå ŽïŒç¹ã®ç§»åé床ïŒ
p ïŒå§åïŒææ ã®å çã»å€çå§åïŒ
ÎŒ ïŒå±€ã®ç²åºŠïŒæµåæ§ïŒ
f_interaction ïŒä»å±€ã»ä»ç¹ããã®å¹²æžå
å äœã¯ ÎŒ å° â æµåéã
åºäœã¯ ÎŒ 倧 â æµåé ã
5. éåå Žã¢ãã«ïŒåŒãå¯ãã»å ±é³ŽïŒ
å äœã®èŒãã¯ãåšå²ã®ç¹ã«åŒåãšããŠäœçšããïŒ
F_ij = G * M_i * M_j / |r_i - r_j|^3 * (r_j - r_i)
M_i ïŒç¹ã®ãææ è³ªéã
G ïŒåŒåã¹ã±ãŒã«ïŒææ ã®åœ±é¿åïŒ
ç¹ã®éãŸããæ¡æ£ãå±€éå¹²æžãå¯èŠåå¯èœ
6. çžè»¢ç§»ç¶æ ã®å€å
ç¶æ 颿° phi_i(t) ã§ææ ã®çžã衚çŸïŒ
åºäœïŒphi_i = 0
æ¶²äœïŒphi_i = 1
æ°äœïŒphi_i = 2
å äœïŒphi_i = 3
phi_i ã®å€åã¯ã屿çãªå¿ççæž©åºŠ T_iïŒæ ç±åºŠïŒãå§å P_iïŒç€ŸäŒçå¶çŽïŒã§å¶åŸ¡ïŒ
phi_i' = f(T_i, P_i)
7. ãµã€ã¯ã«é床ã®å·®ïŒå±€ããšã®æ¯ååšæïŒ
å äœïŒåäººå±€ã»æ žïŒïŒæé
æ°äœïŒèº«äœå±€ã»æŽå²ïŒïŒéã
æ¶²äœïŒç€ŸäŒå±€ã»æèïŒïŒäžçšåºŠ
åºäœïŒææå±€ã»å¶åºŠïŒïŒæãé ã
ãã®é床差ããææ ã®å±€éå¹²æžã埪ç°ã»å ±é³Žãçã¿åºã
8. å¯èŠåã®ã¢ã€ãã¢
3Dç²åã¢ãã«ïŒå±€ããšã«è²åããé床差ãèšå®
æµäœã·ãã¥ã¬ãŒã·ã§ã³ïŒå±€ããšã«ç²åºŠãå€ããŠåŸªç°ã»å¹²æžã衚çŸ
éåå Žãããã³ã°ïŒå äœã®ç¹ãéåæºãšããŠä»ç¹ãåŒãå¯ã
æ¯ååšæã®ã¢ãã¡ãŒã·ã§ã³ïŒå äœã¯é«éãåºäœã¯äœéã§åŸªç°
9. ãŸãšã
ææ ã¯çäœã»å€å±€ã»é床差ã»çžè»¢ç§»ãæã€ç«äœççŸè±¡
æµäœååŠãéåå Žãæ¯ååšæãçµã¿åããããšãææ ã®åŸªç°ã»å ±é³Žã»å¹²æžãçŽæçã«å¯èŠåå¯èœ
å äœã®é«éæ¯åãšåºäœã®äœé埪ç°ããææ ã®å€å±€çãã©ã³ã¹ãçã¿åºã
å²åŠççè§£ãå¿çåŠåæãåµäœè¡šçŸãªã©ã倿¹é¢ã§å¿çšã§ããã¢ãã«
ð å人çäœãšææ ã®éå±€G â çµéšéãšæ»çã«ããææ 埪ç°ã¢ãã«
ç§ãã¡ã®ææ
ã¯ãåãªãç¬éã®æ°åãç·åœ¢çãªåå¿ã§ã¯ãªããç«äœçã§å€å±€çã«å転ããçäœãšããŠçè§£ã§ããŸãã
ãã®ã¢ãã«ã§ã¯ãå人ã®å¿ã¯å
äœïŒæ žïŒããåäœïŒææå±€ïŒãŸã§ã®4å±€ã§æ§æãããåå±€ãçµéšéïŒåã¿ïŒãšæ»çæéãæã¡ãªãããäžäžã®å±€ãå€éšç°å¢ã®GåŒåïŒææ
çéåïŒãšåæ¹åã§åœ±é¿ãåããšèããŸãã
1. å人çäœã®4å±€æ§é ãšGåŒå
å äœïŒåäººæ žïŒG
æãé«éã«æºããå±€
ç¬éçãªçŽæã»æææ±ºå®ã»åäººã®æ åã«å¯Ÿå¿
圱é¿ãåãã察象ïŒå人æ°äœG
圱é¿ãäžãã察象ïŒå人æ°äœG
å±€åã¿ã¯èããæºããå³åº§ã«å€å±€ãžäŒãã
æ°äœïŒå人身äœå±€ïŒG
èº«äœæèŠãç¿æ £çè¡åã«å¯Ÿå¿
圱é¿ãåãã察象ïŒå äœGãæ¶²äœG
圱é¿ãäžãã察象ïŒå äœGãæ¶²äœG
å±€åã¿ã¯äžçšåºŠãæ»çãã€ã€å€å±€ã«åœ±é¿
æ¶²äœïŒå人瀟äŒå±€ïŒG
瀟äŒçå ±é³Žã䟡å€èгãéå£ç¥ãšã®é¢ä¿ã«å¯Ÿå¿
圱é¿ãåããå¯Ÿè±¡ïŒæ°äœGãåäœG
圱é¿ãäžããå¯Ÿè±¡ïŒæ°äœGãåäœG
å±€åã¿ã¯æ¯èŒçåãã瀟äŒççµéšãåžåããªãã圱é¿ãå€éšã«è¿ã
åäœïŒå人ææå±€ïŒG
æåãå¶åºŠãææç䟡å€èгã«å¯Ÿå¿
圱é¿ãåãã察象ïŒå€éšåäœG
圱é¿ãäžãã察象ïŒå€éšåäœG
å±€åã¿ã¯æãåããé·æçã§å®å®ããææ éåå Žã圢æ
åå±€ã¯äžäžã®å±€ã«å¯ŸããŠåæ¹åã«åœ±é¿ãåããå äœã¯å人æ°äœã®æºããå³åº§ã«åãåããéã«åäœã¯å€éšææGã®å€åããã£ããåžåããã
2. çµéšéãšå±€åã¿
åå±€ã®åã¿ã¯ãã®å±€ã®çµéšéã衚ã
åã¿ã倧ããå±€ã»ã©ãææ ã¯å±€å ã§é·ãæ»çãã
åã¿ãå°ããå±€ã»ã©ãææ ã¯è¿ éã«äžå±€ãäžå±€ãžäŒæãã
ææ ã®äŒææé Ît ã¯ä»¥äžã®ããã«è¡šçŸã§ããïŒæç« çïŒïŒ
Ît â å±€ã®åã¿ / ææ ã®é床
å äœïŒèãé«é â å³åº§ã«æ°äœå±€ãžäŒæ
æ°äœïŒäžçšåºŠ â æ°äœå ã§åŠçãã€ã€æ¶²äœå±€ã«æ³¢å
æ¶²äœïŒåã â 瀟äŒççµéšãåžåããŠããåäœå±€ãž
åäœïŒæãåãäœé â å€éšGãšã®èª¿åãå§åãåããŠå人ã«åæ
ãã®Îtã«ãã£ãŠãææ ã¯å±€å ã§æ¶åãããããæ¬¡ã®å±€ã«åœ±é¿ãäžããããæ±ºãŸãã
3. éå±€çGåŒåé£éãšæ»ç
GåŒåïŒéåå ŽãšããŠã®ææ ïŒã¯åå±€éã§åæ¹åã«äœçš
å äœG â å人æ°äœG â å人液äœG â å人åäœG â å€éšåäœG
çµéšéã®å€ãåãå±€ã¯ãå€éšGãäžäœå±€ã»äžäœå±€ãšã®å ±é³Žã«å¯ŸããŠç·©è¡æã®åœ¹å²ãæãã
ææ ã¯ãå±€å æ»çãšå±€éäŒæã®é£éã«ãã£ãŠçäœå ã§åŸªç°ã»å ±é³Žã»çžè»¢ç§»ãç¹°ãè¿ã
äŸïŒåäººæ žã®çŽæïŒå äœGïŒãèº«äœæèŠïŒæ°äœGïŒã«åœ±é¿ â 瀟äŒçè¡åïŒæ¶²äœGïŒãåªä» â ææç䟡å€èгïŒåäœGïŒã«åæ
éã«ãæåå§åïŒå€éšåäœGïŒãåäœå±€ãéãæ¶²äœGã»æ°äœGã»å äœGã«åœ±é¿ â åäººã®ææãææ ãå€åãã
4. å²åŠçã»å¿çåŠçæå³
ææ ã¯åç¬ã§ååšãããå±€éé£éãšå€éšGãšã®çžäºäœçšã«ãã£ãŠçãŸãã
å äœã¯ææã§çåšæãåäœå±€ã¯å®å®ã§é·åšæ
çµéšéïŒåã¿ãå€ãå±€ã¯ãææ ãåžåã»çæããã€ã€æ¬¡ã®å±€ã«äŒæ
åæ¹åé£éã«ãããå人ã¯å çææ ãšç€ŸäŒã»æåãšã®èª¿åã»æ©æŠãçµ¶ããçµéš
5. æ°åŠçã»æµäœååŠç瀺åïŒæç« çïŒ
ææ ã®åŸªç°ã¯æµäœååŠã§è¡šçŸå¯èœ
å äœâæ°äœâæ¶²äœâåäœã®éå±€ãæµãããææ æµã
åã¿ã»çµéšéã«å¿ããŠé床ãå€å â ãµã€ã¯ã«ãå±€ããšã«ç°ãªã
GåŒåã¹ã±ãŒã«ã¯ãçµéšéãšå€éšææ ãšã®çžäºäœçšã§å€å
å±€ã®åã¿ã倧ããã»ã©ãå€éšGã®åœ±é¿ã¯ç·©ãã
å äœã¯é«éã»ææ â åäœã¯äœéã»å®å®
çžäºäœçšã«ãã£ãŠææ çã¯åžžã«ãæºããç¹ãã®é£éãšããŠåŸªç°ããçäœå šäœãå ±é³Žãã
ãã®ã¢ãã«ã«ãããåäººã®ææ 埪ç°ã瀟äŒçå ±é³Žãæåãšã®èª¿åãç«äœçã«çè§£ã§ãã
ð¡ ãŸãšã
å人çäœã¯å äœã»æ°äœã»æ¶²äœã»åäœã®4å±€ã§æ§æ
åå±€ã¯äžäžã®å±€ããã³å€éšGã«å¯ŸããŠåæ¹åã«åœ±é¿
å±€åã¿ïŒçµéšéïŒææ ã®æ»çæéã§ãå±€å æ¶åãšå±€éäŒæã®æ¯çãæ±ºå®
å äœã¯é«éã§ææãåäœã¯äœéã§å®å®
éå±€çGåŒåãšå±€åã¿ã«ãããææ ã¯çäœå ã§åŸªç°ã»å ±é³Žã»çžè»¢ç§»ãç¹°ãè¿ã
ãã®çµ±åã¢ãã«ã¯ãææ ã®ç¬çºåãšæ·±ã¿ãå人ã»ç€ŸäŒã»ææãšã®é¢ä¿ãåæã«å¯èŠåããæ°ããå²åŠçã»å¿çåŠçãã¬ãŒã ã¯ãŒã¯ã§ãã
ð æšå¥šããã·ã¥ã¿ã°
#ææ
ã®å²åŠ
#å人çäœ
#éå±€GåŒå
#ææ
埪ç°ã¢ãã«
#çµéšéãšæ»ç
#å¿çåŠ
#å²åŠ
#瀟äŒå¿çåŠ
#æåãšææ
#å
é¢å¯èŠå
#ææ
çžè»¢ç§»
#èªå·±çè§£
#æµäœååŠçææ
#åäººãšææ
#ææ
ã®éåå Ž
æåã®ãœãŒã¹ã³ãŒãå
ãªããã¡ãã£ãšéãã

Geminiã§å®è¡
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ææ
çäœæ§é ã®å¯èŠå - ç²åç</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<style>
body { margin: 0; overflow: hidden; font-family: 'Inter', sans-serif; background-color: #1a1a2e; color: #e5e5f7; }
#container { width: 100vw; height: 100vh; position: relative; }
#overlay {
position: absolute; top: 0; left: 0; width: 100%; padding: 1rem;
z-index: 10;
pointer-events: none;
}
.info-box {
background-color: rgba(0, 0, 0, 0.7);
padding: 0.75rem;
border-radius: 0.5rem;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
pointer-events: auto;
}
.control-panel {
position: absolute;
bottom: 1rem;
left: 50%;
transform: translateX(-50%);
background-color: rgba(0, 0, 0, 0.8);
padding: 1rem;
border-radius: 0.5rem;
pointer-events: auto;
}
</style>
</head>
<body>
<div id="container"></div>
<div id="overlay">
<div class="flex flex-col justify-start w-full">
<div class="info-box w-full md:w-1/2 lg:w-1/3">
<h1 class="text-xl font-bold mb-2 text-indigo-300">ææ
çäœã¢ãã« - åçç²åç</h1>
<p class="text-sm mb-2">
åå±€ã«1ã€ãã€ç²åãé
眮ãããææ
ã®3軞ã«åºã¥ããŠåçã«ç§»åããŸãã
</p>
<ul class="text-xs space-y-1">
<li class="text-yellow-300">â æ žå±€ (å
äœ) - æéæ¯å</li>
<li class="text-blue-300">â 身äœå±€ (æ°äœ) - éãæ¡æ£</li>
<li class="text-green-300">â æèå±€ (æ¶²äœ) - äžé埪ç°</li>
<li class="text-gray-400">â ææå±€ (åºäœ) - äœéå®å®</li>
</ul>
<div class="mt-2 text-xs">
<p class="text-cyan-300">ð å§å â æž©åºŠ â è²å€å (éâèµ€)</p>
<p class="text-purple-300">ð ææ
3軞: å¿«-äžå¿« / èŠé-é®é / æ¯é
-æåŸ</p>
</div>
</div>
</div>
</div>
<div class="control-panel">
<div class="flex gap-3 flex-wrap justify-center items-center text-sm">
<button id="toggleBtn" class="px-4 py-2 bg-blue-600 hover:bg-blue-700 rounded text-white">
âž åæ¢
</button>
<button id="resetBtn" class="px-4 py-2 bg-gray-600 hover:bg-gray-700 rounded text-white">
ð ãªã»ãã
</button>
<div class="text-white">
<span id="statsText">枩床: -- / å§å: --</span>
</div>
</div>
</div>
<script>
let scene, camera, renderer;
let layerMeshes = [];
let particles = [];
let isRunning = true;
const EMOTION_AXES = {
VALENCE: 0, // å¿«-äžå¿«
AROUSAL: 1, // èŠé-é®é
DOMINANCE: 2 // æ¯é
-æåŸ
};
const layers = [
{
radius: 2.5,
color: 0xffc107,
name: "æ žå±€ (å
äœ)",
baseSpeed: 0.15,
maxSpeed: 0.25,
updateRate: 1.0,
damping: 0.95,
stiffness: 0.08
},
{
radius: 4.5,
color: 0x64b5f6,
name: "身äœå±€ (æ°äœ)",
baseSpeed: 0.10,
maxSpeed: 0.18,
updateRate: 0.7,
damping: 0.93,
stiffness: 0.05
},
{
radius: 7.0,
color: 0x81c784,
name: "æèå±€ (æ¶²äœ)",
baseSpeed: 0.06,
maxSpeed: 0.12,
updateRate: 0.4,
damping: 0.90,
stiffness: 0.03
},
{
radius: 9.5,
color: 0x9e9e9e,
name: "ææå±€ (åºäœ)",
baseSpeed: 0.03,
maxSpeed: 0.08,
updateRate: 0.15,
damping: 0.88,
stiffness: 0.02
}
];
class Particle {
constructor(layer, index) {
this.layer = layer;
this.index = index;
// ã©ã³ãã ãªåæäœçœ®ïŒå±€ã®ååŸäžïŒ
const theta = Math.random() * Math.PI * 2;
const phi = Math.acos(2 * Math.random() - 1);
this.position = new THREE.Vector3(
layer.radius * Math.sin(phi) * Math.cos(theta),
layer.radius * Math.sin(phi) * Math.sin(theta),
layer.radius * Math.cos(phi)
);
this.velocity = new THREE.Vector3(
(Math.random() - 0.5) * layer.baseSpeed,
(Math.random() - 0.5) * layer.baseSpeed,
(Math.random() - 0.5) * layer.baseSpeed
);
// ææ
ã®3軞
this.emotion = [
Math.random() * 2 - 1,
Math.random() * 2 - 1,
Math.random() * 2 - 1
];
this.pressure = 0;
this.temperature = 0;
// Three.jsã¡ãã·ã¥ãäœæ
this.createMesh();
}
createMesh() {
const geometry = new THREE.SphereGeometry(0.3, 16, 16);
const material = new THREE.MeshBasicMaterial({
color: this.layer.color,
transparent: true,
opacity: 0.9
});
this.mesh = new THREE.Mesh(geometry, material);
this.mesh.position.copy(this.position);
scene.add(this.mesh);
}
calculatePressure(allParticles) {
let pressure = 0;
const influenceRadius = 3.0;
allParticles.forEach(other => {
if (other === this) return;
const dist = this.position.distanceTo(other.position);
if (dist < influenceRadius && dist > 0) {
pressure += (influenceRadius - dist) / influenceRadius;
}
});
this.pressure = pressure;
this.temperature = Math.max(0, this.pressure * 80);
}
update(dt, allParticles) {
if (!isRunning) return;
const layer = this.layer;
// ææ
軞ã«ããå
const emotionForce = new THREE.Vector3(
this.emotion[EMOTION_AXES.VALENCE] * 0.02,
this.emotion[EMOTION_AXES.AROUSAL] * 0.02,
this.emotion[EMOTION_AXES.DOMINANCE] * 0.02
);
// å±€ã®ååŸãç¶æãã埩å
å
const currentRadius = this.position.length();
const targetRadius = layer.radius;
const radiusDiff = targetRadius - currentRadius;
if (currentRadius > 0) {
const restoreForce = this.position.clone().normalize().multiplyScalar(radiusDiff * layer.stiffness);
this.velocity.add(restoreForce);
}
// ç±éåïŒæž©åºŠã«æ¯äŸïŒ
const thermalNoise = this.temperature / 200;
this.velocity.add(new THREE.Vector3(
(Math.random() - 0.5) * thermalNoise,
(Math.random() - 0.5) * thermalNoise,
(Math.random() - 0.5) * thermalNoise
));
// ææ
åã远å
this.velocity.add(emotionForce);
// æžè¡°
this.velocity.multiplyScalar(layer.damping);
// é床å¶é
const speed = this.velocity.length();
if (speed > layer.maxSpeed) {
this.velocity.normalize().multiplyScalar(layer.maxSpeed);
}
// äœçœ®æŽæ°
this.position.add(this.velocity.clone().multiplyScalar(layer.updateRate));
// ææ
å€ã®ç·©ãããªå€å
this.emotion[0] += (Math.random() - 0.5) * 0.02;
this.emotion[1] += (Math.random() - 0.5) * 0.02;
this.emotion[2] += (Math.random() - 0.5) * 0.02;
this.emotion = this.emotion.map(e => Math.max(-1, Math.min(1, e)));
// ã¡ãã·ã¥äœçœ®ãæŽæ°
this.mesh.position.copy(this.position);
// è²ã枩床ã«å¿ããŠå€æŽ
this.updateColor();
}
updateColor() {
const tempFactor = Math.min(1, this.temperature / 100);
// åºæ¬è²ããæž©åºŠã§èµ€ãã·ãã
const baseColor = new THREE.Color(this.layer.color);
const hotColor = new THREE.Color(0xff3333);
const finalColor = baseColor.clone().lerp(hotColor, tempFactor);
this.mesh.material.color = finalColor;
// ãµã€ãºã枩床ã§å€å
const scale = 1 + tempFactor * 0.5;
this.mesh.scale.set(scale, scale, scale);
}
}
let isDragging = false;
let previousMousePosition = { x: 0, y: 0 };
const rotationSpeed = 0.01;
function init() {
scene = new THREE.Scene();
scene.background = new THREE.Color(0x1a1a2e);
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 20;
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('container').appendChild(renderer.domElement);
const ambientLight = new THREE.AmbientLight(0x404040, 2);
scene.add(ambientLight);
setupLayerMeshes();
setupParticles();
setupMouseControls();
setupButtons();
window.addEventListener('resize', onWindowResize, false);
}
function setupLayerMeshes() {
layerMeshes.forEach(mesh => {
scene.remove(mesh);
mesh.geometry.dispose();
mesh.material.dispose();
});
layerMeshes = [];
layers.forEach(layer => {
const geometry = new THREE.IcosahedronGeometry(layer.radius, 2);
const material = new THREE.MeshBasicMaterial({
color: layer.color,
wireframe: true,
transparent: true,
opacity: 0.3,
depthWrite: false,
side: THREE.FrontSide
});
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
layerMeshes.push(mesh);
});
}
function setupParticles() {
particles.forEach(p => {
scene.remove(p.mesh);
p.mesh.geometry.dispose();
p.mesh.material.dispose();
});
particles = [];
// åå±€ã«1ã€ãã€ç²åãé
眮
layers.forEach((layer, index) => {
particles.push(new Particle(layer, index));
});
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
let lastTime = Date.now();
function animate() {
requestAnimationFrame(animate);
const now = Date.now();
const dt = Math.min((now - lastTime) / 1000, 0.1);
lastTime = now;
if (isRunning) {
// å§åèšç®
particles.forEach(p => p.calculatePressure(particles));
// ç²åæŽæ°
particles.forEach(p => p.update(dt, particles));
// çµ±èšè¡šç€º
updateStats();
}
renderer.render(scene, camera);
}
function updateStats() {
const avgTemp = particles.reduce((sum, p) => sum + p.temperature, 0) / particles.length;
const avgPress = particles.reduce((sum, p) => sum + p.pressure, 0) / particles.length;
document.getElementById('statsText').textContent =
`枩床: ${avgTemp.toFixed(1)} / å§å: ${avgPress.toFixed(2)}`;
}
function setupMouseControls() {
const container = document.getElementById('container');
const handleMove = (clientX, clientY) => {
if (!isDragging) return;
const deltaX = clientX - previousMousePosition.x;
const deltaY = clientY - previousMousePosition.y;
scene.rotation.y += deltaX * rotationSpeed;
scene.rotation.x += deltaY * rotationSpeed;
scene.rotation.x = Math.max(-Math.PI / 2, Math.min(Math.PI / 2, scene.rotation.x));
previousMousePosition.x = clientX;
previousMousePosition.y = clientY;
};
container.addEventListener('mousedown', (e) => {
isDragging = true;
previousMousePosition.x = e.clientX;
previousMousePosition.y = e.clientY;
});
container.addEventListener('mousemove', (e) => handleMove(e.clientX, e.clientY));
container.addEventListener('mouseup', () => { isDragging = false; });
container.addEventListener('mouseleave', () => { isDragging = false; });
container.addEventListener('touchstart', (e) => {
if (e.touches.length === 1) {
isDragging = true;
previousMousePosition.x = e.touches[0].clientX;
previousMousePosition.y = e.touches[0].clientY;
}
}, { passive: false });
container.addEventListener('touchmove', (e) => {
if (!isDragging || e.touches.length !== 1) return;
e.preventDefault();
handleMove(e.touches[0].clientX, e.touches[0].clientY);
}, { passive: false });
container.addEventListener('touchend', () => { isDragging = false; }, false);
}
function setupButtons() {
document.getElementById('toggleBtn').addEventListener('click', () => {
isRunning = !isRunning;
document.getElementById('toggleBtn').innerHTML = isRunning ? 'âž åæ¢' : 'â¶ åç';
});
document.getElementById('resetBtn').addEventListener('click', () => {
scene.rotation.set(0, 0, 0);
setupParticles();
});
}
window.onload = function () {
init();
animate();
}
</script>
</body>
</html>https://g.co/gemini/share/6b81cc72c32d
æ¹èšç

Geminiã§ä¿®æ£ããŠè¡šç€º
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>ææ
çäœã¢ãã«ïŒå°å¹³é¢åçºããã³ã·ã£ã«çïŒ</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<style>
/* ã°ããŒãã«ã¹ã¿ã€ã«ãšãã©ã³ã */
body {
margin: 0;
overflow: hidden;
background: #0b0b1a;
color: #e5e5f7;
font-family: 'Inter', sans-serif;
}
#container { width: 100vw; height: 100vh; }
/* ãªãŒããŒã¬ã€UIã®ã³ã³ãã */
#overlay-container {
position: absolute;
top: 0;
left: 0;
z-index: 10;
transition: transform 0.3s ease-in-out;
}
/* ãªãŒããŒã¬ã€UIæ¬äœ */
#overlay {
padding: 1rem;
color: white;
background: rgba(17, 24, 39, 0.9); /* æ¿ãèæ¯ */
border-radius: 0 0.5rem 0.5rem 0;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
max-width: 90vw;
width: 300px; /* PCã§ã®åºå®å¹
*/
}
/* é衚瀺æã®ç¶æ
*/
#overlay-container.hidden {
transform: translateX(calc(-100% + 40px)); /* ãã¿ã³å¹
ã ãæ®ããŠå·Šã«ã¹ã©ã€ã */
}
/* ãã°ã«ãã¿ã³ */
#toggle-button {
position: absolute;
right: -40px; /* ããã«ã®å€åŽã«é
眮 */
top: 0;
width: 40px;
height: 40px;
background: rgba(17, 24, 39, 0.9);
color: white;
border: none;
border-radius: 0 0.5rem 0.5rem 0;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 4px 4px 12px rgba(0, 0, 0, 0.5);
}
#toggle-button:hover { background: rgba(17, 24, 39, 1); }
/* ãã¿ã³å
±éã¹ã¿ã€ã« */
.emotion-button {
transition: all 0.2s;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
font-weight: bold;
}
.emotion-button:hover {
opacity: 0.9;
transform: translateY(-1px);
}
.emotion-button.active {
filter: brightness(1.2);
box-shadow: 0 0 15px rgba(255, 255, 255, 0.5);
}
</style>
</head>
<body>
<div id="container"></div>
<div id="overlay-container">
<button id="toggle-button" aria-expanded="true">
<span id="toggle-icon">â®</span>
</button>
<div id="overlay">
<h1 class="text-xl font-extrabold text-indigo-400">ææ
çäœã¢ãã«</h1>
<p class="text-sm mt-1 text-gray-300">
**ãå°å¹³é¢åçºããã³ã·ã£ã«çã** å
å±€ã®å°å¹³é¢ãå€å±€ã®ç²åãæŒãåºããŸãã<br>
<span class="text-xs text-gray-500">ãã©ãã°/ã¹ã¯ã€ãã§èŠç¹æäœãå¯èœã§ãã</span>
</p>
<!-- å€éšGã³ã³ãããŒã«ãã¿ã³ -->
<div class="mt-4">
<h2 class="text-md font-semibold mb-2 text-gray-100">å€éšææ
å§å (External G)</h2>
<div id="emotion-controls" class="flex flex-wrap gap-2">
<button id="joy" class="emotion-button bg-pink-500 text-white px-3 py-1 rounded-lg">å (Joy)</button>
<button id="anger" class="emotion-button bg-red-600 text-white px-3 py-1 rounded-lg">æ (Anger)</button>
<button id="sadness" class="emotion-button bg-blue-600 text-white px-3 py-1 rounded-lg">å (Sadness)</button>
<button id="calm" class="emotion-button bg-green-600 text-white px-3 py-1 rounded-lg active">楜 (Calm)</button>
</div>
</div>
<!-- ç²åç¹æ§å¡äŸ -->
<div class="mt-4 space-y-2">
<h2 class="text-md font-semibold text-gray-100">ç²åã®ç±ååŠçç¹æ§</h2>
<div class="flex items-center space-x-2 text-red-300">
<span class="font-bold w-12">ç±ãç²å:</span>
<span class="text-xs">匷ãåŒå/åŒ±ãæ¥åïŒåæåŸåïŒ</span>
</div>
<div class="flex items-center space-x-2 text-blue-300">
<span class="font-bold w-12">å·ããç²å:</span>
<span class="text-xs">匱ãåŒå/åŒ·ãæ¥åïŒæ¡æ£åŸåïŒ</span>
</div>
<div class="flex items-center space-x-2 text-green-300">
<span class="font-bold w-12">äžåºžã®ç²å:</span>
<span class="text-xs">åŒåãšæ¥åã®åè¡¡ïŒå®å®åŸåïŒ</span>
</div>
</div>
<p class="text-xs mt-3 text-yellow-300">
**ç±ååŠ:** ç²åãå¯éãããš<span class="text-white">çœãèŒãïŒé«å§ïŒ</span>ããã®**ç±**ãå
šå±€ã®å¢ç埩å
åã«åœ±é¿ããåããæŽ»çºåããŸãã
</p>
</div>
</div>
<script>
// Three.jsãšã·ãã¥ã¬ãŒã·ã§ã³ã®ã°ããŒãã«å€æ°
let scene, camera, renderer, systemCore, particles = [];
let isRunning = true;
let isDragging = false;
let previousMousePosition = { x: 0, y: 0 };
let globalNucleusHeat = 0.0; // æ žå±€ã®å¹³å枩床ïŒã°ããŒãã«G-ForceïŒ
// ç©çã·ãã¥ã¬ãŒã·ã§ã³ã®åºæ¬å®æ°
const SIMULATION_DT = 0.08;
const PARTICLE_SIZE = 0.2;
// === ç±ååŠå®æ° ===
const PRESSURE_RADIUS = 1.0;
const MAX_PRESSURE_COUNT = 3;
const HOT_COLOR = new THREE.Color(0xffffff);
const MAX_HEAT_EFFECT = 1.5;
// === å°å¹³é¢åçºå®æ° ===
const BOUNDARY_REPULSION_STRENGTH = 0.3; // å°å¹³é¢ããã®åºæ¬æ¥å匷床
const BOUNDARY_REPULSION_RANGE = 0.8; // å°å¹³é¢ã®åçºããã³ã·ã£ã«ãåãè·é¢ïŒç²ååŸã®4åïŒ
// === ç²åã®åå¥ç¹æ§å®çŸ© ===
const PARTICLE_TYPES = [
// 0: ç±ãç²å (匷ãåŒå/åŒ±ãæ¥å) - åæ/ç±
{ typeName: "Hot", attFactor: 1.5, repFactor: 0.5, jitterFactor: 1.2 },
// 1: å·ããç²å (匱ãåŒå/åŒ·ãæ¥å) - æ¡æ£/å·
{ typeName: "Cold", attFactor: 0.5, repFactor: 1.5, jitterFactor: 0.8 },
// 2: äžåºžã®ç²å (åè¡¡) - 平衡
{ typeName: "Neutral", attFactor: 1.0, repFactor: 1.0, jitterFactor: 1.0 }
];
// === ææ
çå§åã®ã°ããŒãã«ç¶æ
===
let currentEmotionPressure = 'calm';
// ææ
ããšã®å§åèšå® (1.0ãåºæ¬å€)
const EMOTION_SETTINGS = {
'joy': { friction_factor: 0.85, speed_factor: 1.3, attraction_factor: 0.9, repulsion_factor: 0.8 },
'anger': { friction_factor: 0.95, speed_factor: 1.1, attraction_factor: 0.8, repulsion_factor: 2.5 },
'sadness': { friction_factor: 1.1, speed_factor: 0.7, attraction_factor: 1.5, repulsion_factor: 0.7 },
'calm': { friction_factor: 1.0, speed_factor: 1.0, attraction_factor: 1.0, repulsion_factor: 1.0 }
};
// === çžäºäœçšå®æ° ===
const INTER_LAYER_ATTRACTION_FACTOR = 0.3;
const BASE_INTER_LAYER_REPULSION_STRENGTH = 0.02;
const BASE_EXTERNAL_G_REPULSION = 0.015;
const REPULSION_POWER = 2.5;
const REBOUND_VELOCITY_SCALE = 2.0;
// åå±€ã®åºæ¬å®çŸ©
const layers = [
// æ žå±€ (0) - å
äœ/æé
{ radius: 2.5, color: 0xffc107, name: "æ žå±€", maxSpeed: 1.0, baseFriction: 0.978, centerAttraction: 0.35, tangentialSpeed: 0.7, longRangeAttraction: 0.06, attractionRange: 3.0, restitution: 0.75, boundaryRepulsion: 0.0 }, // æ žå±€ã¯å
åŽå°å¹³é¢ãªã
// 身äœå±€ (1) - æ°äœ/æµå
{ radius: 4.5, color: 0x64b5f6, name: "身äœå±€", maxSpeed: 0.75, baseFriction: 0.98, centerAttraction: 0.20, tangentialSpeed: 0.5, longRangeAttraction: 0.04, attractionRange: 4.0, restitution: 0.55, boundaryRepulsion: 1.0 }, // 匷ãåçº
// æèå±€ (2) - æ¶²äœ/埪ç°
{ radius: 7.0, color: 0x81c784, name: "æèå±€", maxSpeed: 0.55, baseFriction: 0.983, centerAttraction: 0.12, tangentialSpeed: 0.35, longRangeAttraction: 0.03, attractionRange: 5.0, restitution: 0.35, boundaryRepulsion: 0.8 },
// ææå±€ (3) - åºäœ/å®å®
{ radius: 9.5, color: 0x9e9e9e, name: "ææå±€", maxSpeed: 0.4, baseFriction: 0.988, centerAttraction: 0.06, tangentialSpeed: 0.25, longRangeAttraction: 0.02, attractionRange: 6.0, restitution: 0.15, boundaryRepulsion: 0.6 }
];
function randomVector(scale = 1) {
return new THREE.Vector3(
(Math.random() - 0.5) * scale,
(Math.random() - 0.5) * scale,
(Math.random() - 0.5) * scale
);
}
function randomOrbitalPoint(maxR, minR = 0, tangentialSpeed) {
const r = minR + Math.random() * (maxR - minR);
const theta = Math.random() * Math.PI * 2;
const phi = Math.acos(2 * Math.random() - 1);
const position = new THREE.Vector3(
r * Math.sin(phi) * Math.cos(theta),
r * Math.sin(phi) * Math.sin(theta),
r * Math.cos(phi)
);
const radialDirection = position.clone().normalize();
let tangentialDirection = new THREE.Vector3().crossVectors(radialDirection, randomVector(1)).normalize();
const orbitalVelocity = tangentialDirection.multiplyScalar(tangentialSpeed);
const randomInitialVelocity = randomVector(tangentialSpeed * 0.3);
const velocity = orbitalVelocity.add(randomInitialVelocity);
return { position, velocity };
}
function createSphere(color, size) {
const geo = new THREE.SphereGeometry(size, 16, 16);
const mat = new THREE.MeshLambertMaterial({ color, transparent: true, opacity: 0.9, shininess: 80 });
return new THREE.Mesh(geo, mat);
}
const tempVector = new THREE.Vector3();
const tempColor = new THREE.Color();
function handleParticleCollision(p1, p2) {
if (p1.layerIndex !== p2.layerIndex) return;
const requiredDistance = PARTICLE_SIZE * 2;
const diff = p1.position.clone().sub(p2.position);
const dist = diff.length();
if (dist < requiredDistance && dist > 0.001) {
const penetrationDepth = requiredDistance - dist;
const normal = diff.normalize();
p1.position.addScaledVector(normal, penetrationDepth * 0.5);
p2.position.addScaledVector(normal, -penetrationDepth * 0.5);
const v1 = p1.velocity;
const v2 = p2.velocity;
const v1_normal = v1.dot(normal);
const v2_normal = v2.dot(normal);
const vp = (v1_normal + v2_normal) / 2;
const rest = p1.layer.restitution;
const v1f_normal = vp + (v2_normal - v1_normal) * rest * REBOUND_VELOCITY_SCALE;
const v2f_normal = vp + (v1_normal - v2_normal) * rest * REBOUND_VELOCITY_SCALE;
v1.addScaledVector(normal, v1f_normal - v1_normal);
v2.addScaledVector(normal, v2f_normal - v2_normal);
}
}
class Particle {
constructor(layer, layerIndex, j) {
this.layer = layer;
this.layerIndex = layerIndex;
this.particleIndexInLayer = j;
this.type = PARTICLE_TYPES[j % 3];
this.baseColor = new THREE.Color(layer.color);
this.temperature = 0.0;
const innerR = (layerIndex === 0) ? 0.0 : layers[layerIndex - 1].radius;
const outerR = layers[layerIndex].radius;
const initial = randomOrbitalPoint(outerR - PARTICLE_SIZE, innerR + PARTICLE_SIZE, layer.tangentialSpeed);
this.position = initial.position;
this.velocity = initial.velocity;
let initialColor = this.baseColor.clone();
if (this.type.typeName === "Hot") { initialColor.lerp(new THREE.Color(0xff8888), 0.1); }
else if (this.type.typeName === "Cold") { initialColor.lerp(new THREE.Color(0x8888ff), 0.1); }
this.mesh = createSphere(initialColor.getHex(), PARTICLE_SIZE);
this.mesh.position.copy(this.position);
systemCore.add(this.mesh);
}
update(dt, allParticles) {
const pressure = EMOTION_SETTINGS[currentEmotionPressure];
const pType = this.type;
// === 1. åçãã©ã¡ãŒã¿èª¿æŽ ===
const dynamicFriction = this.layer.baseFriction * pressure.friction_factor;
const dynamicMaxSpeed = this.layer.maxSpeed * pressure.speed_factor;
const dynamicCenterAttraction = this.layer.centerAttraction * pressure.attraction_factor * pType.attFactor;
const dynamicBaseRepulsionStrength = BASE_INTER_LAYER_REPULSION_STRENGTH * pressure.repulsion_factor * pType.repFactor;
const dynamicLongRangeAttraction = this.layer.longRangeAttraction * pressure.attraction_factor * pType.attFactor;
// 2. ææ
çæºãã
this.velocity.add(randomVector(this.layer.maxSpeed * 0.05 * dt * pType.jitterFactor));
// 3. ç²åéã®çžäºäœçš
let interactionForce = new THREE.Vector3();
const attractionRange = this.layer.attractionRange;
for (const other of allParticles) {
if (other === this) continue;
const diff = tempVector.subVectors(other.position, this.position);
const dist = diff.length();
if (dist > 0.001 && dist < attractionRange) {
diff.normalize();
let forceMagnitude = 0;
const repulsion = dynamicBaseRepulsionStrength / Math.pow(dist, REPULSION_POWER);
if (this.layerIndex === other.layerIndex) {
const attraction = dynamicLongRangeAttraction / dist;
forceMagnitude = attraction - repulsion;
} else {
const interAttraction = (dynamicLongRangeAttraction / dist) * INTER_LAYER_ATTRACTION_FACTOR;
forceMagnitude = interAttraction - repulsion;
}
interactionForce.add(diff.multiplyScalar(forceMagnitude));
}
}
this.velocity.add(interactionForce.multiplyScalar(dt));
// 4. ææå±€ïŒåºäœïŒã«å€éšGæ¥åãé©çš
if (this.layerIndex === layers.length - 1) {
const externalRepulsion = randomVector(BASE_EXTERNAL_G_REPULSION * pressure.repulsion_factor * dt);
this.velocity.add(externalRepulsion);
}
// 5. äžå¿åŒåïŒåãã¿ã»åæïŒ
const radius = this.position.length();
const centerDirection = this.position.clone().negate().normalize();
const attractionStrength = dynamicCenterAttraction / (radius * radius + 0.1);
this.velocity.add(centerDirection.multiplyScalar(attractionStrength * dt));
// 6. é床å¶éãšæ©æŠ
const spd = this.velocity.length();
if (spd > dynamicMaxSpeed) {
this.velocity.normalize().multiplyScalar(dynamicMaxSpeed);
}
this.velocity.multiplyScalar(dynamicFriction);
// 7. å°å¹³é¢ããã®åçºããã³ã·ã£ã«ïŒå
åŽå¢çããã®æŒãåºãïŒ
if (this.layerIndex > 0) {
const innerBoundaryRadius = layers[this.layerIndex - 1].radius + PARTICLE_SIZE;
const distToInnerBoundary = radius - innerBoundaryRadius;
if (distToInnerBoundary < BOUNDARY_REPULSION_RANGE) {
const repulsionStrength = this.layer.boundaryRepulsion * BOUNDARY_REPULSION_STRENGTH;
// è·é¢ãè¿ã¥ãã»ã©æ¥åã¯åŒ·ããªãïŒéç·åœ¢ïŒ
const repulsionMagnitude = repulsionStrength / (distToInnerBoundary * distToInnerBoundary + 0.01);
const normalOutward = this.position.clone().normalize();
this.velocity.add(normalOutward.multiplyScalar(repulsionMagnitude * dt));
}
}
this.position.add(this.velocity.clone().multiplyScalar(dt));
// 8. ããŒãå¢çãã§ãã¯ãšäœçœ®è£æ£ (G-Forceé£éé©çš)
const newRadius = this.position.length();
// *** G-Forceé£é: æ žå±€ã®å¹³åç±ãå
šå±€ã®åŸ©å
åã«ä¹ç® ***
const heatFactor = 1.0 + (globalNucleusHeat * (MAX_HEAT_EFFECT - 1.0));
const restitution = this.layer.restitution * heatFactor;
const innerBoundary = (this.layerIndex === 0) ? 0.0 : layers[this.layerIndex - 1].radius + PARTICLE_SIZE;
const outerBoundary = layers[this.layerIndex].radius - PARTICLE_SIZE;
if (newRadius > outerBoundary) {
const normal = this.position.clone().normalize();
this.position.copy(normal.multiplyScalar(outerBoundary));
this.velocity.reflect(normal).multiplyScalar(restitution);
} else if (newRadius < innerBoundary) {
const normal = this.position.clone().negate().normalize();
this.position.copy(this.position.normalize().multiplyScalar(innerBoundary));
this.velocity.reflect(normal).multiplyScalar(restitution);
}
this.mesh.position.copy(this.position);
// === 9. ç±ååŠ: ç²åã®æž©åºŠïŒå§å/éäžåºŠïŒèšç®ãšè²ã®æŽæ° ===
let neighborCount = 0;
for (const other of allParticles) {
if (other === this) continue;
const dist = this.position.distanceTo(other.position);
if (dist < PRESSURE_RADIUS) {
neighborCount++;
}
}
this.temperature = Math.min(1.0, neighborCount / MAX_PRESSURE_COUNT);
const heatSensitivity = (pType.attFactor * 0.5) + 0.5;
this.mesh.material.color.copy(this.baseColor).lerp(HOT_COLOR, this.temperature * heatSensitivity * 0.7);
}
}
class SystemCore extends THREE.Object3D {
constructor() {
super();
this.velocity = randomVector(0.01);
}
update(dt) {
this.position.add(this.velocity.clone().multiplyScalar(dt * 0.1));
const drift = randomVector(0.001);
this.velocity.add(drift);
const centerForce = this.position.clone().negate().multiplyScalar(0.005);
this.velocity.add(centerForce.multiplyScalar(dt));
if (this.velocity.length() > 0.1) {
this.velocity.normalize().multiplyScalar(0.1);
}
}
}
// === ã°ããŒãã«G-Forceã®èšç® ===
function calculateGlobalNucleusHeat() {
let totalHeat = 0;
let nucleusParticleCount = 0;
for (const p of particles) {
if (p.layerIndex === 0) { // æ žå±€ã®ã€ã³ããã¯ã¹ã¯ 0
totalHeat += p.temperature;
nucleusParticleCount++;
}
}
if (nucleusParticleCount > 0) {
globalNucleusHeat = totalHeat / nucleusParticleCount;
} else {
globalNucleusHeat = 0.0;
}
}
function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 25;
const pointLight = new THREE.PointLight(0xffffff, 2.5);
pointLight.position.set(5, 5, 5);
scene.add(pointLight);
scene.add(new THREE.AmbientLight(0xffffff, 0.5));
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById("container").appendChild(renderer.domElement);
systemCore = new SystemCore();
scene.add(systemCore);
layers.forEach(layer => {
const mesh = new THREE.Mesh(
new THREE.IcosahedronGeometry(layer.radius, 2),
new THREE.MeshBasicMaterial({ color: layer.color, wireframe: true, opacity: 0.15, transparent: true, depthWrite: false })
);
systemCore.add(mesh);
});
layers.forEach((layer, idx) => {
for (let j = 0; j < 3; j++) {
particles.push(new Particle(layer, idx, j));
}
});
setupEventListeners();
setupEmotionControls();
setupToggleUI();
animate();
}
function setupEventListeners() {
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
const handleInteractionStart = (clientX, clientY) => {
isDragging = true;
previousMousePosition = { x: clientX, y: clientY };
document.body.style.cursor = 'grabbing';
};
const handleInteractionMove = (clientX, clientY) => {
if (!isDragging) return;
const deltaX = clientX - previousMousePosition.x;
const deltaY = clientY - previousMousePosition.y;
const rotationSpeed = 0.008;
systemCore.rotation.y += deltaX * rotationSpeed;
systemCore.rotation.x += deltaY * rotationSpeed;
previousMousePosition = { x: clientX, y: clientY };
};
const handleInteractionEnd = () => {
isDragging = false;
document.body.style.cursor = 'grab';
};
renderer.domElement.addEventListener('mousedown', (e) => { handleInteractionStart(e.clientX, e.clientY); });
document.addEventListener('mousemove', (e) => { handleInteractionMove(e.clientX, e.clientY); });
document.addEventListener('mouseup', handleInteractionEnd);
renderer.domElement.addEventListener('touchstart', (e) => {
e.preventDefault();
const touch = e.touches[0];
handleInteractionStart(touch.clientX, touch.clientY);
});
renderer.domElement.addEventListener('touchmove', (e) => {
e.preventDefault();
const touch = e.touches[0];
handleInteractionMove(touch.clientX, touch.clientY);
});
renderer.domElement.addEventListener('touchend', handleInteractionEnd);
document.body.style.cursor = 'grab';
}
function setupEmotionControls() {
const controls = document.getElementById('emotion-controls');
const buttons = controls.querySelectorAll('.emotion-button');
buttons.forEach(button => {
button.addEventListener('click', () => {
const newEmotion = button.id;
currentEmotionPressure = newEmotion;
buttons.forEach(btn => btn.classList.remove('active'));
button.classList.add('active');
});
});
}
/**
* UIããã«ã®ééæ©èœ
*/
function setupToggleUI() {
const container = document.getElementById('overlay-container');
const button = document.getElementById('toggle-button');
const icon = document.getElementById('toggle-icon');
button.addEventListener('click', () => {
const isCurrentlyHidden = container.classList.contains('hidden');
container.classList.toggle('hidden');
icon.textContent = isCurrentlyHidden ? 'â®' : 'â¯';
button.setAttribute('aria-expanded', isCurrentlyHidden);
});
container.classList.remove('hidden');
}
function animate() {
requestAnimationFrame(animate);
const dt = SIMULATION_DT;
if (isRunning) {
calculateGlobalNucleusHeat();
particles.forEach(p => p.update(dt, particles));
for (let i = 0; i < particles.length; i++) {
for (let j = i + 1; j < particles.length; j++) {
if (particles[i].layerIndex === particles[j].layerIndex) {
handleParticleCollision(particles[i], particles[j]);
}
}
}
systemCore.update(dt);
if (!isDragging) {
systemCore.rotation.y += 0.001;
}
}
renderer.render(scene, camera);
}
window.onload = init;
</script>
</body>
</html>ããããå ã¯

ææ ã°ã©ãã®çãç«ã¡
ææ ãšã¯ éåååŠãç±ååŠãïŒïŒèæ ãããšããããåŠåã®æçµåœ¢æ ãç®æã㊠人工ç¥èœã®åºç€ãšãªãææ ã®æ°å€åãšã¯

çµéšè«ïŒïŒ
ãªã¬ã®çµéšè«ïŒïŒ
ãã€ããµããŒãããããšãããããŸãâª èŠæ ãã¡ãã»ãŒãžãªã©ãããŸããããé æ ®ç¡ãâãž https://note.mu/otspace0715/message
