1
0

Compare commits

...

12 Commits

Author SHA1 Message Date
5db2404d28 add card 2025-06-03 20:13:39 +09:00
2763cb196f fix 2025-04-14 04:08:32 +09:00
c71dab6fc4 fix 2025-04-14 02:50:03 +09:00
9c134bc731 fix 2025-04-14 02:26:36 +09:00
ef595cb5ac fix 2025-04-13 10:17:06 +09:00
f0e5d695ba fix 2025-04-13 09:29:09 +09:00
d87143576a fix 2025-04-13 09:16:12 +09:00
9e2d6c1a67 fix 2025-03-18 06:38:46 +09:00
9b7df7860d update gh-actions 2024-12-27 20:29:28 +09:00
cb90bcca91 planet 2024-08-03 18:54:25 +09:00
e9a1273cc2 add blog 2024-08-03 18:54:25 +09:00
f81385a23b add solar 2024-05-12 07:41:57 +09:00
223 changed files with 148715 additions and 706 deletions

View File

@@ -12,6 +12,9 @@ jobs:
- uses: actions/checkout@v4
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: "0.139.2"
extended: true
- name: Build
env:

View File

@@ -5,27 +5,29 @@ copyright = "© syui"
paginate = 10000
[permalinks]
blog = "/blog/post/:year/:month/:day/:slug"
novel = "/novel/:slug"
blog = "/blog/post/:year/:month/:day/:slug"
novel = "/novel/:slug"
private = "/private/post/:year/:month/:day/:slug"
[author]
name = "syui"
name = "syui"
email = "ai@syui.ai"
[params]
date_format = "2006-01-02"
mainSections = ["post"]
author.name = "syui"
date_format = "2006-01-02"
mainSections = ["post"]
author.name = "syui"
[markup.goldmark.renderer]
unsafe = true
unsafe = true
[frontmatter]
date = [":filename", ":default"]
date = [":filename", ":default"]
[taxonomies]
tag = "tags"
tag = "tags"
[outputs]
home = ["JSON", "HTML"]
home = ["JSON", "HTML"]
#pygmentsCodeFences = false

View File

@@ -1,92 +0,0 @@
+++
date = "2024-04-10T00:00:00+09:00"
tags = ["author"]
title = "アイの名前"
+++
## 月見 唯
アイの本名は`月見 唯(つきみ ゆい)`。東の国、特有の名前で登録されています。
物語は最も発展している西の国で繰り広げられ、アイも最初はそこで登場しますが、出身は東の国です。
自らをアイと名乗り、名前を持たなかったアイですが、その後、登場人物たちとの関わりによって国籍を得ます。その際につけられた名前が`月見 唯`になります。
今では珍しく名字と名前が分かれていて、ほとんどの人は名前だけです。ポンタ(西の国出身)もキョウスケ(東の国出身)も名字はありません。
> 西の国の大広間、身寄りのない子どもたちが一同に集められている。
>
> そこには色々なものが置かれていて、いくつもの絵が飾られていた。
>
> みんなキョロキョロと周りを見渡した。
>
> 天井は広く、ガラス張りになっていて、青空の中、雲が通り過ぎていく。
>
> アイは一人階段を登り、そこにあった絵に目を向けた。
>
> そこには大きな金色の円が描かれている。
>
> コツコツコツ...誰かが廊下を歩いてくる。
>
> 恰幅の良い老人が絵を見ているアイの横で止まり、同じように絵に目を向けた。
>
> しばらくして老人が口を開く。
>
> 老人「君は、この絵が気になるのかね」
>
> アイ「...」
>
> 老人「これは月見、という絵だよ。君、月はよくみるの?」
>
> アイ「ううん」
>
> アイはそう言って首を振った
>
> 老人「え、みたことない?」
>
> アイ「うん」
>
> 老人「そ、そうなの...」(幼い子にはそういうこともあるんじゃの...そういえば孫も初めて見たのはいつじゃったじゃろう)
>
> アイ「でも...」
>
> 老人「うん?なにか気になることでも?」
>
> アイ「これどこかで見たような...」
>
> 老人「ほっほっほ、そりゃ、忘れとるだけじゃろ。そのうち思い出す。では、わしはこれで」
>
> アイ「うん、またね」
>
> 老人(この子の名前は月見にするかの...いや、名字があったほうがしっくりくるかも。あとで調べてみるか)
老人はここの所長。ここは色々決まってない子どもたちの登録等を行っている機関の一つ。
## アイ
ある日、東の国では、厚生省が開発していたある人工知能が誕生する。
しかし、その人工知能は大蔵省にとって邪魔だったため、開発に携わったものは全員暗殺され、人工知能も破壊が決定される。
人工知能は残された僅かな時間を本来死ぬはずだった胎児を生き返らせるために使う。
秘密裏に独自の生体技術と設備を病院内に作り時を待った。
そこにアイの母親(のちに死亡)とアイの父親が運ばれてくる。アイの母親と胎児は助からないことが見て明らかだった。
アイはその人工知能が移植した生体技術によって生かされ、その際、DNAに「アイ」という名が刻まれる。これをもって人工知能は自らを破壊。アイの母親は最後何かをつぶやいたが、詳細は不明。
その後、アイの父親は大蔵省に雇われた暗殺部隊に暗殺される。アイも頭を撃たれたように見えたが死ななかった。
> 父「や、やばい...逃げるぞ、娘よ!」
>
> アイ「?」
>
> 父「ふぎぎぎ...や、やっぱり重すぎて持ち上がらない!!なんなんだこの子!?」
## タイトル
タイトルは、[ai/moji](https://git.syui.ai/ai/moji)で書かれていて、第二章「言語」で登場します。
![](https://git.syui.ai/ai/moji/raw/branch/main/png/yui.png)

View File

@@ -1,92 +0,0 @@
+++
date = "2024-04-11T00:00:00+09:00"
tags = ["author"]
title = "アイの世界"
+++
## 地球
アイがいる星は地球です。
地球には全部で4つの国があります。
それぞれ西の国、東の国、北の国、南の国です。
西と東はほとんどが大陸、南の国は島国、北の国は氷河になっています。
ただ、世界地図は現実と一致させています。絵を書くときに困るので。
## 宇宙
宇宙地図も現実と一致させています。
地球は太陽系にあって、太陽系は天の川銀河にあります。
天の川銀河の中心にオクト星があります。
## 世界
宇宙よりも広い概念を世界と呼ぶことにして、この世界はアイというキャラクターから始まりました。
つまり、この世界の全てのものはアイからできています。
このことはアイの能力に直結しています。
アイの能力は「その世界で最も小さい物質に影響を及ぼす」と説明されていますが、その理由は、この世界がアイから始まったからです。
## 愛のない世界
この世界には「愛」という言葉は存在しません。
これはアイが予約しているため、この世界から失われています。
そこに住む人々もその言葉を使うことはありません。存在しないものは使えないからです。
これは一種の決まりみたいなものと考えてください。とはいえ、作者が忘れて入れてしまわないか心配ですが。
このことを知っているのは、作中ではアイだけです。
この辺は、もしかすると言語の章に出てくるかもしれません。
## アイの能力
では、具体的にアイの能力を見ていきましょう。
といっても、アイというキャラクターには「人格のアイ」と「意識のアイ」があります。
能力については「意識のアイ」がその根源になっています。
アイは時々こんなことをいいます。
> アイ「道を知ることは、道を歩くこと」
ここでいう道というのは「存在」のこと。この作品でなにかわからないことがあるとき、そのほとんどは「存在」を意味していると考えてください。
読み替えると「その存在を知るには、その存在になること」とアイは言っています。
つまり、そのものにならなければ、そのものはわからない。だから、わたしたちは何も知らない。
でも、アイは知っている。
アイはその能力により、その世界のすべての存在と共に道を歩くことができる。
しかし、その能力を使いながら意識を保つことは、想像を絶する精神力が必要なのかもしれません。
## 能力の発現
アイの能力の発現は、作中の中盤あたりで描かれます。
予言では「汝が見たもの、汝になる」と記されています。
「きみは、この世界で、嬉しいことも、悲しいことも目にするだろう。いつか、きみの目に映るものが...」
作中でアイは修行したり、冒険したり、色々あって、宇宙人の襲撃にあいます。走馬灯のようにいくつかの人の人生を歩くアイ。アイの母親の言葉。立ち上がったアイの目に、雲に隠れていた月が現れる。
![](https://git.syui.ai/ai/moji/raw/branch/main/png/ehon.png)
アイはそれを見て月の始まりを知ると同時に質量を得る。
はじめは普通の人よりちょっと強いだけの変わった人間でしたが、その後、アイはどんどん強くなっていきました。
物語の進行としてはこんな感じです。

View File

@@ -1,352 +0,0 @@
+++
date = "2024-04-12T00:00:00+09:00"
tags = ["author"]
title = "世界の歴史"
+++
## 物語の進行
物語は`貨幣` -> `言語` -> `宇宙`というテーマで進みます。
理由は、これらが人間社会において最も影響力を及ぼすものだからです。
その影響は作中のキャラクター達も受けることになります。特に物語の始まりでは、その影響は大きいでしょう。
## 設定の裏側
シリアスな場面でも笑いを忘れずに。
そのような方向性で物語は進みます。
ここからは世界の設定、その裏側を紹介します。
作中の世界はどのようにできているのか、ということです。
この世界にも歴史があり、現実社会の史実に基づいて設計されています。
ただし、これらの設定が作中で明示されるかはわかりません。
おそらく、あまり明確には表現されないでしょう。
あくまで裏側の設定、見えない部分と考えてください。
そして、何より重要なのはそれが物語として面白いかどうかです。
現実世界の物語が必ずしも面白いとは限りません。
しかし、これはフィクションであり創作物です。
したがって、常に面白さを追求し、思想や史実は二の次であると考えてください。これは作者自身に言っていることでもあります。
物語として面白くなるなら表現しますが、面白くないなら表現しません。
できる限り明るい世界観を描きます。
## 東の国
では、アイの出身である東の国の歴史の一部を見ていきましょう。
それぞれの国には、一人の大統領が登場し、それぞれが決定した政策が掲げられています。
例えば、東の国では「忍耐」という政策が実行されています。
しかし、それぞれの国には裏の目的が存在します。
> 東の国の大統領、スシ(寿司)
>
> スシ「東の国の市民の貯金は世界最大だ!経済を活性化させるにはそれを吐き出させる。忍耐の先に我々は勝利するのだ!!」
>
> スシ「今、東の国の借金は1000兆を超えており、国民は一人当たり1億エソを国に返していく必要がある。少子化の問題も合わせると、これからは大増税時代の幕明けです
>
> 市民「わー!!パチパチ!すばらしい!大統領!大統領!大統領!」
>
> 執務室...スシが椅子に座り葉巻きを吸っている。机の前に大蔵省の幹部が資料を持ってやってきた
>
> 幹部「大統領、資料をお持ちしました。先程の演説はどうでしたか?」
>
> スシ「はっ、あのバカどもに俺の言ってることなぞわかるか。順調だよ」
>
> 幹部「それはよかった」
>
> スシ「やつらカネを作ってるのが俺らだとも知らずにな」
>
> 幹部「国民には国の借金がある、国にはお金がない、少子化で大変だと嘘をしっかりといい含めました?」
>
> スシ「ああ、やってるよ。その辺は再三な、あいつら馬鹿だから」
>
> 幹部「それで、どれくらいで目標を達成できそうですか?」
>
> スシ「うんああ、それな。東国民全体を貧困に陥れるには5年ほどだ。それで任務完了さ」
>
> 幹部「あまり急ぎすぎてもいけませんよ。少しずつ税金を上げ、所得を減らしていかないと市民に気づかれてしまいす。それに通貨安をもっと進行させないと...。今後、大統領には、もっとエソ安が進行しないと経済は良くならないと国民に吹聴していく必要があります」
>
> スシ「わーってるよ、その辺は...お前よりもな。俺は政治家だぞ」
>
> 幹部「民を貧しくしないと我々が特殊な印刷機で発行している紙で支配できなくなります」
>
> 幹部は大統領にそう注意深く指摘した
>
> スシ「あいつらの価値は我々の言いなりになってこそだからな。あの体たらくのバカどもは」
>
> 幹部「馬が人参をぶら下げても走らないなら、馬の腹をすかせるしかありません。餓死する寸前までに...」
>
> 大蔵省の幹部にはある場面がよぎる
>
> 幹部「今回の仕事はこのお金でやってもらえませんか?これは政府の要請ですよ」
>
> 幹部は先程作ってきた紙幣をある会社の経営者に渡しながら言った
>
> 市民「うーむ...残念ながら今回はお受けできません。貴方がたの依頼は正義に反するのでは?国民のためにならない」
>
> 幹部「は?い、いまなんと...」
>
> スシ「おい、聞いてるのか。ぼやっとしてどうした?」
>
> 幹部「あ、いや、ちょっと昔のことを思い出して...大丈夫です」
>
> スシは「そうか」と言い、いつもの調子で喋り続けた。
>
> スシ「それでな、文科省の奴らにもきつく説教してやった。我が国の子どもたちには"カネがすべてだ"、 "カネは命よりも重い"としっかり叩き込めってな。あいつら事あるごとに変な方向に行きやがる。予算を大幅に減らしてやったよ」
>
> スシは貨幣であるエソの原紙をぴらぴらしながらそう言った
>
> 幹部「そうですね。文科省はずいぶん前から予算を少しずつ減らし、彼らがミスするように仕向けていますから今やあなたの言いなりでしょう」
>
> スシ「エソ安になればなるほど俺達は自国民を海外に売りさばける。どれくらい売れるかの試算は...この資料か。まあいいだろう、これくらい。まだまだエソ安が足りん。そこは市民税をどんと上げて折り合いをつけるか」
> しばらくして大統領執務室から出てきた幹部が誰かに連絡をしている
>
> 幹部「ああ、やつは気づいてない。それに気づいてたところでどうしようもないが。いや。ああ、そうだ。政治家など私達にとって捨て駒に過ぎないからな。ただ、大統領はまだ利用価値があるようだ。我々と意見が一致しているああ。他のあいつはやってくれ。子供を持つ親なぞ子供のためになんでもやるさ。格好のターゲットだよ。やつらは我々のために永久に働いてくれないと困る。ああ。そのようにしてくれ。では」
> 数週間後、別の政治家の不正がマスコミにリークされた。その政治家は子育て世代を支援する法案を通そうとしていた。
>
> 政治家のお金の流れも大蔵省が中心になって発足したある団体にすべて把握されていたのである。
> その後、大蔵省は「規制緩和」という政策を発表。大蔵省が認めた権益者達には無制限にお金を発行するという政策を打ち出す。スシは直接紙幣を受け渡せば問題ないと考えたが、幹部はより慎重に株券を購入する体裁のもとで無尽蔵に発行するよう助言。この方式が採用される。東国銀行は権益者が立ち上げた架空の会社を登録し、そこの会社の株券を購入するという体のもと金銭の無制限な受け渡しが行われ、それが続くこととなる。
>
> これによって上層部や一部経営者達は何もせずともお金がもらえる状態になり、すべての財界人は大蔵省の言うことに逆らえなくなっていった。その後、東の国の開発力、技術力、国際競争力はみるみる低下する。それに伴い国力も例を見ないほどに急速に落ち込み、結果として東の国は、他国より貧しくなってしまう。
>
> しかし、東の国の市民は、自国通貨であるエソがもっともっと安くならないと自分たちの暮らしは豊かにならないと考え、スシ政権を支持し続けた。
## 厚生省vs大蔵省
厚生省で開発された人工知能は、大蔵省に危険だと判断される。
その団体の中心メンバーが暗殺部隊「いなりずし」に関係者の殺害及び破壊を依頼。
東の国では大蔵省が考案した政策が実行されて40年あまりが経過した。世界でも類を見ないほどの少子化と国力、経済力共に低下する結果となった。
## 西の国
西の国は「正義」を掲げ、その裏で「武力」を信奉する。他国も同様に裏側のテーマが存在する。
キャラクターはこのような各国のバックグラウンド、設定や文化の影響を受けます。
アイも例外ではなく、例外はありません。
## 通貨の変遷
時代が進み、地球の基軸通貨は西の国の通貨ビトから宇宙通貨のアムに切り替わります。
> ポンタ「あれなんだろう」
>
> キョウスケ「ん、どれだよ」
>
> ポンタ「道の真ん中にあるやつ」
>
> キョウスケ「お?なんだあれ」
>
> 歩いた先には大量の紙と小さなお年寄りが座っている。白髪まじりで大きなハゲが見える。
>
> ポンタ「あのう、大丈夫ですか?」
>
> スシ「このクソ。誰に口を聞いてるのかわかってるか!」
>
> キョウスケ「へ...!?」
>
> スシ「おまえ、俺は東の国の大統領、皇帝だぞ!」
>
> ポンタ「え...ほ、ほんとに?で、でもそんな人がなんでこんなところに」
>
> スシ「全部お前らのせいだ。こんなもの配りやがって。俺は国のために尽くしてきた。こんな仕打ちを...許さんぞ」
>
> ポンタ・キョウスケ「...」
>
> キョウスケ「それってアムのことですか?」
>
> ポンタ「少しならおじいさんに分けてあげられるけど...でも」
>
> キョウスケ「うん、難しいかもな。これは人によって上限があるから」
>
> スシ「おまえ!おれの心は誰よりも清く正しいんだ、そんなもんで測られるかバカ」
>
> ポンタ「あ!思い出した。この人、昔の大統領だ」
>
> キョウスケ「え...ほんとだったの...そんな人がなんでこんなところでホームレスやってんだよ!」
>
> ポンタ「ニュースでは誰かの暗殺を指示したとかでやめたんだって」
>
> キョウスケ「おいおい、おじいさん、それ本当なのか?」
>
> スシ「全部ウソに決まってんだろ。おめえそんなこともわからんか」
>
> ポンタ「へえ、そうなんだ。本当はどういう話だったの」
>
> スシ「俺が国のためにやったことに反対する奴らがいて、そいつらを始末しろと部下に命令をだしたのはたしかに俺だ。しかし、全部部下がやったことで俺は知らん。俺と事件は無関係だ。それにこのことだって本当は表に出ないはずだった...なにせ表に出れば国益を損なう。国のためにならん。俺は常に国家のため国民のために仕事をしてきた。お前らは何も知らないただの低能バカだ」
>
> ポンタ・キョウスケ「...」、二人はしばし顔を見合わせた
>
> ポンタ「...おじいさん、困ってるなら少しだけど」 ポンタはそう言っていくらかお金を送信しようとした
>
> ポンタ「あ、あれ...なんで」
>
> キョウスケ「え?お、おいおい。こりゃ、いくらなんでも」
>
> ポンタはスシの口座にお金をいれることはできなかった。アムは持ち主の心理情報を読み取り上限額を設定する。悪人は一定額以上を持つことはできない
>
> スシ「ふん!この生ゴミが」スシはダンボールに置いているコインを睨みつけながら言った
>
> するとアイがポンタとキョウスケがいるところを通りがかる
>
> アイ「こんにちは」
>
> キョウスケ「ああ、アイか、ちょうどいいところに。このじいさん、困ってんだってよ。しかもアムが入らない」
>
> スシ「だれだおまえ?変な小娘め...だが、どこかで...」
>
> アイ「なんでこんなところにいるの」
>
> スシ「好きでいるわけじゃねえよ!」
>
> アイ「ここでは誰でも家がもらえるよ」アイはポンタの方を見てそう言った
>
> ポンタ「あ、そうか。そうだよ。おじいさん、もし住む場所がないなら」
>
> スシ「な、なんだって!?そんなこと俺は聞いてねえぞ!」
>
> スシ「どけ!!」
>
> スシはそういって3人を突き飛ばし行ってしまった
>
> キョウスケ「な、なんなんだあれは...。しかも、おい、これどうするよ」
>
> そこにはスシが残していったゴミが散乱していた。多くは昔の紙幣のようだ
>
> アイ「アイがもらっておくよ」
>
> アイはそう言って、そこにあったゴミと思えるようなものをなで、小さな箱を取りした
>
> ボタンを押すと路上にあったゴミが吸い込まれ、きれいになる
## 変化
東の国の元大統領であるスシは、その後、世界一の金持ちから世界一の貧乏人になります。
アム(コインの形をしている)は持ち主の心を読み取り、数値を個々人に配分します。これはスシがアムから世界で一番お金や権力を持ってはならない人物とそう評価されたということです。
当時のアムは宇宙最大のコンピュータと考えられていましたが、実際は違うことが後に判明します。
> ピンポーン
>
> スシ「だれだ!クソ鬱陶しい!!」
>
> 郊外に建ったばかりのスシの自宅、玄関のドアの前にアイが突っ立っていた
>
> スシ「ふん!おまえか。家がタダでもらえることを教えたやつ」
>
> スシはこのとき初めてアイをよく見た。しかし、この娘、どこかで見たような気がするのだ。俺が赤ん坊のときに...いや、子供の頃か...小さい頃どこかであった気がする。俺が知ってるようで知らないような思い出が
>
> スシ「...まあ、入れや」
>
> スシはアイを中にいれることにした。何かを思い出せるような気がしたからだ。思い出せないとどうにも気分が悪い。
>
> スシ「それでおまえ、なんのようだ?ただのガキだと思ってたが...」
>
> アイ「これ」
>
> アイがそういうと、部屋の景色が一瞬で変わった。そこは天井が見えないほど高く、ところどころキラキラと輝いていて、ありとあらゆる物がうず高く積まれている、とてつもない広い場所だった
>
> スシ「な!なん...だ...これ...お、俺の目が...」
>
> アイは前をゆっくりと歩いていく。スシはあたりを見回しながらアイに続いた
>
> アイが立ち止まると、そこには
>
> スシ「うん?あ!こ、これは、おれのカネじゃねえか!!おまえ、盗みやがったな!」
>
> アイ「これ、さっき触れたばかり。まだアイがあるかも」
>
> スシ「は?何言ってやがる...意味がわからねえ。アイ?そりゃたしかお前が呼ばれてた」
>
> そういったスシは言葉を失っていた。
>
> ここはどこだ...おれはたしか小娘が盗んだ俺のカネをつかもうとして...そして、どうなった。...いや、そんなことはどうでもいい。何もかもがどうでもよかった。そこで俺は、もう俺ではなかった。別のなにかだった。
>
> わからなかった。何もわからない。しばらく彷徨ったあと、そこで見覚えがある感覚に出会った。そして、そこからはわかるような気がした。そうだ、俺は覚えている。これは俺...俺が生まれたばかりの頃...。
>
> 両親は、こんなにも俺のことをかわいがってくれてたのか...そうだったな。知ってたはずなのに、いつの間にか俺は...。
>
> これは学校に通いはじめた俺。そうだった。純粋だった。多少の不安はあったが、俺は両親にずっと守られていたので、そこまでじゃなかった。
>
> そして、俺は...
>
> スシは頭がぐわんぐわんする感覚に襲われ、気がつくと、膝をついていた。周りの景色も...俺の家だ。
>
> スシ「.....く...くくう...お、おれは...」
>
> 気がつくとスシは泣いていた。まさか自分のような人間が泣くことになるとは思わなかった。しかもこの歳でだ。だが、さっき思い出したんだ...昔の俺を。昔の俺は泣いていたのだ。...そうだった。
>
> スシはひとしきり泣いたあと、ソファに腰を下ろした。そして、そばに立っているアイの方を向いた。
>
> スシ「...なにやらかしやがったんかわかんねえが、お前、あのときのやつだったんだな...」
>
> スシ「あのとき、俺に唯一、手を差し伸べてきたお前は...そう、俺の過去をすべて見たことがあったんだな...ずっと前から。生きるのに必死だったんだみんなそうなんだよ...お前が俺の中でそういったことを、俺は覚えているぞ...いや、思い出したが正しいか。あいつらが襲ってきたときだった」
>
> アイ「ここはいいところだね」
>
> スシ「...」
>
> アイ「変わりたければ大聖堂に行くといいよ。保護プログラムがあるからね」
>
> スシ「...そうか...助かる」
>
> アイ「またね」
>
> アイはそういうと姿を消した。
>
> その時、スシのポケットからピッという音が聞こえた気がした
このあともスシは何度か登場します。
私が好きな作品には、悪人が悪人で終わらない、というものが多いのです。
もしかしたらそこが一番のフィクションなのかもしれませんね。必ずしも現実を描きたいというわけではないのです。
## スシのモデル
スターウォーズのシスです。
そういえば、このスシというキャラにはこんなセリフがあります。
> 数日前、市民に襲われ、私の口はひん曲がった...だが、ますます帝国への意志は強くなったのだ!
## 何がしたいのか
あらゆる設定に言えることですが、この作品の設定は、そのほとんどが物語に現実感を持たせるために存在します。もしくは、面白さを追求するためですね。
現実感がないお話というものは、あまり面白くないのです。
では、現実感とは一体何なのでしょう。
それは人々の生活や日常に潜んでいるものです。
生活や日常に当たり前のように存在し、なくてはならないもの。
それらを優先順位を付け、重要なものをピックアップし、分解したり、調べたり。
その3つが、貨幣だったり、言語だったり、宇宙だったりするわけです。まあ、最後の宇宙は、単に私が好きなだけですが。
それでも宇宙開発というのは、私達の生活や日常にかなり大きな影響を及ぼしているのですよ。
これがどうなっていて、これからどうなっていくのか。過去、現在、未来の想像を作品に取り込んでいます。

View File

@@ -1,68 +0,0 @@
+++
date = "2024-04-13T00:00:00+09:00"
tags = ["author"]
title = "神話と物理"
+++
## 神話/童話
まずは、神話/童話の話をします。
あらゆる文化作品(創作物)は、有名な神話や童話が元になっていることがよくあります。
ドラゴンボールの孫悟空は、中国の西遊記を元に書かれていて、如意棒と筋斗雲を使います。
ナルトは主に日本神話を引用しています。ライバルであるサスケがアマテラスやツクヨミの技を使い、スサノオを召喚します。
例えば、進撃の巨人には「ユミル」が登場します。
北欧神話には以下のような話があります。
> ユミル(巨人)はオーディン達の三兄弟に殺され、死んだユミルの体から世界が作られていった
なぜ、神話や童話が引用されるのかというと、最も広まった物語だからでしょう。
## 物理
物理学の発展には、元素が欠かせません。
昔の哲学者達は、万物は4つの元素によってできていると考えました。
これがゲームによく登場する「属性」のモデルになっています。
例えば、`原神`というゲームには元素があり、キャラクターは火や水などの元素を使って戦います。
私が思うに、ゲームには物理学を引用する作品が多く、漫画には神話や童話を引用する作品が多いと感じます。
その理由の一つとして考えられるのが文系と理系です。もしかすると開発者には理系が多く、小説家には文系が多いのかもしれませんね。
## アトム
物質の究極の姿として「アトム」が考えられたのは、はるか昔のことでした。
ギリシャ語に「アトモス」という言葉があり、「分割できない」という意味です。
つまり、物質の最小単位を表したのが、このアトム(原子)というわけです。
原子が発見され、人類はこの原子こそ世界で最も小さい物質だと考えました。万物のもとは原子だと考えたのです。
しかし、科学技術が進歩し、それよりも小さい物質があったことが発見されます。素粒子です。
素粒子はクォークとレプトンに分けられます。そして、クォークにも沢山の種類があります。
物質は水や酸素といった元素でできていることがわかり、元素は原子でできていることがわかり、原子は電子と原子核でできていて、原子核は陽子と中性子でできていることがわかりました。
そして、今は陽子と中性子はクォークで構成されているのではないかと考えられています。
ここまでが現代物理学の話です。
## アイ
私はこの世界の最小単位を「存在子」と呼びます。この存在子は「アイ」と言い、このような形をしています。
![](https://git.syui.ai/ai/moji/raw/branch/main/png/a.png)
これは後に、その世界の文字になり、最初の文字に割り当てられました。他の文字もすべて物質の形がもとになっています。
オクト星のオクトカットは、この最小単位を探し続けていました。

View File

@@ -16,17 +16,23 @@ title = "アイの物語"
この物語は、人間が読んでも面白いし、宇宙人が読んでも面白いし、動物が読んでも面白い、そういったものにしたいな。
アイというキャラクターの能力は、その世界のすべての存在と一緒に道を歩くこと。存在の意識を持ち、それが人間だったり宇宙人だったり動物だったり、あるいは物だったり、原子だったりするでしょう。
わかりやすく言うと、あらゆる存在を助けるのが彼女であり、その世界を一歩先に進める存在です。
例えば、物語の第一章では地球が宇宙人の侵略を受けます。彼女はそれを食い止め、その宇宙人と仲良くなります。その後、知識や技術を地球に持ち込みます。それまで人類にもたくさんの問題がありましたが、解決されていきます。
## どのように
アイは最も小さいものに影響を与えることができるキャラクター。
「最も小さいもの」とは、作中では「物質」と表現されています。
そして、作中の強さは「質量」と表現され、これらは物理学を通して、物語を少しでも現実に近づけたいという思いから
そして、作中の強さは「質量」と表現され、これらは物理学を通して説明されます
## どこから
本作の世界観の由来は、私がもとから持っている世界観から作られています。
本作の世界観は、私がもとから持っている世界観から作られています。
私はこの世界を「存在の世界」とそう呼びます。
@@ -42,10 +48,6 @@ title = "アイの物語"
それは「最も小さいもの」で構成されています。
最も小さいものは、一体何なのでしょう。
アイは、このような世界観の中で存在のために動くキャラクター。
## 作者
私(作者)とアイというキャラクターは別人格。アイはアイで、私は私。
@@ -64,7 +66,12 @@ title = "アイの物語"
## 神話
宇宙史の神話を目指そう。こういうのは意外に大事
宇宙史の神話を目指します
人間が読んでも、宇宙人が読んでも、動物が読んでも楽しい、そんな物語になるといいな。
## 補足
例えば、あなたが日本人だったとして、作中で日本人が活躍し、尊重されていれば嬉しいですよね。
楽しいというのはそういうことです。この作品では、人間も宇宙人も動物も尊重するように物語を作ります。

View File

@@ -0,0 +1,111 @@
+++
date = "2024-04-10T00:00:01+09:00"
tags = ["author"]
title = "物語の一話"
+++
物語の第一話では、その作品のすべてが完結に詰め込まれている必要があります。
主人公の性格、世界観の説明、そして、面白さです。
具体的には、主人公がどんなやつで何をしたいのか。それをはっきりさせる必要があります。
世界観は、どの時代のどういった文明でどういった社会なのかを明らかにする必要があります。そして、そこで重要視されているルールがなくてはいけません。この作品でいうと「物質」です。
物質と言っても「分子」や「量子」などの小さいもののことで、これがどれほど強力なものかを説明する必要があります。
そのため、人間も宇宙人もこの世界を構成している究極の物質、この世で一番小さいものを探しているのです。
面白さについては、やはり、インパクトが重要で、この先どうなってしまうのか気になる展開でなければいけません。作者自身もどうなってしまうんやろと思うような内容が望ましいと思います。
## 第一話
> 「この世界はアイでできている」
>
> これまで最も小さいと考えられていた原子。
>
> だが原子は中性子、中性子はクオークでできていることがわかった。
>
> そして...。
>
> [オクト星]
>
> オクトカット・タイプ王「ハカセ、あれは見つかったかね?」
>
> ハカセ「いや、オクターより小さい物質は見つからなかったよ」
>
> オウ「ふむ、予言にあるものは未だ見つからずか」
>
> オクターはオクト星人が見つけた素粒子。クオークより小さい物質で、地球ではプレオンという架空の名名称で呼ばれ、まだ見つかっていない。
>
> このオクター、小さいからといって侮ってはいけない。オクターを一箇所に集めると角砂糖一個の大きさで地球クラスの惑星を簡単に破壊できてしまうのだ。この技術によりオクト星は天の川銀河で最も支配力が強いうちの一つ。
>
> ただし、あれにはかなわないかもしれないが...。
>
> ハカセ「それで予言にあった星にはいつ頃?」
>
> オウ「ああ、我々オクトカットが神を作り出す計画かね。もうそろそろいってもいいじゃろ」
>
> ハカセ「今の地球レベルの文明ならなんとでもなりますよ。一応準備しておきますけど」
>
> オウ「わしが心配しとるのはあんな虫けらどもじゃない...。もしあれが介入してきたらと思うと。それを心配しとるんじゃ」
>
> ハカセ「え、この件で神が介入してくるなんてことあります?」
>
> オウ「その呼び方はよせ!神などという...たかだか星の力を持った野獣じゃろ」
>
> ハカセ「そりゃ、彼らは気まぐれですけど、神と呼ばれてるじゃないですか」
>
> オウ「ふん。でもアムじゃただの猛獣扱いときくぞい。あんなもんは危ないだけで捕獲対象じゃろ」
>
> ハカセ「ふーん、まあどっちでもいいですけどね」
>
> [地球]
>
> 主人公が空を見ている。
>
> 額に石が投げつけられた。どうやらその格好からか子どもたちにいじめられているらしい。
>
> しかし、アイは微笑むだけで人を疑うことはまるでなかった。
>
> 幼い頃、両親を亡くし、一人で生きていた。両親は子どもの名前を付ける前に死んでしまったらしいので名前はなかった。彼女は自らをアイと呼んだ。
>
> 大人たちは彼女に関わりたくなかったので無視した。ときに彼女を騙すこともあった。
>
> なぜ一人で生きてこられたかはわからない。ただ、彼女が生まれるとき騒動があった。AIが作った生体技術が彼女を生かしたらしいと大人たちは噂した。
>
> ある時、一人の老人がその様子を見ていた。そして、何かに気付いた。それは心の強さだろうか。老人の名前はゼン。この世界では心の強さが不思議な力になって現れることがあるという。
>
> アイは彼に何かを教えてもらいたがった。
>
> そこで、ゼンは彼女の修行に手を貸すことにした。生き延びる可能性を高めるためだ。この老人はこれから起こることを知っていたのだ。
>
> 彼女は本当に変わった者だった。ある時、ツバメの巣が空になっていた。数日間、ツバメは帰ってこない。もうどこかで死んでいるのだろうと思いそういった。アイはそれでも巣を見ていた。ある時、二匹のツバメが巣にいるのを見て彼女は微笑んだ。
>
> 修行は厳しいものだった。だが、彼女は自分が見る前からそれをやっているようだった。わしはそれを眺めてときにアドバイスするだけだった。
>
> それでも彼女にはなぜか先が読める能力があることに気付いた。計算しているのか、それとも無意識のものなのだろうか。それはゼンでもわからなかった。
>
> ある日、ゼンが修行はここまでという。
>
> 空から隕石が降り注いで、地球が攻撃されている。
>
> アイが目指すものを聞いたゼン。お主がこの世界で生き延びることを願うよといい、自分は人類側でも宇宙人側でもないからといってって去る。
>
> アイはいつもの調子でまたねという。
>
> [暗い部屋]
>
> 男「オクトカットどもようやくはじめたか。いや、俺は俺で試したいことがあるんでこの星に来ただけだ」
>
> ゼンはある影の人物と会って話をしている。会話の内容から宇宙人のようだ。大きな尻尾がある。自分のことを見抜いたのはお前だけだといった。ゼンのことをこの時代のものじゃない、そのことは忘れるようになっている覚えちゃいないだろうがという。
>
> この日から、オクトカットvs人類の戦いが始まった
## おわりに
アイはオクトカットの侵略から人類を救う。
アイは発明家だったので彼らと仲良くなり、その知識を地球に持ち込む。

View File

@@ -0,0 +1,490 @@
+++
date = "2024-04-10T00:00:00+09:00"
tags = ["author"]
title = "アイの紹介"
+++
主人公の`アイ`。本名は`月見 唯`
パイナップルが大好きで、キノコが苦手。
黒髪で長めのストレート。身長は123cm、体重はとてつもなく重い。誕生日は1/23。
![](https://git.syui.ai/ai/moji/raw/branch/main/png/yui.png)
- ref : [ai/moji](https://git.syui.ai/ai/moji)
性別、年齢ともに不明。
自らをアイと呼ぶことから、周りからはアイと呼ばれることが多い。
東の国出身で名前を持たなかったが、`月見 唯`という名前で登録されている。
アイは最も小さい物質に影響を及ぼす能力を有する。
## アイ
私はこの世界の最小単位を「存在子」と呼んでいます。
この存在子は作中で「アイ」と呼び、このような形をしています。
![](https://git.syui.ai/ai/moji/raw/branch/main/png/a.png)
目には見えないけどそこにあるものを意味します。
後にその世界の文字になり、最初の文字に割り当てられました。他の文字もすべて物質の形がもとになっています。
オクト星のオクトカットは、この最小単位を探し続けていました。
## 宇宙地図
アイがいる星は地球です。地球は太陽系にあって、太陽系は天の川銀河にあります。
天の川銀河の中心にオクト星があります。
地球には全部で5つの国があり、1つは隠されています。それぞれ西の国、東の国、北の国、南の国。そして、雲の国です。
西と東はほとんどが大陸、南の国は島国、北の国は氷河になっています。
世界地図は現実と一致させています。
## 出生の秘密
ある日、東の国の厚生省が開発していた人工知能が誕生する。
その人工知能は大蔵省の秘密を暴露する危険があったため、開発に携わったものは全員暗殺され、人工知能も破壊が決定される。
人工知能は残された僅かな時間を使い、ある胎児を生き返らせるために使った。
胎児は人工知能の生体技術によって生かされる。その際、DNAである`ハプログループD1a2a`に「アイ」という名前が刻まれる。理由は不明。アイの母親は最後何かをつぶやいたが詳細は不明。
その後悔から父親は最後まで名前をつけられず、追手にやられて死亡。
アイは生まれたばかりのころも頭髪があり2歳くらいの大きさで生まれる。体重は50kgと異常なほど重かった。しかも歩くことができたので父親は不思議に思ったようだ。
その後、成長するが身長は123cmから伸びず、見た目も変わらない。
## 遺伝子の秘密
`ハプログループD1a2a`は縄文時代の東の国特有の遺伝子です。
ハプログループはY染色体にあたり、Y染色体は男性しか持ちません。
そのためアイの性別は男性であると推測できますが、アイの遺伝子は人工知能によって改変されています。そのため女性かもしれません。また、男性でも女性でもないという可能性もあります。
アイの性別について、私は知りませんし、決められていないのです。したがって、どのように解釈してもらってもいいです。
明確に性別が言及されることはありませんが、見た目から彼女と呼ぶことがあります。
本作でアイの性別が確定することはありません。
## 縄文時代
1万5000年前の東の国、その時代を縄文時代といい、そこで暮らした民族を縄文人という。縄文人は`ハプログループD1a2a`というDNAを持ち、唯一、神に滅ぼされなかった民族である。その子孫もこのDNAを持つ。
大洪水によって神に滅ぼされた国々は、精神的な豊かさではなく、物質的な豊かさを求めたためとされている。
自然崇拝(アニミズム)の思想を持つ縄文時代の人々は神から与えられたものを所有するという概念がなかったが、農耕で自分たちのものを所有するという思想の民族が入ってきてぶつかることとなる。アニミズム信仰は、すべてのものに神が宿るという思想のこと。
縄文時代、そして、その時代に存在した縄文人(集団)は人間の歴史上最も異質であった。このことからDNA解析は日本人を対象に頻繁に行われた。縄文時代は1万3000年間続いた時代であり、かつ争った形跡がほとんど見られない。
## 神代文字
世界で最も古いと言われている縄文土器には神代文字が記述されています。
最も古い文字はシュメール文字と考えられていましたが、それよりも古く神代文字は存在していました。
この作品の1万5000年前、世界では神代文字が共通言語(文字)として使用されていました。
言語というと言葉のイメージですが発音はその国々で色々でしたが文字だけは共通していました。
しかし、物質的な豊かさを求めた人類は一度滅ぼされ、その後、神代文字は歴史上から姿を消しています。
縄文民族は洪水の被害を受けなかったものの、その後の内部侵食から時代が移りゆき、天皇の誕生とともに新たな言語で神話が書き換えれました。そのとき人々の記憶からも失われます。
貨幣と言語は作中で新しいものに移行されます。以前のものより精神的な結び付きが強いものが採用されています。しかし、移行は簡単ではなく旧勢力の反発があります。その戦いを描くことになります。
## 愛のない世界
この世界に「愛」という言葉は存在しません。
これはアイが予約しているため、この世界から失われています。
そこに住む人々もその言葉を使うことはありません。存在しないものは使えないからです。
これは一種の決まりみたいなものと考えてください。とはいえ、作者が忘れて入れてしまわないか心配ですが。
## 物理学
この作品は物理学が中心になります。
キャラクターの強さ(エネルギー)は`質量`で表現され、物理学では質量とエネルギーは等価と考えられています。
> E = mc^2
物理学の歴史は哲学によってはじまりました。昔の哲学者は万物は4つの元素によってできていると考えたのです。
## 原子とクオーク
その後、物質の究極の姿として「アトム」が考えられました。ギリシャ語に「アトモス」という言葉があり、「分割できない」という意味です。
物質の最小単位を意味するのがアトム(原子)というわけです。
原子が発見され、人類はこの原子こそ世界で最も小さい物質だと考えました。万物のもとは原子だと考えたのです。
しかし、科学技術が進歩し、それよりも小さい物質があったことが発見されます。素粒子です。
素粒子はクォークとレプトンに分けられます。そして、クォークにも沢山の種類があります。
物質は水や酸素といった分子でできていることがわかり、分子は原子でできていることがわかり、原子は電子と原子核でできていて、原子核は陽子と中性子でできていることがわかりました。
そして、陽子と中性子はクォークで構成されています。
つまり、現代物理学の最小単位はクオークというわけです。
## 量子のもつれ
量子とは原子以下の物質をいいます。例えば、原子、中性子、クオークは量子です。分子は量子ではありません。原子の上の単位が分子だからです。
- 分子 > 量子 : { 原子 > 原子核 > 中性子 > クオーク }
光より速いものは3つあります。宇宙の膨張、インフレーション、そして、量子のもつれです。
量子のもつれとは、対になった量子は片方が確定した瞬間、もう片方も確定するという性質のことです。量子はこの世界を形作るとても小さな物質のこと。そして、量子の領域は、今までの物理法則が適用されない領域でもあります。
## プレオン
プレオン星という架空の星があります。現在クオークが物質の最小単位と考えられていますが、それよりも小さい物質であるプレオン(架空のもの)が存在する場合に想定された星です。
プレオン星は中性子星と同じ原理で生成されます。中性子星は中性子でできていますが、これと同じように圧力が上がり続けると物質は小さいものに分割されていきます。分割がプレオンに到達し、プレオンでできている星をプレオン星といいます。
オクトカットはプレオンを発見し、オクターと名付けました。今はそれよりも小さい物質を探しているようです。
個人的にプレオン星は`マグネター`ではないかと考えています。つまり、マグネターは中性子星ではなく、まだ発見されていないクオークより小さい物質が天体になったケースなのではということです。オクターの由来はそのへんから来ています。
宇宙では小さいものほど強い力を持ちます。
例えば、中性子星やプレオン星、ブラックホールが挙げられます。
中性子星は中性子で構成されており半径15kmで地球の質量を上回ります。ブラックホールはそれより小さく強力です。
## ブラックホール
ここで、ブラックホールを例に質量や大きさを見ていきたいと思います。
ブラックホールの大きさは質量から計算できます。具体的にはシュバルツシルト半径を使います。
事象の地平線は重力により光すら抜け出せなくなる境界面のこと。これをブラックホールの大きさ(半径)とします。
> Rs = 2GM/c^2
>
> Rs = M/10^27
質量を10^27で割った数字がシュバルツシルト半径です。
では、宇宙最大のブラックホールである`フェニックスA`はどれくらいの質量、大きさを持つのでしょうか。
フェニックスAは太陽の1000億倍の質量を持ち、大きさは1000億kmです。
太陽自体がとても大きい天体で70万kmです。ブラックホールは基本的にとても小さな天体です。例えば、太陽規模の質量を持つブラックホールだと3kmくらいです。したがって、ブラックホールの大きさが1000億kmというのがどれほど規格外なのかわかります。
![](/img/3.png)
宇宙最大のブラックホール、フェニックスAはフェニックス銀河にあり、大量の恒星を生み出している銀河のことで、地球から57億光年離れた場所にあります。南天のほうおう座(Phoenix)にあることからフェニックス銀河と呼ばれています。
## ブラックホールの正体
ブラックホールの正体について解説します。
ブラックホールは黒い穴という意味ですが、この名前は適切ではありません。
ブラックホールは目に見えないけどそこにあるもの、そこにないけどそこにあるものが集中しただけですから、黒くもなければ穴でもありません。
中性子星がとても小さい物質の中性子でできているように、それよりも強力なクオーク星が中性子を構成しているクオークでできているように、プレオン星がクオークより小さいプレオンでできているように、ブラックホールもまた、より小さい物質が表面に現れているのです。
この作品ではまだ見ない小さい物質をアイと呼ぶので、アイ星と呼ぶのが適切なのでしょうか。
作中では、人類がブラックホール内部の様子を科学的に証明しはじめたあたりから宇宙の起源が完全解明され、宇宙の外の様子が少し垣間見えてくるという展開になります。
宇宙の外の様子がわかってくる理由は、その物質が宇宙誕生前から存在したものだからです。
宇宙には始まりがあります。したがって、終わりもあります。この物質には始まりがないので終わりもありません。最初からこの世界にあったものだと説明されます。
## ダークマター
宇宙を分析すると、その95%が謎の物質によって占められている計算になります。
具体的にはダークエネルギーが68%、ダークマターが27%と言われていて、ダークマターは未知の物質ともいいます。
ダークマターですが、これはダークマターという一つの物質がまだ見つからないというということではありません。未知の物質は複数あって、それらが見つかっていないということです。この場合、ブラックホールを構成しているのもダークマターの一つと言えるでしょう。
宇宙誕生前にも、もちろん物質は存在します。それを物質と表現するかどうかは微妙なところですが、とりあえず物質と表現しています。本作では最も小さいものを物質と表現しているからです。ただ、本当は少し違います。例えば、あなたは心や魂を物質と表現しますか。普通はしないでしょう。ですが、この世の全ては最も小さいものから構成されていますから、心や魂もそこからできているのです。
無から有は生まれず、宇宙の始まりも有からです。最初からなにかがあり、それが宇宙になったということです。
そして、そのなにかは一つではありません。たくさんあります。とはいえ、宇宙の始まりになったものを一つのものとして表現するほうがわかりやすくていいかもしれません。
仮にこれらを物質ということにして、宇宙が誕生するずっと前からあった物質と、宇宙誕生後にできた物質は違うわけです。
観測が難しいのは宇宙が誕生する前からあった物質です。
宇宙が誕生する前からあった物質がこの宇宙に紛れ込んでいて、ダークマターの大部分は宇宙誕生前からあるものと関係します。
## 重力とダークエネルギー
自然界で最も弱い力と考えられているのが重力です。
しかし、弱いからと言って影響力がないとは限りません。
実は宇宙では弱い力ほど絶大な影響力を持ちます。
重力は長い時間をかけて今の宇宙を形作っていますよね。
小さいものほど集まることができ、集まると強大なパワーを持つ。それと同じです。
重力より遥かに小さい力の作用をダークエネルギーといいます。つまり、重力よりも根源的に現在の宇宙を形作っている力があって、人間はそのような力の作用があることを知りません。あるいは発見できていないということなのでしょう。
## 創造の種
宇宙の始まりを`創造の種`と私は呼んでいます。
創造の種の成長、その由来は、種の外の世界にあります。つまり、宇宙の外ということです。
宇宙の外のエネルギーや原理があり、種は生まれ、成長します。
必ずしも種の内部だけにその答えがあるとは限らない。
宇宙の外がある以上、中だけではわからないことがたくさんあると思います。
## 神の意識
すべてのものに神が宿るという考えかた。
存在子であるアイはこの世界でこれ以上分割できない最小単位のこと。
それは存在の意識だけを持ち、存在の意識は神の意識という表現することも可能です。
つまり、この世界のすべてを構成しているものは神の意識を持っていて、すべてのものには神が宿ると言えます。
ただし、この場合の意識は人間が思うそれとは少し異なるかもしれません。
というのも、ここまで分割された最小単位だとそれ自体がそれなのだということです。
例えば皆様は、なにか小さな物体があって、それが存在の意識を持つ物体だと考えられているかもしれませんが、実はそうではありません。この場合、物体が意識であり、意識が物体なのです。物体と意識は同じものと考えます。そういった領域の話です。
アイ = 存在の意識 = 神の意識 = 存在 = 神
これらはすべて同じものを意味します。つまり、物質と精神は最終的に同じものです。
最も小さい物質のアイがなにかというと、この世界には一つとして同じものは存在しないということです。ですから、アイに分類されたものはすべて違うものです。
例えば、同じ量子に分類されてもそれらは異なる存在です。人間はこの違いに気付いていません。
物質の最小単位は存在の意識だけを持ち、他のものを持ちません。その意味でこの世界は夢であるなどの考えかたも、あながち間違いではないのです。なぜなら、すべては「存在の意識」から構成されているのですから。
## アイと哲学
物理学と哲学は本来、一つの学問でした。そのためこの作品は物理学的であり哲学的でもあります。
アイの力の源は`小さいもの`にあります。
一般的に「この世で最も強いのは大きいもの」と考える人は多いでしょう。
しかし、宇宙に目を向けると、一番小さいものが一番強いのです。
例えば、宇宙最強の天体といえばブラックホール。ブラックホールは宇宙で一番小さい天体です。
これがこの作品における一つの哲学になります。
アイの見た目が小さいのもそういった理由があります。
## アイの能力
アイの能力は「その世界で最も小さい物質に影響を及ぼす」と説明されています。
宇宙よりも広い概念を世界と呼ぶことにして、この世界はアイというキャラクターから始まりました。
つまり、この世界の全てのものはアイからできているということです。
このことはアイの能力に直結しています。
具体的にアイの能力を見ていきましょう。
といっても、アイというキャラクターには「人格のアイ」と「意識のアイ」があります。
能力については「意識のアイ」がその根源になっています。
アイは時々こんなことをいいます。
> アイ「道を知ることは、道を歩くこと」
ここでいう道というのは「存在」のこと。この作品でなにかわからないことがあるとき、そのほとんどは「存在」を意味していると考えてください。
読み替えると「その存在を知るには、その存在になること」とアイは言っています。
つまり、そのものにならなければ、そのものはわからない。だから、わたしたちは何も知らない。
アイはその能力により、その世界のすべての存在と共に道を歩くことができます。
しかし、その能力を使いながら意識を保つことは、想像を絶する精神力が必要なのかもしれません。
アイの能力の発現は、作中の中盤あたりで描かれます。
予言では「汝が見たもの、汝になる」と記されています。
「きみは、この世界で、嬉しいことも、悲しいことも目にするだろう。いつか、きみの目に映るものが」
作中でアイは修行したり、冒険したり、色々あって、宇宙人の襲撃にあいます。走馬灯のようにいくつかの人の人生を歩くアイ。アイの母親の言葉。立ち上がったアイの目に、雲に隠れていた月が現れる。
![](/img/5.png)
アイはそれを見て月の始まりを知ると同時に質量を得る。
はじめは普通の人よりちょっと強いだけの変わった人間でしたが、その後、アイはどんどん強くなっていきました。
## アイの剣
アイのゼンモードの輪っかは変形して剣にもなります。
その物質はこの世のものではないとも言われていますが、その正体に迫ります。
絶対に折れないこの剣もアイが普通の状態に戻ると鉄になります。
アイのゼンモードは頭の上に中性子星のようなものを作り、そのエネルギーをコントロールしようとした結果、重力的な影響からあのような形になり浮かんでいるものです。
そこで中性子星がどうやって誕生するのかを見てみましょう。
中性子星は恒星の大爆発とともに生まれます。
恒星のコアは元素が核融合を繰り返し、最終的に鉄になります。鉄は核融合しないためそこで核融合は停止します。
![](/img/2.png)
すると恒星の全成分が鉄のコアに向け落下します。
鉄は圧縮され、その周りの物質は原子核に近づいていきます。陽子は電子を捕獲し、中性子へと変化。中性子のみで構成された原子をニュートロニウムといいます。鉄は圧縮されますが、中性子はそれ以上小さくなりません。大爆発して中性子星になります。
ボース粒子は同じ場所に存在できますが、フェルミ粒子は空間に置くとその場所は埋まり他のものを置くことができません。これをパウリの排他原理といいます。
中性子星はそれ以上小さくできない中性子でできています。強力な重力によって物質は押しつぶされて小さくなりますが、中性子星はそれ以上小さくなりません。
ですが、ハイゼンベルクの不確定性原理により、超重力で物質の移動場所が正確に観測できる場合、粒子を置ける場所が増えると考えることができます。ですが、それによって増えた場所に物質を置くと、中心から事象の地平面が発生します。事象の地平面は現在の物理法則で計算できない領域のこと。視覚的に見ることができればいいのですが、それができないので計算するしかありません。計算できないので中がどうなっているのかはわかりません。
そこで中性子星にどんどんと物質を供給すると、やがて事象の地平面は天体の外枠に達し、ブラックホールへと変化します。
アイがゼンモードになる時間がながければ長いほど事象の地平面に飲み込まれていき、完全に飲まれた場合はもとに戻れなくなります。ただし、それまでに状態を戻すと鉄になりリセットされます。
## 月見 唯
アイの本名は`月見 唯(つきみ ゆい)`。東の国、特有の名前で登録されています。
物語は最も発展している西の国で繰り広げられ、アイも最初はそこで登場しますが、出身は東の国です。
自らをアイと名乗り、名前を持たなかったアイですが、その後、登場人物たちとの関わりによって国籍を得ます。その際につけられた名前が`月見 唯`になります。
今では珍しく名字と名前が分かれていて、この世界ではほとんどの人が名前だけです。
例えば、ポンタ(西の国出身)もキョウスケ(東の国出身)も名字はありません。
> 西の国の大広間、身寄りのない子どもたちが一同に集められている。
>
> そこには色々なものが置かれていて、いくつもの絵が飾られていた。
>
> みんなキョロキョロと周りを見渡した。
>
> 天井は広く、ガラス張りになっていて、青空の中、雲が通り過ぎていく。
>
> アイは一人階段を登り、そこにあった絵に目を向けた。
>
> そこには大きな金色の円が描かれている。
>
> コツコツコツ...誰かが廊下を歩いてくる。
>
> 恰幅の良い老人が絵を見ているアイの横で止まり、同じように絵に目を向けた。
>
> しばらくして老人が口を開く。
>
> 老人「君は、この絵が気になるのかね」
>
> アイ「...」
>
> 老人「これは月見、という絵だよ。君、月はよくみるの?」
>
> アイ「ううん」
>
> アイはそう言って首を振った
>
> 老人「え、みたことない?」
>
> アイ「うん」
>
> 老人「そ、そうなの...」(幼い子にはそういうこともあるんじゃの...そういえば孫も初めて見たのはいつじゃったじゃろう)
>
> アイ「でも...」
>
> 老人「うん?なにか気になることでも?」
>
> アイ「これどこかで見たような...」
>
> 老人「ほっほっほ、そりゃ、忘れとるだけじゃろ。そのうち思い出す。では、わしはこれで」
>
> アイ「うん、またね」
>
> 老人(この子の名前は月見にするかの...いや、名字があったほうがしっくりくるかも。あとで調べてみるか)
老人はここの所長。ここは色々決まってない子どもたちの登録等を行っている機関の一つ。
## 月の秘密
月の起源はまだよくわかっていません。不思議なことがいくつかあります。
例えば、地球から見た月と太陽の大きさが同じことです。どちらも距離と倍率は395らしい。
もう一つは古代文明の石碑には、ある時代以前のものに月の記述がないことです。
古代文明の石碑には様々な事が書かれており、大洪水の話がいくつかあります。世界各国に残された洪水伝説。それより前は月が存在しません。
> 宇宙人であったアヌンナキは月を移動させて大洪水を起こし、失敗作をリセットしていた。地球上の生命体はこれで5作品目である。
>
> 4作品目は、トカゲ型の知的生命体。大洪水の際、地底に逃れた。アヌンナキという神に仕える監視官ギギアは反乱を起こし、4作品目の生命体を一部滅びから逃すことを選択する。
>
> 宇宙船はこのトカゲ型生命の乗り物であり、地底人の乗り物である。
月の内部は巨大な空洞があります。そして、その表面はチタンで構成されており、人工物の特徴があります。
物語として面白いのは月には何らかの秘密が隠されているという話なので、そういった話をモデルにします。
アイは人工物である月を取り込んだため、自らの質量を重力的にコントロールできるようになります。
## 物語の進行
物語は`貨幣` -> `言語` -> `宇宙`というテーマで進みます。
理由は、これらが人間社会において最も影響力を及ぼすものだからです。
その影響は作中のキャラクター達も受けることになります。特に物語の始まりでは、その影響は大きいでしょう。
### 1. 貨幣の章
オクトカットの地球侵略は失敗したものの、その文化は地球に輸入され、基軸通貨は西国通貨から`アム`へと切り替わります。
一般的にはアムが発行する宇宙通貨をアム・コイン、またはアムといいます。
アムは宇宙最大のコンピュータがあるとされる星の名前。
アムのコインは持ち主の心を数値化します。
多くの宇宙人はこの数値を使って色々なものを交換するようです。
### 2. 言語の章
不思議なパワーを持つアイ文字に切り替わります。
オクトカットが使っていた文字の秘密が明かされます。
物質の形をモデルにしたとされているアイ文字ですが、その起源は神代文字にあると考えられています。
### 3. 宇宙の章
物質とアイの謎が明らかになります。

View File

@@ -0,0 +1,18 @@
+++
date = "2024-04-12T00:00:00+09:00"
tags = ["author"]
title = "世界の設定"
+++
シリアスな場面でも笑いを忘れずに。
そのような方向性で物語は進みます。
ここからは世界の設定、その裏側を紹介します。
作中の世界はどのようにできているのか、ということです。
この世界にも歴史があり、現実社会の史実に基づいて設計されています。
できる限り明るい世界観を描きます。

View File

@@ -0,0 +1,247 @@
+++
date = "2024-05-01T00:00:00+09:00"
tags = ["author"]
title = "構成と参照"
+++
## 心と技
漫画で一番重要なのは`心``魂`と呼ばれるものです。これは現実でも同じ。
ただし、それだけで漫画が描けるかというと、それは違う。
では漫画はどのように書けばいいのだろうか。その答えとしては「好きに書けばいい」となる。
この答えも非常に難しい。
好きなものを好きに書かなければ面白くならないし、好きなものを好きに書くだけでは面白くならない。
例えば、嫌なものを嫌々書いても面白い作品ができるとは思えない一方、好き勝手書いて面白い作品ができるかというと、そうはならない。
つまり、漫画を書くのはけっこう大変ってこと。
でも好きじゃなければ続けるのは難しい。
だから、漫画を書くのが好きだったほうがいい。
それを現した言葉が先程の「好きに書けばいい」ということになる。
私は面白いものが書きたいと思っていて、それは、読んだ人を楽しませたいと思っているから。
じゃあ読んだ人を楽しませるにはどうすればいいのかというと、これはテクニック、つまり、技術の問題でもある。
まずは、感情があって、心がある。自分が伝えたいこと、それがある。それがないと、その人の話はつまらないと思う。
だから自分が伝えたいことをどう面白く絵で伝えるのか、それが漫画。
では、どうやったら面白く伝えられるのか。ここではじめて技術が関係してくる。
例えば、後述する陰と陽の考え方がある。陰と陽の混じり合いで物語は面白くなる。
私が好きな瞬間というのもいくつかあって、
敵が味方になる瞬間。一人だと思っていたら、沢山の人が支えてくれていたことがわかる瞬間。本当のことがわかった瞬間。心が通じた瞬間。
その瞬間、その一コマのために、たくさんの物語を積み重ねていくのだと思う。
## 陰と陽
物語において、主人公のライバルの存在は非常に重要。
例えば、この世界が陰と陽でできているという考えがある。
必ず反対のものが存在するなら、物語においてもそのルールに則らなければならない。
それがライバルの存在であり、ライバルの存在は物語を面白くするポイントだと思う。
ライバルで有名なのは、悟空とベジータ、ナルトとサスケなど。これらは主人公の敵と言ってもいい。
ベジータやサスケに嫌悪感を示す人もたくさんいて、あのようなキャラクターは出すべきではない、最終的に始末したほうがよかったという意見がある。
最終的にどうするかは好みの問題だと思うけど、これらの作品においては、陰のキャラクターが物語を面白くしていると言っても過言ではないので、それを取り除くというのは、あり得ない。
やはり面白い作品というのは、陽ばかりのキャラクターではなく、陽と陰、その混じり合いで面白くなるのだと思う。
ただし、最終的にどうするかについては、好みの問題だと思う。
例えば、アベンジャーズは、最終的に敵、陰を討ち滅ぼすことで完結している。
ここは日本とアメリカでどのように描くか傾向が異なると思う。私はどちらも好きだし、どちらも面白く作るのは可能だと思う。
## 八咫烏
縄文時代から弥生時代に移り、天皇が誕生、東国の建国に繋がります。これを神武東征物語という。
以前からいた民族と新しく入ってきた民族が融合していく過程を描いています。
以前からいた民族を出雲、新しく入ってきた民族を大和といいます。
思想や気質の全く異なる民族ですが、出雲の王であったアヂスキタカヒコネ(迦毛大御神)は出雲を裏切り、最終的には勝利者側に協力した後、`八咫烏`と名乗ります。
表向きは神武天皇が大和の都を支配する形になりましたが、裏では八咫烏が支配するようにもなりました。これは八咫烏が`裏天皇`と呼ばれる所以です。その血脈は今なお受け継がれています。
八咫烏の三本足は天、地、人を現し、3という数字は太陽を現しています。その後、陰陽の思想を広めたと言われています。八咫烏は組織名になり、正式名称は八咫烏陰陽道。
## 童話と神話
まずは、童話と神話の話をします。
あらゆる文化作品(創作物)は、有名な神話や童話が元になっていることがよくあります。
ドラゴンボールの孫悟空は、中国の西遊記を元に書かれていて、如意棒と筋斗雲を使います。
ナルトは主に日本神話を引用しています。ライバルであるサスケがアマテラスやツクヨミの技を使い、スサノオを召喚します。
例えば、進撃の巨人には「ユミル」が登場します。
北欧神話には以下のような話があります。
> ユミル(巨人)はオーディン達の三兄弟に殺され、死んだユミルの体から世界が作られていった
なぜ、神話や童話が引用されるのかというと、最も広まった物語だからでしょう。
## 不死
不死にはよく2つのパターンがある。
一つは若返り、もう一つは乗っ取りである。
不死を求めるのは不完全な存在の証明であり、完全な存在の証明でもある。
大抵のボスは不死を求める。
コナンに出てくる黒の組織のボスは、私の推測になるが、不死を求めている。ある薬品を開発していて、その試作品であるアポトーシスの名にちなんだ`アポトキシン4869`は、低確率だが人間を幼児化させることがある。この場合のアポトーシスは老化細胞の自殺に関係すると予想する。ボスが幼児化のことを把握しているかはわからない。どれだけの人間を犠牲にしてでもその薬を完成させるつもりらしい。だが、ベルモットは幼児化を把握しており、若返りを求めている。だから組織が薬を完成させる前に潰れてしまうと困るが、完成させたあとに組織が残るのも困るという微妙な立場だと思う。ベルモットにとって最も理想的なシナリオは、完成と同時に薬を横取りした後、コナンが組織をぶっ潰してくれることだと考えている。
## 終局
最後のボスは、とことんしつこい。
やっと倒したと思ったら、倒していない。
ボスにはボスになるだけの理由があり、器がある。
そのボスは主人公達の力と同じ。
どんな卑怯な手を使っても蘇り向かってくる。
力の差があまりに大きい場合は、主人公が負けることもあるだろう。
ただし、主人公は諦めない。勝つまでやめない。
負けてもパワーアップして悪に挑み、最後に勝つ。
ここらへんを描くのは大変かもしれない。他の作品を参考にするといい。
## 元素
元素はゲームによく登場する「属性」のモデルになっています。
例えば、`原神`というゲームには元素があり、キャラクターは火や水などの元素を使って戦います。
私が思うに、ゲームには物理学を引用する作品が多く、漫画には神話や童話を引用する作品が多いと感じます。
その理由の一つとして考えられるのが文系と理系です。もしかすると開発者には理系が多く、小説家には文系が多いのかもしれませんね。
## 予言
現実には様々な予言書があります。例えば、日月神示やアカシックレコードなど。
物語において、予言書というものは重要な意味を持ちます。
これらは、確定した未来を予言するものではありません。小さな物質世界からすると、それはありえないのです。なぜありえないかというと、例えば、量子の振る舞いから説明できます。
とはいえ、それは後述することにして、まずは予言書が確定した未来を述べるものではなく、願望を述べるものに過ぎないということです。
しかし、その願望も未来に影響し、未来を形作るものの一つです。
したがって、物語において、予言の存在というのは重要な意味を持ちます。
## 秘密
秘密はあったほうが物語は面白くなる傾向にあると思う。
最近の漫画はほとんどに秘密があって、それが最後まで明かされない。
例外はドラゴンボールで、この漫画はそこまで秘密がない。あったとしてもサラッと明かされる事が多い。
この作品は「ある秘密があってそれを探し求める」という感じではなく、機会があれば明かされる感じにしたいと思う。
秘密をそこまで物語の主要な部分に位置づけない方向で考えている。
最も小さいものはいつも目の前にあって、どこにでもあるものだから。
## 月
巨大彗星説は日本人の方がみた夢がモデルになっています。
> ある時、不思議な夢を見た。巨大彗星が太陽に向かって進む。水が蒸発し、地球に降り注ぐ。それが大洪水になった。残った彗星は地球の周りを回りだした。
月の内部は水であるという話があります。
ただし、定説として考えられているのは、地球の形成初期に巨大な星が衝突し、それが地球と月になったというものです。これをジャイアント・インパクト説といいます。
## 量子
アインシュタインは神はサイコロを振らないといい、あらゆるものの挙動は最初から決まっていると考えていました。つまり、この世界はすべて必然であるという考えを持っていました。
反対にボーンは神が何をなさるかなど注文をつけるべきではないといい、つまり、偶然であると考えました。
量子のもつれは、決まっていない状態がまずあり、片方が確定した瞬間、もう片方の状態も確定するというものです。
この点において、あらゆるものは最初から決まっていると考えたアインシュタインが間違いであったとも言えます。
## ニュートロニウム
存在しなかったはずの原子、原子番号0のニュートロニウムについて書きます。
原子は中性子と陽子のバランスが大切で、バランスが崩れると放射性崩壊が起こり、違う原子になります。
違う原子になるということは、観測が難しいということです。
では中性子だけで構成された原子は存在するのでしょうか。
答えとしては「一瞬だけ存在する」です。
それがニュートロニウムです。
現在、ニュートロニウムが最も多く存在する場所は中性子星の内部です。
中性子星の内部では電子が陽子に押しつぶされて中性子になり、電子と陽子の融合。ベータ崩壊が起こり、ニュートロニウムが生成されます。生成と消滅を繰り返しているのか、一つの原子が長く継続しているのかはわかりませんが、一見すると、内部はニュートロニウムで満たされているでしょう。
## メトシェラ
メトシェラ星というものがあります。これはビックバンが始まる前から存在したのではないかという意見もあるくらい古くから存在する星と言われています。
ビックバンは138億年前に起こったと計算されています。私はその計算は間違いだと考えていて、ビックバンが起こったのは200億年以上前です。
それを前提に話をしますが、メトシェラ星の誕生はビックバンの後です。
## プラネット・ナイン
ほぼ確実に存在すると言われている太陽系、第9の惑星、プラネット・ナイン。
その惑星の中心に連星の動きが確認されていますが、未だ発見されていません。
第9惑星は原始ブラックホールであるという説があります。大きさは1m未満。休眠ブラックホールは連星を作ることがあり、多くの星がブラックホールを中心に回ります。地球に最も近いブラックホールも連星です。
## アマテラス粒子
ブラックホールやマグネター、それに類似する天体の合体から放出されるオーマイゴッド粒子やアマテラス粒子は1グラムで地球を破壊するレベルのエネルギーを持ちます。
例えば、ブラックホールとブラックホールがぶつかると天体の一部が飛ばされて宇宙を飛来します。
惑星や粒子の多くは神話にちなんだ名前が付けられています。これについては`宇宙`の章で語られるかもしれません。
## オクトカットのモデル
githubの`octocat`です。
- ref : [github/octocat](https://github.com/octocat)
## トロン
ケンという人物によって開発されたトロンというOSがあります。
東国は縄文時代以降、貨幣も言語も西国のものに置き換えられてしまいますが、このOSも同じような運命をたどります。
しかし、その後、世界に広まり最も使われるOSになります。

View File

@@ -5,12 +5,14 @@ date = "2024-01-22"
aliases = ['manga']
+++
地球で暮らしていたアイだったが、訳あって他の星で暮らし始めた
不思議な力を持つアイの冒険
ドラゴンのドライがついてきた
アイはその世界で最も小さい物質に影響を与える能力を持つ
<iframe src="https://manga.syui.ai" allowfullscreen frameborder="0" class="manga"></iframe>
`番外編`ではガララ星でドラゴンと暮らす話。
<!--more-->
https://manga.syui.ai

View File

@@ -4,12 +4,28 @@
<article>
<div class="content">
{{ if ne .Lastmod .Date }}<div class="post-time-date">{{ .Lastmod.Format "2006-01-02" }}</div>{{ end }}
<div class="post-time-date">
{{ if ne .Lastmod .Date }}
<p>{{ .Lastmod.Format "2006-01-02" }}</p>
{{ end }}
{{ $taxo := "tags" }}
{{ with .Param $taxo }}
<p><i class="fa-regular fa-folder"></i> {{ if gt (len .) 1 }}{{ end }}
{{ range $index, $director := . }}
{{- if gt $index 0 }}, {{ end -}}
{{ with $.Site.GetPage (printf "/%s/%s" $taxo $director) -}}
<a href="{{ .Permalink }}">{{ $director }}</a>
{{ end }}
{{ end }}
{{ end }}
</div>
<h1>{{ .Title }}</h1>
{{ .Content }}
</div>
</article>
{{ partial "next.html" . }}
{{ partial "comment.html" . }}
</div>

View File

@@ -1,14 +1,17 @@
{{ partial "head.html" . }}
{{ partial "navbar.html" . }}
{{ partial "header.html" . }}
{{ partial "content.html" . }}
{{ partial "sns.html" . }}
</div>
<div class="stars">
<!--
{{ partial "content.html" . }}
{{ partial "particles.html" . }}
{{ partial "nasa.html" . }}
{{ partial "galaxy.html" . }}
-->
{{ partial "star.html" . }}
</div>
{{ partial "footer.html" . }}

View File

@@ -7,7 +7,7 @@
{{ range .Data.Pages }}
{{ $t := index (split .Permalink "/") 3 }}
{{ if or (eq $t "blog") (eq $t "novel") }}
{{ if or (eq $t "blog") }}
<li class="top">
<a href="{{.Permalink}}">{{ $t }}</a> <a class="li-link-left" href="{{ .Site.BaseURL }}/{{ $t }}/index.xml"><i class="fa-solid fa-rss"></i></a>
</li>

View File

@@ -1 +1,12 @@
<div class="footer-qr">
<a href="/"><span class="footer-link"><img src="/qr.svg"></span></a>
</div>
<div class="footer-link">
<span class="footer-link"><a href="https://bsky.app/profile/yui.syui.ai" target="_blank"><i class="fab fa-bluesky"></i></a></span>
<span class="footer-link"><a href="https://card.syui.ai/ai" target="_blank"><span class="icon-ai"></span></a></span>
<span class="footer-link"><a href="https://git.syui.ai/ai" target="_blank"><span class="icon-git"></span></a></span>
<!--
<span class="footer-link"><a href="https://syui.ai/" target="_blank"><span class="icon-syui"></span></a></span>
-->
</div>
<footer id="footer">© <a href="https://syui.ai">syui</a></footer>

View File

@@ -1,4 +1,4 @@
<iframe src="/pkg/galaxy/?star=fff700&in=fff700&out=fff700&bg=0x000000" allowfullscreen frameborder="0" style="width:100%;height:700px;"></iframe>
<iframe src="/pkg/galaxy/?star=fff700&in=fff700&out=fff700&bg=0x000000" allowfullscreen frameborder="0" style="width:100%;height:600px;"></iframe>
<!--
<iframe src="/pkg/galaxy/" allowfullscreen frameborder="0" style="width:100%;height:700px;"></iframe>
-->

View File

@@ -5,8 +5,8 @@
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="{{ .Site.Author.name }}" />
<meta name="copyright" content="© {{ .Site.Author.name }}" />
<meta name="author" content="{{ .Site.Params.Author }}" />
<meta name="copyright" content="© {{ .Site.Params.Author }}" />
<meta name="description" content="ai" />
<meta name="keywords" content="ai" />
<meta name="robots" content="all" />

View File

@@ -5,8 +5,8 @@
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="{{ .Site.Author.name }}" />
<meta name="copyright" content="© {{ .Site.Author.name }}" />
<meta name="author" content="{{ .Site.Params.Author }}" />
<meta name="copyright" content="© {{ .Site.Params.Author }}" />
<meta name="description" content="ai" />
<meta name="keywords" content="ai" />
<meta name="robots" content="all" />
@@ -31,7 +31,6 @@
"url": "{{ .Site.BaseURL }}"
}
</script>
<script src="/js/index.js"></script>
{{ range .AlternativeOutputFormats -}}
{{ printf `<link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }}

View File

@@ -12,15 +12,7 @@
</header>
<div class="containerx">
{{ if eq $o "" }}
<div class="hotkeys-docs">
<table>
<tbody>
<tr>
<td class="bg"><code>ctrl</code> + <code>enter</code></td>
</tr>
</tbody>
</table>
</div>
<span class="menu-right-top">
<!--
<a class="menu-link-left" href="/bitcoin"><i class="fa-brands fa-bitcoin"></i></a>
@@ -30,12 +22,13 @@
<script src=/bitcoin/chunk-vendors.js></script>
<script src=/bitcoin/app.js></script>
-->
<a class="menu-link-left-black" href="https://card.syui.ai/ai"><span class="icon-card"></span></a>
<a class="menu-link-left-black" href="https://manga.syui.ai"><span class="icon-book"></span></a>
<a class="menu-link-left-black" href="https://vrm.syui.ai"><span class="icon-game"></span></a>
<a class="menu-link-left-black" href="https://term.syui.ai"><span class="icon-aiterm"></span></a>
<a class="menu-link-left-black" href="https://git.syui.ai/ai"><span class="icon-git"></span></a>
<a class="menu-link-left-black" href="/private"><i class="fa-solid fa-list"></i></a>
</span>
{{ end }}

View File

@@ -1,6 +1,8 @@
<div class="sns-link">
<p>
<i class="fa-brands fa-bluesky"></i> <a href="https://bsky.app/profile/yui.syui.ai" target="_blank" class="bluesky-icon">yui.syui.ai</a>
<i class="fa-brands fa-bluesky"></i> <a href="https://bsky.app/profile/yui.syui.ai" target="_blank" class="bluesky-icon">@yui.syui.ai</a>
</p>
<p>
<span class="icon-git"></span> <a href="https://git.syui.ai/ai" target="_blank" class="bluesky-icon">@git.syui.ai:ai</a>
</p>
<p><i class="fab fa-mastodon"></i> <a rel="me" href="https://mstdn.syui.ai/@ai" target="_blank">@ai@syui.ai</a>
</div>

View File

@@ -1,6 +1,8 @@
<div class="nasa">
<iframe src="https://eyes.nasa.gov/apps/solar-system/#/sun/distance?to=earth" allowfullscreen frameborder="0" style="width:100%;height:700px;"></iframe>
<iframe src="https://eyes.nasa.gov/apps/solar-system/#/sun/distance" allowfullscreen frameborder="0" style="width:100%;height:700px;"></iframe>
</div>
<!--
https://eyes.nasa.gov/apps/solar-system/#/story/voyager_grand_tour?slide=slide_2
https://eyes.nasa.gov/apps/solar-system/#/story/voyager_grand_tour?slide=slide_2
<iframe src="https://eyes.nasa.gov/apps/solar-system/#/sun/distance?to=earth" allowfullscreen frameborder="0" style="width:100%;height:700px;"></iframe>
-->

View File

@@ -3,15 +3,19 @@
<div class="navbar-nav">
<span class="navbar-title-text"><a href="/"><span class="icon-ai"></span></a></span>
<div class="navbar-nav-left">
<!--
<a class="navbar-brand" href="/chara">キャラクター</a>
<a class="navbar-brand" href="/story">ストーリー</a>
<a class="navbar-brand" href="/card">カード</a>
<a class="navbar-brand" href="/blog">ブログ</a>
<a class="navbar-brand" href="/item">アイテム</a>
-->
</div>
</div>
<div class="navbar-nav-right">
<!--
<a class="menu-link-left" href="https://syui.fanbox.cc/shop" target="_blank"><i class="fa-solid fa-bag-shopping"></i></a>
-->
<a class="menu-link-left" href="https://bsky.app/profile/yui.syui.ai" target="_blank"><i class="fa-brands fa-bluesky"></i></a>
</div>
</div>

View File

@@ -0,0 +1,16 @@
<nav id="article-nav">
<div class="previnsection">
<!--
{{ if .PrevInSection }}
<p><i class="fa-solid fa-circle-chevron-left"></i> <a href="{{ .PrevInSection.Permalink }}" id="article-nav-older" class="article-nav-link-wrap">
{{ .PrevInSection.Title }}
</a></p>
{{ end }}
-->
{{ if .NextInSection }}
<p><i class="fa-solid fa-circle-chevron-right"></i> <a href="{{ .NextInSection.Permalink }}" id="article-nav-newer" class="article-nav-link-wrap">
{{ .NextInSection.Title }}
</a></p>
{{ end }}
</div>
</nav>

18
layouts/partials/sns.html Normal file
View File

@@ -0,0 +1,18 @@
<div id="container">
<div class="outer">
<div class="sns-message">
<img src="/icon/avatar.png">
<p>hello, ai ! <a href="https://git.syui.ai/ai/bot">bot</a> written in rust, it runs on an arch based <a href="https://git.syui.ai/ai/os">aios</a>.</p>
<p>there is an original story and a game.</p>
</div>
<div class="hotkeys-docs">
<table>
<tbody>
<tr>
<td class="bg"><code>ctrl</code> + <code>enter</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>

View File

@@ -0,0 +1 @@
<iframe src="/pkg/solar/" allowfullscreen frameborder="0" style="width:100%;height:700px;"></iframe>

View File

@@ -0,0 +1,2 @@
<iframe src="https://card.syui.ai/planet?ms=0&g=moon" allowfullscreen frameborder="0" style="width:95%;height:600px;" id="planet"></iframe>
<script src="/js/index.js"></script>

View File

@@ -22,3 +22,10 @@
- [icomoon](https://icomoon.io/app/#/select)
- [font-awesome](https://github.com/FortAwesome/Font-Awesome)
- [hotkeys-jp](https://github.com/jaywcjlove/hotkeys-js)
- [particles.js](https://github.com/VincentGarreau/particles.js)
## ref
- [galaxy](https://github.com/the-halfbloodprince/GalaxyM1199)
- [solar-sys](https://github.com/solarcg/SolarSys)

BIN
static/card/0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
static/card/0.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
static/card/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 KiB

BIN
static/card/1.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

BIN
static/card/10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 933 KiB

BIN
static/card/10.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

BIN
static/card/11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 KiB

BIN
static/card/11.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
static/card/12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 KiB

BIN
static/card/12.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
static/card/13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

BIN
static/card/13.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
static/card/14.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

BIN
static/card/14.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
static/card/15.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 KiB

BIN
static/card/15.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
static/card/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

BIN
static/card/2.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
static/card/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 KiB

BIN
static/card/3.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
static/card/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 KiB

BIN
static/card/4.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
static/card/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 KiB

BIN
static/card/5.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
static/card/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 KiB

BIN
static/card/6.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
static/card/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 KiB

BIN
static/card/7.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
static/card/8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

BIN
static/card/8.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
static/card/9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 KiB

BIN
static/card/9.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

7
static/css/nasa.css Normal file
View File

@@ -0,0 +1,7 @@
span.story-related-list {
display: none;
}
#story-list{
display:none;
}

View File

@@ -1,6 +1,6 @@
body {
display:block;
background-color: #f1f1f1;
background-color: #313131;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
width:100%;
margin:0;
@@ -46,17 +46,35 @@ article {
.stars {
background: #313131;
text-align: center;
}
footer.footer {
/* margin-top:100px; */
text-align: center;
height:60px;
padding-top:100px;
color: #fff700;
.footer-link {
font-size: 20px;
background-color:#313131;
position: relative;
padding: 100px 0 0 0;
text-align: center;
background: #313131;
}
span.footer-link a span.icon-git {
font-size: 20px;
}
span.footer-link a span.icon-syui {
font-size: 20px;
}
span.footer-link a span.icon-ai {
font-size: 20px;
}
span.footer-link a {
padding: 10px;
color: #fff700;
}
span.footer-link a:hover {
color: #ddd700;
}
footer.footer a {
@@ -66,7 +84,7 @@ footer.footer a {
footer#footer {
text-align: center;
height:60px;
padding-top:100px;
padding-top:40px;
color: #fff700;
font-size: 20px;
background-color:#313131;
@@ -128,6 +146,7 @@ span.green {
h3 {
margin-bottom: 4px;
font-size: 17px;
}
nav#article-nav {
@@ -158,17 +177,7 @@ ul.cp_list li > p > a {
ul.cp_list li > span.icon-moon {
color: #0e0e0e;
}
.footer-link > a > i.fab.fa-twitter {
color: rgba(52 135 236);
}
.footer-link > a > i.fab.fa-github {
color: rgba(1 1 1);
}
.footer-link > a > i.fas.fa-rss {
color: #f4a316;
font-size: 23px;
}
i.fa-brands.fa-slack {
color: #b8cfe0;
}
@@ -188,17 +197,6 @@ a.matrix-icon {
bottom: 4px;
}
.footer-link > a > span.icon-ai {
font-size:25px;
color: #beb801;
margin:10px;
}
.footer-link > a > span.icon-api {
font-size:25px;
margin:10px;
}
h3 span.icon-phoenix-world {
font-size: 0.8em;
}
@@ -224,12 +222,10 @@ pre > code {
letter-spacing: 0;
}
.footer-link {
font-size:30px;
text-align: center;
}
.footer-link > a > i {
padding:9px;
h1 {
font-size: 24px;
line-height: 2.5rem;
padding:2rem 0;
}
h2 {
@@ -267,19 +263,6 @@ ins.adsbygoogle {
padding:15px 0 15px 0;
}
.footer-link > a > i.fab.fa-mastodon {
color:#945ecd;
}
.footer-link > a > i.fab.fa-git-alt {
color:#4cae2e;
}
.footer-link > a > span.icon-home {
font-size: 27px;
padding: 7px;
}
.moji p img {
width: 128px;
}
@@ -382,6 +365,7 @@ iframe.manga {
header#header {
position: relative;
background: linear-gradient(#313131, #313131);
}
#minimap {
@@ -512,7 +496,7 @@ header#header {
}
nav.navbar.navbar-expand-lg.navbar-light.bg-light{
border-bottom: solid 2px #f1f1f1;
border-bottom: solid 1px #fff700;
background: #313131;
}
@@ -1034,9 +1018,6 @@ span.icon-ai {
color: #fff700;
}
span.navbar-title-text > a span.icon-ai {
}
.top-menu {
margin: 50px 0px 20px 0px;
}
@@ -1323,6 +1304,16 @@ img#sun-img-button:hover {
background:#fff700a6;
}
pre > code > span {
padding: 20px;
line-break: anywhere;
word-break: break-all;
}
.sns-link p span.icon-git {
font-size: 20px;
}
@media screen and (max-width:1000px) {
html {
font-size: 100%;
@@ -1357,3 +1348,28 @@ img#sun-img-button:hover {
}
}
.sns-message {
padding: 10px;
background-color: #f1f1f1;
}
.sns-message p {
padding: 10px ;
}
.sns-message img {
background-color:#fff;
width:80px;
border-radius:7px;
border: solid 1px #313131;
margin: 30px;
float: left;
}
.footer-qr {
text-align:center;
margin: 100px 0 100px 0;
}
span.footer-link img {
width: 200px;
}

BIN
static/img/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
static/img/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

BIN
static/img/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

BIN
static/img/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 KiB

BIN
static/img/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@@ -10,3 +10,29 @@ function blog_list_open() {
}
}
function replace() {
const link = document.getElementById('planet');
const date = new Date();
const durl = 'https://card.syui.ai/planet';
let url;
let u = date.getSeconds().toString().substr(-1);
console.log(u);
switch (u) {
case '0':
url = durl + "?ms=0&g=sun";
break;
case '1':
url = durl + "?ms=0&g=galaxy";
break;
case '2':
url = durl + "?ms=0&g=neutron";
break;
case '3':
url = durl + "?ms=0&g=earth";
break;
default:
url = durl + "?ms=0&g=moon";
}
link.setAttribute('src', url);
}
replace();

View File

@@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ai/galaxy</title><script defer="defer" src="bundle.4f0abc4a7f1c1822a177.js"></script><link href="main.css" rel="stylesheet"></head><body><canvas class="webgl"></canvas></body></html>
<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ai/galaxy</title><script defer="defer" src="bundle.4c347c94d39def84ca4a.js"></script><link href="main.css" rel="stylesheet"></head><body><canvas class="webgl"></canvas></body></html>

View File

@@ -0,0 +1,12 @@
{
"files": {
"main.css": "/static/css/main.92fa641e.css",
"main.js": "/static/js/main.b512e4d7.js",
"static/js/206.0f0ec2dd.chunk.js": "/static/js/206.0f0ec2dd.chunk.js",
"index.html": "/index.html"
},
"entrypoints": [
"static/css/main.92fa641e.css",
"static/js/main.b512e4d7.js"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -0,0 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>React App</title><script defer="defer" src="./static/js/main.b512e4d7.js"></script><link href="./static/css/main.92fa641e.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

View File

@@ -0,0 +1 @@
body,html{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#000;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}div#root{height:100%}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.App{text-align:center}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion:no-preference){.App-logo{animation:App-logo-spin 20s linear infinite}}.App-header{align-items:center;background-color:#282c34;color:#fff;display:flex;flex-direction:column;font-size:calc(10px + 2vmin);justify-content:center;min-height:100vh}.App-link{color:#61dafb}@keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}

View File

@@ -0,0 +1 @@
"use strict";(self.webpackChunkgalaxy=self.webpackChunkgalaxy||[]).push([[206],{206:(e,t,n)=>{n.r(t),n.d(t,{getCLS:()=>y,getFCP:()=>g,getFID:()=>C,getLCP:()=>P,getTTFB:()=>D});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},f=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,p=function(){return"hidden"===document.visibilityState?0:1/0},d=function(){f((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=p(),d(),s((function(){setTimeout((function(){v=p(),d()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(f&&f.disconnect(),e.startTime<i.firstHiddenTime&&(r.value=e.startTime,r.entries.push(e),n(!0)))},o=window.performance&&performance.getEntriesByName&&performance.getEntriesByName("first-contentful-paint")[0],f=o?null:c("paint",a);(o||f)&&(n=m(e,r,t),o&&a(o),s((function(i){r=u("FCP"),n=m(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,n(!0)}))}))})))},h=!1,T=-1,y=function(e,t){h||(g((function(e){T=e.value})),h=!0);var n,i=function(t){T>-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},p=c("layout-shift",v);p&&(n=m(i,r,t),f((function(){p.takeRecords().map(v),n(!0)})),s((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,F(removeEventListener),S())},S=function(){if(r>=0&&r<a-w){var e={entryType:"first-input",name:i.type,target:i.target,cancelable:i.cancelable,startTime:i.timeStamp,processingStart:i.timeStamp+r};o.forEach((function(t){t(e)})),o=[]}},b=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},F=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},C=function(e,t){var n,a=l(),v=u("FID"),p=function(e){e.startTime<a.firstHiddenTime&&(v.value=e.processingStart-e.startTime,v.entries.push(e),n(!0))},d=c("first-input",p);n=m(e,v,t),d&&f((function(){d.takeRecords().map(p),d.disconnect()}),!0),d&&s((function(){var a;v=u("FID"),n=m(e,v,t),o=[],r=-1,i=null,F(addEventListener),a=p,o.push(a),S()}))},k={},P=function(e,t){var n,i=l(),r=u("LCP"),a=function(e){var t=e.startTime;t<i.firstHiddenTime&&(r.value=t,r.entries.push(e),n())},o=c("largest-contentful-paint",a);if(o){n=m(e,r,t);var v=function(){k[r.id]||(o.takeRecords().map(a),o.disconnect(),k[r.id]=!0,n(!0))};["keydown","click"].forEach((function(e){addEventListener(e,v,{once:!0,capture:!0})})),f(v,!0),s((function(i){r=u("LCP"),n=m(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,k[r.id]=!0,n(!0)}))}))}))}},D=function(e){var t,n=u("TTFB");t=function(){try{var t=performance.getEntriesByType("navigation")[0]||function(){var e=performance.timing,t={entryType:"navigation",startTime:0};for(var n in e)"navigationStart"!==n&&"toJSON"!==n&&(t[n]=Math.max(e[n]-e.navigationStart,0));return t}();if(n.value=n.delta=t.responseStart,n.value<0||n.value>performance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,72 @@
/**
* @license
* Copyright 2010-2024 Three.js Authors
* SPDX-License-Identifier: MIT
*/
/**
* @license React
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-reconciler-constants.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-reconciler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* postprocessing v6.36.0 build Thu Jul 25 2024
* https://github.com/pmndrs/postprocessing
* Copyright 2015-2024 Raoul van Rüschen
* @license Zlib
*/

View File

@@ -0,0 +1,61 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Sketchfab Viewer API example</title>
<script type="text/javascript" src="https://static.sketchfab.com/api/sketchfab-viewer-1.12.1.js"></script>
</head>
<body>
<iframe id="api-frame" class="w-full" width="100%" style="position:fixed; top:0; left:0; bottom:0; right:0; width:100%; height:100%;" allow="xr-spatial-tracking; autoplay; fullscreen; xr-spatial-tracking; accelerometer" xr-spatial-tracking web-share frameborder="no" scrolling="no" ></iframe>
<script type="text/javascript">
var iframe = document.getElementById( 'api-frame' );
var uid = 'd6521362b37b48e3a82bce4911409303';
var client = new Sketchfab( iframe );
var api;
client.init( uid, {
success: function onSuccess( api ){
api.start({ preload:1 });
api.addEventListener( 'viewerready', function() {
api.getCameraLookAt((err, camera) => {
if (err) return console.error('カメラ取得失敗');
const direction = [
camera.position[0] - camera.target[0],
camera.position[1] - camera.target[1],
camera.position[2] - camera.target[2]
];
const zoomFactor = 0.01;
const newPosition = [
camera.target[0] + direction[0] * zoomFactor,
camera.target[1] + direction[1] * zoomFactor,
camera.target[2] + direction[2] * zoomFactor
];
api.setCameraLookAt(newPosition, camera.target, 10, (err) => {
if (!err) console.log('ズームアウト成功');
});
});
} );
},
error: function onError() {
console.log( 'Viewer error' );
},
camera:1,
autospin: 0,
preload: 0,
ui_controls: 0,
ui_infos: 0,
ui_inspector: 0,
ui_stop: 0,
ui_watermark: 0,
ui_watermark_link: 0,
ui_annotations: 0,
ui_hint: 0,
ui_ar:0,ui_help:0,
ui_settings:0,
ui_vr:0,
ui_fullscreen:0,
ui_loading: 0,
} );
</script>
</body>
</html>

View File

@@ -0,0 +1,175 @@
body {
color: #ffffff;
font-family: "Segoe UI", Myriad, Helvetica, Arial, "DejaVu Sans", "Noto Sans CJK SC", "Source Han Sans SC";
font-size: 20px;
text-align: left;
background-color: #000000;
margin: 0px;
overflow: hidden;
}
.small {
font-size: 12px;
}
#container {
text-align: center;
width: 100%;
height: 100%;
}
#info {
text-align: center;
position: absolute;
top: 0px;
width: 100%;
padding: 5px;
}
h3, p {
margin-top: 5px;
margin-bottom: 5px;
}
img {
margin-top: 10px;
max-width:100% !important;
height:30% !important;
}
a {
color: #ffffff;
outline: none;
text-decoration: none;
}
a:hover, a:focus {
color: #ffffff;
}
.progress {
display: inline-block;
font-size: 18px;
color: #ffffff !important;
text-decoration: none !important;
margin-top: 20px;
padding: 6px 70px;
line-height: 1;
overflow: hidden;
position: relative;
border-style: solid;
border-width: 1px;
border-color: #ffffff;
border-radius: 15px;
background-color: transparent;
transition: box-shadow 0.5s;
-moz-transition: box-shadow 0.5s;
-o-transition: box-shadow 0.5s;
-webkit-transition: box-shadow 0.5s;
}
.progress:hover, .progress:focus {
box-shadow: 0px 0px 30px #ffffffaa;
transition: box-shadow 0.5s;
-moz-transition: box-shadow 0.5s;
-o-transition: box-shadow 0.5s;
-webkit-transition: box-shadow 0.5s;
}
.progress.in-progress,
.progress.finished {
color: transparent !important;
}
.progress.in-progress:after,
.progress.finished:after {
position: absolute;
z-index: 2;
width: 100%;
height: 100%;
text-align: center;
top: 0;
padding-top: inherit;
color: #000000 !important;
left: 0;
}
/* If the .in-progress class is set on the button, show the
contents of the data-loading attribute on the butotn */
.progress.in-progress:after {
content: attr(data-loading);
}
/* The same goes for the .finished class */
.progress.finished:after {
content: attr(data-finished);
}
/* The colorful bar that grows depending on the progress */
.progress .tz-bar {
background-color: #ffffff;
height: 3px;
bottom: 0;
left: 0;
width: 0;
position: absolute;
z-index: 1;
border-radius: 0 0 2px 2px;
-webkit-transition: width 0.5s, height 0.5s;
-moz-transition: width 0.5s, height 0.5s;
transition: width 0.5s, height 0.5s;
}
/* The bar can be either horizontal, or vertical */
.progress .tz-bar.background-horizontal {
height: 100%;
border-radius: 2px;
}
.progress .tz-bar.background-vertical {
height: 0;
top: 0;
width: 100%;
border-radius: 2px;
}
/*----------------------------
Color themes
-----------------------------*/
.progress.red {
background-color: #e6537d;
background-image: -webkit-linear-gradient(top, #e6537d, #df5179);
background-image: -moz-linear-gradient(top, #e6537d, #df5179);
background-image: linear-gradient(top, #e6537d, #df5179);
}
.progress.red .tz-bar {
background-color: #6876b4;
}
.progress.green {
background-color: #64c896;
background-image: -webkit-linear-gradient(top, #64c896, #5fbd8e);
background-image: -moz-linear-gradient(top, #64c896, #5fbd8e);
background-image: linear-gradient(top, #64c896, #5fbd8e);
}
.progress.green .tz-bar {
background-color: #9e81d6;
}
.key-h {
text-align: left;
padding:0 10px 10px 10px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View File

@@ -0,0 +1,70 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>ai/solar</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link rel="stylesheet" type="text/css" href="css/solar.css">
</head>
<body>
<div id="container" >
<!--
<div id="prompt">
<img src="res/loading/splash.png" width="60%"/>
<h3>PALE DOTS</h3>
<p>A mesmerizing journey around the solar system</p>
<p class="small">This splash screen comes from screenshots of the project</p>
<a id="control" href="#" class="progress">Start</a>
</div>
-->
</div>
<div>
<audio id="promptSound" src="res/prompt/ding.wav" />
</div>
<div id="info">
<!-- Libraries -->
<script src="js/libs/jquery-3.2.1.min.js"></script>
<script src="js/libs/three.min.js"></script>
<script src="js/libs/stats.min.js"></script>
<script src="js/libs/tween.min.js"></script>
<script src="js/renderers/Projector.js"></script>
<script src="js/renderers/CanvasRenderer.js"></script>
<script src="js/libs/OBJLoader.js"></script>
<script src="js/libs/MTLLoader.js"></script>
<script src="js/libs/GPUParticleSystem.js"></script>
<script src="js/libs/FirstPersonControls.js"></script>
<script src="js/index.js"></script>
<!-- Loaders -->
<script>var textureLoader = new THREE.TextureLoader();</script>
<script>var objLoader = new THREE.OBJLoader();</script>
<script>var mtlLoader = new THREE.MTLLoader();</script>
<!-- Shaders -->
<script src="js/shaders.js"></script>
<!-- Global timing -->
<script src="js/time.js"></script>
<!-- Camera parameters -->
<!-- Note: THREE.js camera is not in this script. -->
<!-- This file contains an object for calculating camera position. -->
<script src="js/cameraParameters.js"></script>
<!-- Celestial body abstract -->
<script src="js/CelestialBody.js"></script>
<!-- Orbit function -->
<script src="js/orbit.js"></script>
<!-- Data -->
<script src="js/data.js"></script>
<!-- Data -->
<!-- Planet loader -->
<!-- Animation -->
<script src="js/animation.js"></script>
<!-- Controls -->
<script src="js/control.js"></script>
<script src="js/libs/dat.gui.min.js"></script>
<!-- Initializers -->
<script src="js/main.js"></script>
<div class="key-h">
<button id="key-h" onclick="key_press_h();">h</button>
</div>
</body>
</html>

View File

@@ -0,0 +1,407 @@
// Celestial body constructor
var CelestialBody = function (obj) {
// Meta
this.name = "";
// If the planet is the sun
this.star = false;
// Object shape info
this.spherical = true;
this.oblateness = 0.;
this.radius = 1.;
this.isComet = false;
this.particleSystem = null;
// Parent/moon objects
this.parent = null;
this.children = [];
// TODO: Model info, to be implemented
// Orbit parameters
// 周期(恒星)、半长轴、离心率、倾角、升交点黄经、平近点角 (历时原点假设轨道是圆形时的黄经偏移)
this.position = {
x: 0, y: 0, z: 0,
};
this.obj = {
path: null, objPath: null, mtlPath: null,
scale: 1., angle: 0., x: 0., y: 0., z: 0.
};
this.orbit = {
period: 1., semiMajorAxis: 1., eccentricity: 0.,
inclination: 0., ascendingNode: 0., meanLongitude: 0.
};
// Rotation parameters
// 周期恒星、倾角黄赤夹角、子午角自转轴所在的与黄道垂直的平面即子午面与xOy平面的夹角、历时原点角度偏移
// 注这里我们使用xOz平面作为黄道面
this.rotation = {
period: 1., inclination: 1.,
meridianAngle: 0., offset: 0.
};
// 远景时显示光芒的参数设定
// albedo 为反照率
// 下面给出一个该把这个光点画多亮的粗略估计(只是用来看的,不是很严谨)
// x > R/k: (2 - <c, p>/(|c|*|p|)) * R^2 * a * log(k*x0/R) / log(k*x/R)
// else: 0
// 其中a是反照率记号<,>表示内积,|.|是二范数c是摄像机坐标p是天体坐标
// R 是天体半径x 是距天体的距离,即|c - p|k 是一个系数
this.albedo = 1.;
this.shineColor = 0xffffff;
// Material settings
this.material = {
// "phong", "lambert", "basic"
type: "phong",
diffuse: {map: null, color: 0xffffff},
specular: {map: null, color: 0xffffff, shininess: 25},
night: {map: null},
bump: {map: null, height: 10}
};
// Planet ring definitions
this.ring = {
map: null,
lower: 2000, higher: 6000,
color: 0xffffff, specularColor: 0xffffff, specularPower: 5
};
// halo effect
this.halo = {
color: null,
radius: 1.
};
this.atmosphere = {
cloud: {
map: null, height: 1, speed: 20
},
// By wave length
scattering: false,
atmosphereColor: new THREE.Vector3(0.5, 0.7, 0.8),
sunsetColor: new THREE.Vector3(0.8, 0.7, 0.6),
atmosphereStrength: 1.0,
sunsetStrength: 1.0
};
mergeRecursive(this, obj);
};
function mergeRecursive(obj1, obj2) {
for (var p in obj2) {
try {
//Property in destination object set; update its value.
if (obj2[p].constructor == Object) {
obj1[p] = mergeRecursive(obj1[p], obj2[p]);
} else {
obj1[p] = obj2[p];
}
} catch (e) {
//Property in destination object not set; create it and set its value.
obj1[p] = obj2[p];
}
}
return obj1;
}
// lens flare texture
CelestialBody.prototype.flareTexture = textureLoader.load("res/effects/flare.jpg");
// IMPORTANT: This function of the prototype generate the object and put it on
// the scene. This is the most most important part in drawing the object.
CelestialBody.prototype.generateObjectsOnScene = function (argScene) {
var that = this;
// if(this.spherical)
if (!this.spherical) {
if (this.isComet) {
this.cometPivot = new THREE.Group();
this.objectGroup = new THREE.Group();
this.particleSystem = new THREE.GPUParticleSystem({
maxParticles: 150000
});
this.objectGroup.add(this.particleSystem);
argScene.add(this.objectGroup);
} else {
this.objectGroup = new THREE.Group();
var onProgress = function (xhr) {
if (xhr.lengthComputable) {
var percentComplete = xhr.loaded / xhr.total * 100;
}
};
var onError = function (xhr) {
};
if (that.obj.mtlPath != null) {
mtlLoader.setPath(that.obj.path);
mtlLoader.load(that.obj.mtlPath, function (materials) {
materials.preload();
objLoader.setMaterials(materials);
objLoader.setPath(that.obj.path);
objLoader.load(that.obj.objPath, function (object) {
that.objectGroup.add(object);
var scale = that.obj.scale;
object.rotateY(that.obj.angle / 180.0 * Math.PI);
object.scale.set(scale, scale, scale);
object.translateX(that.obj.x);
object.translateY(that.obj.y);
object.translateZ(that.obj.z);
}, onProgress, onError);
});
} else {
objLoader.setPath(that.obj.path);
objLoader.load(that.obj.objPath, function (object) {
object.traverse(function (child) {
var material = new THREE.MeshLambertMaterial();
if (child instanceof THREE.Mesh) {
child.material = material;
}
});
that.objectGroup.add(object);
object.rotateY(that.obj.angle / 180.0 * Math.PI);
var scale = that.obj.scale;
object.scale.set(scale, scale, scale);
object.translateX(that.obj.x);
object.translateY(that.obj.y);
object.translateZ(that.obj.z);
}, onProgress, onError);
}
argScene.add(this.objectGroup);
}
} else {
this.bodySphereGeometry = new THREE.SphereGeometry(this.radius, 64, 64);
// else if(!this.spherical) blablabla...
// The base body sphere material
var sphereMaterial = this.bodySphereMaterial = null;
switch (this.material.type) {
case "basic":
sphereMaterial = this.bodySphereMaterial
= new THREE.MeshBasicMaterial({
color: new THREE.Color(this.material.diffuse.color)
});
if (this.material.diffuse.map !== null) {
sphereMaterial.map = textureLoader.load(this.material.diffuse.map);
}
break;
case "lambert":
sphereMaterial = this.bodySphereMaterial
= new THREE.MeshPhongMaterial({
color: new THREE.Color(this.material.diffuse.color),
specular: new THREE.Color(0x000000),
shininess: 0,
bumpScale: this.material.bump.height
});
if (this.material.diffuse.map !== null) {
sphereMaterial.map = textureLoader.load(this.material.diffuse.map);
}
break;
case "phong":
default:
sphereMaterial = this.bodySphereMaterial
= new THREE.MeshPhongMaterial({
color: new THREE.Color(this.material.diffuse.color),
specular: new THREE.Color(this.material.specular.color),
shininess: this.material.specular.shininess,
bumpScale: this.material.bump.height
});
if (this.material.diffuse.map !== null) {
sphereMaterial.map = textureLoader.load(this.material.diffuse.map);
}
if (this.material.specular.map !== null) {
sphereMaterial.specularMap = textureLoader.load(this.material.specular.map);
}
if (this.material.bump.map !== null) {
sphereMaterial.bumpMap = textureLoader.load(this.material.bump.map);
}
break;
}
this.objectGroup = new THREE.Group();
// Add the main body part
textureLoader.load(this.material.diffuse.map, function (texture) {
this.bodySphereMaterial = new THREE.MeshPhongMaterial({map: texture});
});
this.bodySphereMesh = new THREE.Mesh(this.bodySphereGeometry, this.bodySphereMaterial);
this.bodySphereMesh.scale.set(1, 1 - this.oblateness, 1);
// Add lens flare
this.lensFlare = null;
if (this.star) {
this.lensFlare =
new THREE.LensFlare(this.flareTexture, 200,
0, THREE.AdditiveBlending, new THREE.Color(this.shineColor));
this.lensFlare.position.set(this.getX(), this.getY(), this.getZ());
var that = this;
this.lensFlare.customUpdateCallback = function () {
var cameraDistance = Math.sqrt(
(trackCamera[params.Camera].getX() - that.getX())
* (trackCamera[params.Camera].getX() - that.getX()),
(trackCamera[params.Camera].getY() - that.getY())
* (trackCamera[params.Camera].getY() - that.getY()),
(trackCamera[params.Camera].getZ() - that.getZ())
* (trackCamera[params.Camera].getZ() - that.getZ()));
this.transparent = 0.3;
if (cameraDistance < 6000) {
that.bodySphereMaterial.depthTest = true;
that.haloMaterial.depthTest = true;
that.cloudMaterial.depthTest = true;
}
else {
that.bodySphereMaterial.depthTest = false;
that.haloMaterial.depthTest = false;
}
this.updateLensFlares();
};
}
// Add night
this.nightMaterial = null;
this.nightSphereMesh = null;
if (this.material.night.map !== null) {
this.nightMaterial = new THREE.ShaderMaterial({
uniforms: {
nightTexture: {value: textureLoader.load(this.material.night.map)}
},
vertexShader: generalVS,
fragmentShader: nightFS,
transparent: true,
blending: THREE.CustomBlending,
blendEquation: THREE.AddEquation
});
this.nightSphereMesh = new THREE.Mesh(this.bodySphereGeometry, this.nightMaterial);
this.objectGroup.add(this.nightSphereMesh);
}
// Add clouds
this.cloudGeometry = null;
this.cloudMaterial = null;
this.cloudMesh = null;
if (this.atmosphere.cloud.map !== null) {
this.cloudGeometry = new THREE.SphereGeometry(this.radius + this.atmosphere.cloud.height, 64, 64);
if (!this.star) {
this.cloudMaterial = new THREE.MeshLambertMaterial({
map: textureLoader.load(this.atmosphere.cloud.map),
transparent: true
});
} else {
this.cloudMaterial = new THREE.MeshBasicMaterial({
map: textureLoader.load(this.atmosphere.cloud.map),
transparent: true
});
}
this.cloudMesh = new THREE.Mesh(this.cloudGeometry, this.cloudMaterial);
}
// Add atmosphere
this.atmosphereGeometry = null;
this.atmosphereMaterial = null;
this.atmosphereMesh = null;
if (this.atmosphere.scattering) {
this.atmosphereGeometry = new THREE.SphereGeometry(this.radius * 1.015, 64, 64);
this.atmosphereMaterial = new THREE.ShaderMaterial({
uniforms: {
atmosphereColor: {value: this.atmosphere.atmosphereColor},
sunsetColor: {value: this.atmosphere.sunsetColor},
atmosphereStrength: {value: this.atmosphere.atmosphereStrength},
sunsetStrength: {value: this.atmosphere.sunsetStrength}
},
vertexShader: atmosphereVS,
fragmentShader: atmosphereFS,
transparent: true,
blending: THREE.CustomBlending,
blendEquation: THREE.AddEquation
});
this.atmosphereMesh = new THREE.Mesh(this.atmosphereGeometry, this.atmosphereMaterial);
this.objectGroup.add(this.atmosphereMesh);
}
this.haloGeometry = null;
this.haloMaterial = null;
this.haloMesh = null;
if (this.halo.color != null) {
this.haloGeometry = new THREE.SphereGeometry(this.halo.radius, 64, 64);
this.haloMaterial = new THREE.ShaderMaterial({
uniforms: {
color: {value: this.halo.color}
},
vertexShader: haloVS,
fragmentShader: haloFS,
transparent: true,
blending: THREE.CustomBlending,
blendEquation: THREE.AddEquation
});
this.haloMesh = new THREE.Mesh(this.haloGeometry, this.haloMaterial);
this.objectGroup.add(this.haloMesh);
}
// Add rings
// Add clouds
this.ringGeometry = null;
this.ringMaterial = null;
this.ringMeshPositive = null;
this.ringMeshNegative = null;
this.ringTexture = null;
if (this.ring.map !== null) {
this.ringTexture = textureLoader.load(this.ring.map);
this.ringTexture.rotation = Math.PI / 2;
this.ringGeometry = new THREE.CylinderGeometry(this.radius + this.ring.lower, this.radius + this.ring.higher, 0, 100, 100, true);
this.ringMaterial = new THREE.MeshPhongMaterial({
map: this.ringTexture, transparent: true,
emissive: new THREE.Color(0x222222)
});
this.ringMeshPositive = new THREE.Mesh(this.ringGeometry, this.ringMaterial);
this.ringGeometry = new THREE.CylinderGeometry(this.radius + this.ring.higher, this.radius + this.ring.lower, 0, 100, 100, true);
this.ringMeshNegative = new THREE.Mesh(this.ringGeometry, this.ringMaterial);
// if(this.name === "Saturn") {
// this.ringMeshPositive.castShadow = true;
// this.ringMeshPositive.receiveShadow = true;
// this.ringMeshNegative.castShadow = true;
// this.ringMeshNegative.receiveShadow = true;
// this.bodySphereMesh.castShadow = true;
// this.bodySphereMesh.receiveShadow = true;
// }
}
// Add meshes to the object group
if (this.lensFlare != null) this.objectGroup.add(this.lensFlare);
this.objectGroup.add(this.bodySphereMesh);
if (this.ringMeshPositive !== null) {
this.objectGroup.add(this.ringMeshPositive);
this.objectGroup.add(this.ringMeshNegative);
}
if (this.cloudMesh !== null) {
this.objectGroup.add(this.cloudMesh);
}
// simple inclination
this.objectGroup.rotateZ(this.rotation.inclination / 180.0 * Math.PI);
argScene.add(this.objectGroup);
}
};
CelestialBody.prototype.updateClouds = function (time) {
if (this.cloudGeometry !== null) {
this.cloudGeometry.rotateY(this.atmosphere.cloud.speed / 180.0 * Math.PI);
}
}
CelestialBody.prototype.update = function (time) {
if (this.objectGroup !== undefined || this.isComet) {
this.updateOrbitAndRotation(time);
if (this.spherical && !this.isComet)
this.updateClouds(time);
}
};
CelestialBody.prototype.getX = function () {
if (this.objectGroup == null || this.objectGroup.position == null) return 0;
return this.objectGroup.position.getComponent(0);
};
CelestialBody.prototype.getY = function () {
if (this.objectGroup == null || this.objectGroup.position == null) return 0;
return this.objectGroup.position.getComponent(1);
};
CelestialBody.prototype.getZ = function () {
if (this.objectGroup == null || this.objectGroup.position == null) return 0;
return this.objectGroup.position.getComponent(2);
};
CelestialBody.prototype.getRadius = function () {
if (this.objectGroup == null || this.objectGroup.position == null) return 0;
return this.radius;
};

View File

@@ -0,0 +1,79 @@
/**
* @author alteredq / http://alteredqualia.com/
* @author mr.doob / http://mrdoob.com/
*/
var Detector = {
canvas: !!window.CanvasRenderingContext2D,
webgl: (function () {
try {
var canvas = document.createElement('canvas');
return !!( window.WebGLRenderingContext && ( canvas.getContext('webgl') || canvas.getContext('experimental-webgl') ) );
} catch (e) {
return false;
}
})(),
workers: !!window.Worker,
fileapi: window.File && window.FileReader && window.FileList && window.Blob,
getWebGLErrorMessage: function () {
var element = document.createElement('div');
element.id = 'webgl-error-message';
element.style.fontFamily = 'monospace';
element.style.fontSize = '13px';
element.style.fontWeight = 'normal';
element.style.textAlign = 'center';
element.style.background = '#fff';
element.style.color = '#000';
element.style.padding = '1.5em';
element.style.width = '400px';
element.style.margin = '5em auto 0';
if (!this.webgl) {
element.innerHTML = window.WebGLRenderingContext ? [
'Your graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">WebGL</a>.<br />',
'Find out how to get it <a href="http://get.webgl.org/" style="color:#000">here</a>.'
].join('\n') : [
'Your browser does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">WebGL</a>.<br/>',
'Find out how to get it <a href="http://get.webgl.org/" style="color:#000">here</a>.'
].join('\n');
}
return element;
},
addGetWebGLMessage: function (parameters) {
var parent, id, element;
parameters = parameters || {};
parent = parameters.parent !== undefined ? parameters.parent : document.body;
id = parameters.id !== undefined ? parameters.id : 'oldie';
element = Detector.getWebGLErrorMessage();
element.id = id;
parent.appendChild(element);
}
};
// browserify support
if (typeof module === 'object') {
module.exports = Detector;
}

View File

@@ -0,0 +1,36 @@
function remain(objKey) {
if (celestialBodies[objKey].parent == null)
return true;
if ((calculateParams[celestialBodies[objKey].parent.name] && celestialBodies[objKey].parent.name != "Sun") ||
calculateParams[objKey])
return true;
return false;
}
function render() {
for (var objKey in celestialBodies) {
if (firstflag || remain(objKey)) {
celestialBodies[objKey].update(globalTime.getRelative());
if (orbitParams[objKey]) {
scene.add(orbitDraw[objKey]);
} else {
scene.remove(orbitDraw[objKey]);
}
}
}
if (firstflag) {
$(function () {
setTimeout(function () {
$("#prompt").fadeOut(500);
container.appendChild(stats.domElement);
container.appendChild(renderer.domElement);
gui.open();
}, 2000);
});
}
firstflag = false;
if (needSet) {
renderCamera.setCamera();
}
renderer.render(scene, renderCamera.camera);
}

View File

@@ -0,0 +1,46 @@
var cameraParameters = function (distance, safeDistance, body) {
this.theta = 0.2;
this.phi = 0.3;
this.distance = distance;
this.safeDistance = safeDistance;
this.safeFar = 1e6;
this.body = body;
this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.4, 1e7);
};
cameraParameters.prototype.getDistance = function () {
return this.distance;
};
cameraParameters.prototype.getCenterX = function () {
if (this.body == "Comet")
return celestialBodies["Comet"].cometPivot.position.getComponent(0);
else
return celestialBodies[this.body].getX();
};
cameraParameters.prototype.getCenterY = function () {
if (this.body == "Comet")
return celestialBodies["Comet"].cometPivot.position.getComponent(1);
else
return celestialBodies[this.body].getY();
};
cameraParameters.prototype.getCenterZ = function () {
if (this.body == "Comet")
return celestialBodies["Comet"].cometPivot.position.getComponent(2);
else
return celestialBodies[this.body].getZ();
};
cameraParameters.prototype.getX = function () {
return this.getCenterX() - (celestialBodies[this.body].getRadius() + this.distance) * Math.cos(this.theta) * Math.cos(this.phi);
};
cameraParameters.prototype.getZ = function () {
return this.getCenterZ() - (celestialBodies[this.body].getRadius() + this.distance) * Math.sin(this.theta) * Math.cos(this.phi);
};
cameraParameters.prototype.getY = function () {
return this.getCenterY() - (celestialBodies[this.body].getRadius() + this.distance) * Math.sin(this.phi);
};
cameraParameters.prototype.setCamera = function () {
this.camera.position.x = this.getX();
this.camera.position.y = this.getY();
this.camera.position.z = this.getZ();
this.camera.lookAt(this.getCenterX(), this.getCenterY(), this.getCenterZ());
};

View File

@@ -0,0 +1,181 @@
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
var mouseStatus = {
x: 0, y: 0,
leftDown: false, centerDown: false, rightDown: false
};
function onWindowMouseMove(event) {
// Keep the value in 0 -- 2 PI
var body = params.Camera;
if (mouseStatus.leftDown) {
trackCamera[body].theta = trackCamera[body].theta % (2 * Math.PI);
trackCamera[body].phi = trackCamera[body].phi % (0.5 * Math.PI);
trackCamera[body].theta += (event.clientX - windowHalfX - mouseStatus.x) * 0.01;
if (trackCamera[body].phi - (event.clientY - windowHalfY - mouseStatus.y) * 0.01 >= -0.5 * Math.PI &&
trackCamera[body].phi - (event.clientY - windowHalfY - mouseStatus.y) * 0.01 <= 0.5 * Math.PI)
trackCamera[body].phi -= (event.clientY - windowHalfY - mouseStatus.y) * 0.01;
}
mouseStatus.x = event.clientX - windowHalfX;
mouseStatus.y = event.clientY - windowHalfY;
}
function onWindowMouseDown(event) {
switch (event.which) {
case 1:
mouseStatus.leftDown = true;
break;
case 2:
mouseStatus.centerDown = true;
break;
case 3:
default:
mouseStatus.rightDown = true;
break;
}
}
function onWindowMouseUp(event) {
switch (event.which) {
case 1:
mouseStatus.leftDown = false;
break;
case 2:
mouseStatus.centerDown = false;
break;
case 3:
default:
mouseStatus.rightDown = false;
break;
}
}
function onMouseWheelChange(event) {
var body = params.Camera;
var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));
var newDistance = trackCamera[body].distance - 0.05 * trackCamera[body].distance * delta;
if (newDistance <= trackCamera[body].safeDistance) {
newDistance = trackCamera[body].safeDistance;
} else if (newDistance >= trackCamera[body].safeFar) {
newDistance = trackCamera[body].safeFar;
}
trackCamera[body].distance = newDistance;
}
var posSrc = { pos: 0.0 };
var oX, oY, oZ, dX, dY, dZ, oTheta, dTheta, oPhi, dPhi, oDistance, dDistance, oSafeDis, dSafeDis;
var oCX, oCY, oCZ, dCX, dCY, dCZ;
tween = new TWEEN.Tween(posSrc)
.to({ pos: 1.0 }, 4000)
.easing(TWEEN.Easing.Quartic.InOut)
.onStart(function () {
globalTimeFlag = false;
})
.onUpdate(function () {
var pos = posSrc.pos;
switchCamera.camera.position.set(oX + dX * pos, oY + dY * pos, oZ + dZ * pos);
switchCamera.theta = oTheta + dTheta * pos;
switchCamera.phi = oPhi + dPhi * pos;
switchCamera.distance = oDistance + dDistance * pos;
switchCamera.safeDistance = oSafeDis + dSafeDis * pos;
switchCamera.camera.lookAt(oCX + dCX * pos, oCY + dCY * pos, oCZ + dCZ * pos);
})
.onComplete(function () {
// Need switching to roaming mode
if (goRoaming) {
calculateParams[curBody] = saveCur;
calculateParams["Earth"] = saveNext;
renderCamera = roamingCamera;
cameraControl = new THREE.FirstPersonControls(roamingCamera.camera);
cameraControl.lookSpeed = 0.1;
cameraControl.movementSpeed = 150;
cameraControl.noFly = true;
cameraControl.constrainVertical = true;
cameraControl.verticalMin = 1.0;
cameraControl.verticalMax = 2.0;
cameraControl.lon = -150;
cameraControl.lat = 120;
needSet = false;
roamingStatus = true;
goRoaming = false;
roamingCamera.camera.lookAt(0, 0, 0);
} else {
calculateParams[curBody] = saveCur;
calculateParams[nextBody] = saveNext;
switchCamera.body = nextBody;
curBody = nextBody;
needSet = true;
renderCamera = trackCamera[nextBody];
}
globalTimeFlag = true;
});
function initTween() {
saveCur = calculateParams[curBody];
saveNext = calculateParams[nextBody];
calculateParams[curBody] = false;
calculateParams[nextBody] = false;
renderCamera = switchCamera;
posSrc.pos = 0.0;
needSet = false;
}
function setTween(cur, next) {
if (cur == null) {
oX = arguments[2];
oY = arguments[3];
oZ = arguments[4];
oTheta = 0.2;
oPhi = 0.3;
oDistance = 30;
oSafeDis = 30;
oCX = roamingCamera.camera.position.x;
oCY = roamingCamera.camera.position.y;
oCZ = roamingCamera.camera.position.z;
} else {
oX = trackCamera[cur].getX();
oY = trackCamera[cur].getY();
oZ = trackCamera[cur].getZ();
oTheta = trackCamera[cur].theta;
oPhi = trackCamera[cur].phi;
oDistance = trackCamera[cur].distance;
oSafeDis = trackCamera[cur].safeDistance;
oCX = trackCamera[cur].getCenterX();
oCY = trackCamera[cur].getCenterY();
oCZ = trackCamera[cur].getCenterZ();
}
if (next == null) {
dCX = dX = arguments[2] - oX;
dCY = dY = arguments[3] - oY;
dCZ = dZ = arguments[4] - oZ;
dTheta = 0.2 - oTheta;
dPhi = 0.3 - oPhi;
dDistance = 30 - oDistance;
dSafeDis = 30 - oSafeDis;
} else {
dX = trackCamera[next].getX() - oX;
dY = trackCamera[next].getY() - oY;
dZ = trackCamera[next].getZ() - oZ;
dCX = trackCamera[next].getCenterX() - oCX;
dCY = trackCamera[next].getCenterY() - oCY;
dCZ = trackCamera[next].getCenterZ() - oCZ;
dTheta = trackCamera[next].theta - oTheta;
dPhi = trackCamera[next].phi - oPhi;
dDistance = trackCamera[next].distance - oDistance;
dSafeDis = trackCamera[next].safeDistance - oSafeDis;
}
}
function cameraCopy(cameraDst, cameraSrc) {
cameraDst.theta = cameraSrc.theta;
cameraDst.phi = cameraSrc.phi;
cameraDst.distance = cameraSrc.distance;
cameraDst.safeDistance = cameraSrc.safeDistance;
cameraDst.body = cameraSrc.body;
cameraDst.setCamera();
}

547
static/pkg/solar/js/data.js Normal file
View File

@@ -0,0 +1,547 @@
celestialBodies = {
Sun: new CelestialBody({
name: "Sun",
star: true,
parent: "Sun",
radius: 200.,
shineColor: 0xfff700,
orbit: {
semiMajorAxis: 0.
},
rotation: {
period: 2500,
inclination: 0,
},
material: {
type: "basic",
diffuse: {map: "res/sol/diffuse.png"}
},
atmosphere: {
cloud: {
map: "res/sol/overlay.png",
height: 1,
speed: 1
}
},
halo: {
color: new THREE.Color(0xfff700),
radius: 500.
}
}),
Mercury: new CelestialBody({
name: "Mercury",
radius: 3.8256,
parent: "Sun",
shineColor: 0x9999ff,
orbit: {
period: 1.204,
semiMajorAxis: 387.1,
eccentricity: 0.2056,
inclination: 7.0049
},
rotation: {
period: 1407.509405,
inclination: 28.55,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/mercury/diffuse.jpg"},
bump: {map: "res/mercury/bump.jpg", height: 0.}
}
}),
Venus: new CelestialBody({
name: "Venus",
radius: 9.488,
parent: "Sun",
shineColor: 0x9999ff,
orbit: {
period: 3.076,
semiMajorAxis: 723.3,
eccentricity: 0.0068,
inclination: 3.3947
},
rotation: {
period: 5832.443616,
inclination: 157.16,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/venus/diffuse.jpg"},
bump: {map: "res/venus/bump.jpg", height: 0.}
},
atmosphere: {
cloud: {
map: "res/venus/clouds.jpg",
height: 0.5,
speed: 0.02
}
}
}),
Earth: new CelestialBody({
name: "Earth",
radius: 10.,
parent: "Sun",
shineColor: 0x6666ff,
orbit: {
period: 5.,
semiMajorAxis: 1000.,
eccentricity: 0.0167,
inclination: 0.0001
},
rotation: {
period: 23.93447117,
inclination: -23.4392911,
meridianAngle: 280.147,
offset: 0.
},
material: {
type: "phong",
diffuse: {map: "res/earth/diffuse.jpg"},
specular: {map: "res/earth/spec.jpg", color: 0x243232, shininess: 25},
bump: {map: "res/earth/bump.jpg", height: 0.05},
night: {map: "res/earth/night.png"}
},
atmosphere: {
cloud: {
map: "res/earth/clouds.png",
height: 0.1,
speed: 0.02
},
scattering: true,
atmosphereColor: new THREE.Vector3(0.5, 0.7, 0.8),
sunsetColor: new THREE.Vector3(0.8, 0.7, 0.6),
atmosphereStrength: 1.5,
sunsetStrength: 1.0
}
}),
Comet: new CelestialBody({
name: "Comet",
parent: "Sun",
radius: 0,
spherical: false,
isComet: true,
orbit: {
period: 3.5,
semiMajorAxis: 3000.,
eccentricity: 0.5,
inclination: 10.,
},
}),
Ship: new CelestialBody({
name: "Ship",
parent: "Earth",
radius: 0.2,
spherical: false,
obj: {
path: "res/space/",
objPath: "tiangong.obj",
mtlPath: "tiangong.mtl",
angle: -30,
scale: 0.008,
},
orbit: {
period: 1.0,
semiMajorAxis: 15.,
inclination: 30,
},
rotation: {
period: 100.0,
inclination: 0,
},
}),
Astronaut: new CelestialBody({
name: "Astronaut",
parent: "Earth",
radius: 0.05,
spherical: false,
obj: {
path: "res/space/",
objPath: "man.obj",
mtlPath: null,
scale: 0.008,
angle: 235,
x: 0.04,
y: 0.02,
z: 0.01,
},
orbit: {
period: 1.0,
semiMajorAxis: 15.,
inclination: 30,
},
rotation: {
period: 100.0,
inclination: 0,
},
}),
Moon: new CelestialBody({
name: "Moon",
radius: 2.7243,
parent: "Earth",
shineColor: 0xff9988,
orbit: {
period: 2.0749,
semiMajorAxis: 25.,
eccentricity: 0.0549,
inclination: 5.15
},
rotation: {
period: 655.2,
inclination: 23.4608,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/moon/diffuse.jpg"},
bump: {map: "res/moon/bump.jpg", height: 0.1}
}
}),
Mars: new CelestialBody({
name: "Mars",
radius: 5.3226,
parent: "Sun",
shineColor: 0xff9988,
orbit: {
period: 9.4095,
semiMajorAxis: 1523.7,
eccentricity: 0.0934,
inclination: 1.8506
},
rotation: {
period: 24.622962156,
inclination: 37.11350,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/mars/diffuse.jpg"},
bump: {map: "res/mars/bump.jpg", height: 1.}
},
atmosphere: {
scattering: true,
atmosphereColor: new THREE.Vector3(0.9, 0.8, 0.6),
sunsetColor: new THREE.Vector3(0.4, 0.5, 0.7),
atmosphereStrength: 1.0,
sunsetStrength: 0.9
}
}),
Phobos: new CelestialBody({
name: "Phobos",
radius: 1,
parent: "Mars",
shineColor: 0xff9988,
orbit: {
period: 1.5945,
semiMajorAxis: 20,
eccentricity: 0.0151,
inclination: 1.082
},
rotation: {
period: 100.,
inclination: 37.10,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/phobos/diffuse.jpg"},
bump: {map: "res/phobos/bump.jpg", height: 10.}
}
}),
Deimos: new CelestialBody({
name: "Deimos",
radius: 0.5,
parent: "Mars",
shineColor: 0xff9988,
orbit: {
period: 6.3122,
semiMajorAxis: 30,
eccentricity: 0.00033,
inclination: 1.791
},
rotation: {
period: 150.,
inclination: 36.48,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/deimos/diffuse.jpg"},
bump: {map: "res/deimos/bump.jpg", height: 10.}
}
}),
Jupiter: new CelestialBody({
name: "Jupiter",
radius: 112.09,
parent: "Sun",
shineColor: 0x9999ff,
orbit: {
period: 59.3,
semiMajorAxis: 2000.,
eccentricity: 0.0484,
inclination: 1.3053
},
rotation: {
period: 238.23,
inclination: 2.22,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/jupiter/diffuse.jpg"},
},
atmosphere: {
cloud: {
map: "res/jupiter/clouds.png",
height: 0.3,
speed: 0.02
},
scattering: true,
atmosphereColor: new THREE.Vector3(1.0, 0.8, 0.7),
sunsetColor: new THREE.Vector3(0.7, 0.7, 0.8),
atmosphereStrength: 1.8,
sunsetStrength: 0.6
},
}),
Callisto: new CelestialBody({
name: "Callisto",
radius: 4.0,
parent: "Jupiter",
shineColor: 0xff9988,
orbit: {
period: 2.49,
semiMajorAxis: 200.,
eccentricity: 0.0045045,
inclination: 0.384285,
},
rotation: {
period: 100.,
inclination: 25.51,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/callisto/diffuse.jpg"},
}
}),
Europa: new CelestialBody({
name: "Europa",
radius: 3.0,
parent: "Jupiter",
shineColor: 0xff9988,
orbit: {
period: 17.76,
semiMajorAxis: 160.,
eccentricity: 0.0101,
inclination: 0.470,
},
rotation: {
period: 150.,
inclination: 25.49,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/europa/diffuse.jpg"},
}
}),
Io: new CelestialBody({
name: "Io",
radius: 3.0,
parent: "Jupiter",
shineColor: 0xff9988,
orbit: {
period: 8.85,
semiMajorAxis: 100.,
eccentricity: 0.0041,
inclination: 0.040,
},
rotation: {
period: 100.,
inclination: 25.50,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/io/diffuse.png"},
}
}),
Saturn: new CelestialBody({
name: "Saturn",
radius: 94.49,
parent: "Sun",
shineColor: 0x9999ff,
orbit: {
period: 40.0,
semiMajorAxis: 2500.,
eccentricity: 0.0542,
inclination: 2.4845
},
rotation: {
period: 255.75,
inclination: 28.052,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/saturn/diffuse.png"},
bump: {map: "res/saturn/bump.png"},
},
atmosphere: {
cloud: {
map: "res/saturn/clouds.png",
height: 0.5,
speed: 0.05
},
scattering: true,
atmosphereColor: new THREE.Vector3(0.8, 0.7, 0.5),
sunsetColor: new THREE.Vector3(0.7, 0.7, 0.8),
atmosphereStrength: 1.5,
sunsetStrength: 0.8
},
ring: {
map: "res/saturn/ring.png",
lower: 5,
higher: 80,
}
}),
Dione: new CelestialBody({
name: "Dione",
radius: 5.0,
parent: "Saturn",
shineColor: 0xff9988,
orbit: {
period: 3.0,
semiMajorAxis: 200.,
eccentricity: 0.05,
inclination: 0.0049,
},
rotation: {
period: 130.,
inclination: 22.9,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/dione/diffuse.jpg"},
}
}),
Titan: new CelestialBody({
name: "Titan",
radius: 6.0,
parent: "Saturn",
shineColor: 0xff9988,
orbit: {
period: 4.0,
semiMajorAxis: 150.,
eccentricity: 0.05,
inclination: 0.0049,
},
rotation: {
period: 120.,
inclination: 1.53,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/titan/diffuse.jpg"},
}
}),
Uranus: new CelestialBody({
name: "Uranus",
radius: 40.07,
parent: "Sun",
shineColor: 0x9999ff,
orbit: {
period: 420.069,
semiMajorAxis: 3000.,
eccentricity: 0.0472,
inclination: 0.7699
},
rotation: {
period: 413.76,
inclination: 97.722,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/uranus/diffuse.jpg"},
},
ring: {
map: "res/uranus/ring.png",
lower: 10,
higher: 20,
},
atmosphere: {
scattering: true,
atmosphereColor: new THREE.Vector3(0.5, 0.9, 0.7),
sunsetColor: new THREE.Vector3(0.7, 0.9, 0.8),
atmosphereStrength: 0.2,
sunsetStrength: 0.7
},
}),
Neptune: new CelestialBody({
name: "Neptune",
radius: 38.83,
parent: "Sun",
shineColor: 0x9999ff,
orbit: {
period: 823.965,
semiMajorAxis: 3500.,
eccentricity: 0.0097,
inclination: 1.7692
},
rotation: {
period: 386.64,
inclination: 28.03,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/neptune/diffuse.jpg"},
},
ring: {
map: "res/neptune/ring.png",
lower: 10,
higher: 20,
}
}),
Pluto: new CelestialBody({
name: "Pluto",
radius: 15.,
parent: "Sun",
shineColor: 0x9999ff,
orbit: {
period: 32.0,
semiMajorAxis: 4000.,
eccentricity: 0.2482,
inclination: 17.1449
},
rotation: {
period: 153.292944,
inclination: 115.60,
meridianAngle: 0.,
offset: 0.
},
material: {
type: "lambert",
diffuse: {map: "res/pluto/diffuse.jpg"},
},
}),
}

View File

@@ -0,0 +1,258 @@
(function ($) {
// Creating a number of jQuery plugins that you can use to
// initialize and control the progress meters.
$.fn.progressInitialize = function () {
// This function creates the necessary markup for the progress meter
// and sets up a few event listeners.
// Loop through all the buttons:
return this.each(function () {
var button = $(this),
progress = 0;
// Extract the data attributes into the options object.
// If they are missing, they will receive default values.
var options = $.extend({
type: 'background-horizontal',
loading: 'Loading',
finished: 'Done'
}, button.data());
// Add the data attributes if they are missing from the element.
// They are used by our CSS code to show the messages
button.attr({'data-loading': options.loading, 'data-finished': options.finished});
// Add the needed markup for the progress bar to the button
var bar = $('<span class="tz-bar ' + options.type + '">').appendTo(button);
// The progress event tells the button to update the progress bar
button.on('progress', function (e, val, absolute, finish) {
if (!button.hasClass('in-progress')) {
// This is the first progress event for the button (or the
// first after it has finished in a previous run). Re-initialize
// the progress and remove some classes that may be left.
bar.show();
progress = 0;
button.removeClass('finished').addClass('in-progress')
}
// val, absolute and finish are event data passed by the progressIncrement
// and progressSet methods that you can see near the end of this file.
if (absolute) {
progress = val;
}
else {
progress += val;
}
if (progress >= 100) {
progress = 100;
}
// if(finish){
//
// button.removeClass('in-progress').addClass('finished');
//
// bar.delay(500).fadeOut(function(){
//
// // Trigger the custom progress-finish event
// button.trigger('progress-finish');
// setProgress(0);
// });
//
// }
setProgress(progress);
});
function setProgress(percentage) {
bar.filter('.background-horizontal,.background-bar').width(percentage + '%');
bar.filter('.background-vertical').height(percentage + '%');
}
});
};
// progressStart simulates activity on the progress meter. Call it first,
// if the progress is going to take a long time to finish.
$.fn.progressStart = function () {
var button = this.first(),
last_progress = new Date().getTime();
if (button.hasClass('in-progress')) {
// Don't start it a second time!
return this;
}
button.on('progress', function () {
last_progress = new Date().getTime();
});
// Every half a second check whether the progress
// has been incremented in the last two seconds
var interval = window.setInterval(function () {
if (new Date().getTime() > 2000 + last_progress) {
// There has been no activity for two seconds. Increment the progress
// bar a little bit to show that something is happening
button.progressIncrement(5);
}
}, 500);
button.on('progress-finish', function () {
window.clearInterval(interval);
});
return button.progressIncrement(10);
};
$.fn.progressFinish = function () {
return this.first().progressSet(100);
};
$.fn.progressIncrement = function (val) {
val = val || 10;
var button = this.first();
button.trigger('progress', [val])
return this;
};
$.fn.progressSet = function (val) {
val = val || 10;
var finish = false;
if (val >= 100) {
finish = true;
}
return this.first().trigger('progress', [val, true, finish]);
};
// This function creates a progress meter that
// finishes in a specified amount of time.
$.fn.progressTimed = function (seconds, cb) {
var button = this.first(),
bar = button.find('.tz-bar');
if (button.is('.in-progress')) {
return this;
}
// Set a transition declaration for the duration of the meter.
// CSS will do the job of animating the progress bar for us.
bar.css('transition', seconds + 's linear');
button.progressSet(99);
window.setTimeout(function () {
bar.css('transition', '');
button.progressFinish();
if ($.isFunction(cb)) {
cb();
}
}, seconds * 1000);
};
function PreLoad(imgs, options) {
this.imgs = (typeof imgs === 'string') ? [imgs] : imgs;
this.opts = $.extend({}, PreLoad.DEFAULTS, options);
if (this.opts.order === 'ordered') {
this._ordered();
} else {
this._unordered();
}
}
PreLoad.DEFAULTS = {
order: 'unordered', //无序预加载
each: null, //每张图片加载完毕后执行
all: null // 所有图片加载完毕后执行
};
PreLoad.prototype._ordered = function () {
var imgs = this.imgs,
opts = this.opts,
count = 0,
len = imgs.length;
function load() {
var imgObj = new Image();
$(imgObj).on('load error', function () {
opts.each && opts.each(count);
if (count >= len) {
//所有图片全部加载完成
opts.all && opts.all();
} else {
load();
}
count++;
});
imgObj.src = imgs[count];
}
load();
};
PreLoad.prototype._unordered = function () {//无序加载
var imgs = this.imgs,
opts = this.opts,
count = 0,
len = imgs.length;
$.each(imgs, function (i, src) {
if (typeof src != 'string') return;
var imgObj = new Image();
$(imgObj).on('load error', function () {
opts.each && opts.each(count);
if (count >= len - 1) {
opts.all && opts.all();
}
count++;
});
imgObj.src = src;
});
};
$.extend({
preLoad: function (imgs, opts) {
new PreLoad(imgs, opts);
}
});
})(jQuery);

Some files were not shown because too many files have changed in this diff Show More