• ベストアンサー

原子同士の結合をプログラムで実現したい

化学の知識も必要とされるので、自分も質問自体が曖昧になっちゃうんですが、 なるべくイメージできるように書いていきたいと思います。宜しくお願いします。 そもそもなんでこのようなことをしたいのかというと、 原子ひとつひとつに自身を処理するプログラムを持たせて、それを結合させて、 3Dの物体や空間を作りたいと思ったからです。 今よくある3Dゲーム(というよりゲーム)は、例えばある物体が壁まで到達したら そこでif分岐などを使って当たり判定などして、描画自体を制御していますが、 もしこの原子(自身のプログラムを持ってる)を結合させてある物体を作り出すことが できたなら、そういう制御プログラムも新たに付け加える必要もないし、 現実に近い環境をゲームに作り出すことができそうな気がするんです。 現実では1センチぐらいの物体でも、その中には何億何兆(もっと?)の原子が 詰まってると思うんですけど、それだとその時点でプログラムではどうしようもできないで、 プログラムの場合だと1センチに100個ぐらい原子で構成されるように簡略化したいです(できるものなら・・・) もちろんそれでも計算処理が膨大で実現は不可能だとは思いますけど、 とりあえずどんな感じのプログラムになるのかということが知りたいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★『水』と『氷』がテーマですか? ・身近でいい題材ですね。 ・日本は温度を摂氏(℃)で表現しますが、これは水と氷の境界の温度を零度(℃)とした基準ですね。 ・欧米などでは華氏(F)で表現しますが、これは人などの体温を 100 度とした基準です。 ・それで今回の問題も温度という概念を定義した方が良いでしょう。 ・科学では絶対温度が基準です。この温度は物質がこれ以上冷えない温度を 0 度としていますが、  これ以上冷えないとは『物質の振動』が全くない状態の事です。→これが摂氏マイナス273度です。 ・水と氷は分子は同じですが物質の状態が『液体』、『固体』という2タイプあるため簡単でいいですが  温度による『物質の振動』状態をプログラムで定義・再現しなくてはなりません。 ・そこでプログラム的には空間を単純化させて『セル』という小さな立体構造の部屋を作り管理します。 ・この『セル』の1つ1つに分子・原子を格納するイメージになります。分かりますか? ・そしてこの『セル』単位で力の伝播をプログラムで再現していきますが、再帰処理をすると計算時間  だけでなくスタックの問題で直ぐにオーバーフローを起こして、まともに処理できません。 ・それではどうするか? ・Windows の GUI の仕組みをアイデアとして取り入れると上手く出来るかもしれません。 ・イメージ的には自分で作ったウインドウに1つのボタン、1つのエディット・ボックスがあります。 ・そして、ボタンを押すとエディット・ボックスの文字列が入力される動作はプログラム(GUI)では  ボタンという部品が『エディット・ボックス』へ文字列を設定するメッセージを発行します。 ・プログラム的には『WM_SETTEXT』メッセージです。→関数では『SetWindowText』ですが…。 ・このような仕組みでボタンという部品とエディット・ボックスという部品にはそれぞれのプログラムが  割り当てられています。→プロシージャ関数ですね。 ・この『プロシージャ関数』というのが今回の『分子プログラム』の中核になります。 ・つまり、1つ1つの分子に同じ『分子プログラム』で処理させるのです。 ・しかし、1つ1つの分子を識別するために『識別コード』をウインドウ・ハンドルと同じ考えで管理を  します。これで再帰処理ではなくて力が加わっていく方向の分子にだけ『力』というメッセージの信号  をだします。そして力を受ける分子の『分子プログラム』が『力』が伝えられたという信号として受け  取って処理を連鎖的に行います。→長いですが文章での説明は大変です。理系なので。 ・このように『力』という物理学の現象を『力』のメッセージ信号として球状に周囲の分子セルに転送を  行うのです。よって、空間を単純な『セル』の立体構造にしているため『上・下・左・右・奥行・手前』  の6つの方向にだけ送るのです。 ・すると6つの分子が『力100』を受け取り、それによってまた6方向へ『力』のメッセージを送信します。 ・ただし、『力95』という感じで減少させていきます。また、6方向のうち送信するのは力を受け取った  方向以外の5つの方向に対してだけ送ります。→正確には物質がとどまる力から反発力も必要ですが省略。 ・こうして『力』という現象を数値化して処理させますが、そのうち分子と分子で衝突(振動)するような  組合せが発生します。 ・このときは分子Aが『力100』、分子Bが『力40』ならば『力100』-『力40』=『力60』として引き算を  して分子Aが『力60』という大きさで逆方向へ弾きだされるようにします。このとき分子Bは動きを停止  させます。→正しくは『作用・反作用』で分子Bも逆方向へ飛ばされますが省略。こうしないと計算終了  しません。連鎖が続きすぎて困るため省略するのです。パソコンではね。 ・上記の考え方が、今回の分子間の力の伝わり方です。 ・また水と氷とでは『力』の伝わり方に変化をつけます。 ・水は『力100』→『力95』→『力90』→『力85』などの -5 ステップで減少。 ・氷は『力100』→『力80』→『力60』→『力40』などの -20 ステップで減少。 ・このように温度の定義を力の減少という数値で表現するわけですよ。 ・この後に水槽の囲いに対する力や、重力などの力も『力メッセージ』の送信、受信で処理可能です。 ・以上。プログラム的なアルゴリズムを簡単ですが記述してみました。→感想なり、不明な点なりをどうぞ。

takagoo100
質問者

お礼

ご返答ありがとうございます。 凄いなぁというのが正直な感想です。よく私の曖昧な説明だけで これだけの考えやプログラム構成して纏めることができるとただただ関心しています・・・ 本来ならじっくりOh-Orangeさんのこれらの考えを 完全に把握するために時間が欲しいのですが、とりあえず 現時点での疑問点を質問してよろしいでしょうか?お願いします。 ・水(液体)は他の水分子がぶつかれば混ざると思うのですが、 その結合するプログラムは、このやり方だとどのような感じになるのでしょうか? ・>正確には物質がとどまる力から反発力も必要ですが省略。 と省略しているのですが、省略することによって、 例えば現実の物質とプログラムで再現された物質に大きな違いが生じる心配はないのでしょうか? 自分としては、現実と再現が小さな違いぐらいなら全然気にしないのですが、 ちょっとしたことで同じ物質なのに全く形や動きが違ってくるようになるとまずいので、 そこらへんが心配です(まだ実際に試してないのにこういうこと言うのもなんですが・・・) ・>力を受け取った方向以外の5つの方向に対してだけ送ります なぜこのような考えになるのでしょうか?自分としては力の方向にだけ(あるいはその角度に近い方向) 送ればいいような感じがしますが。 特に3番目が疑問になるということは、まだ自分はあまり理解していないのですが、 たぶんこれを見ている他の方は理解できていると思います。 そういうことで申し訳ないのですが、宜しくお願いします。

その他の回答 (9)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.10

★言葉での説明が段々難しくなりますね。 ・前回の最後『図解すると分かりやすくなりますね。』は私自身の感想です。 ・解説がないので理解不能なのは最初から分かっていました。→文章にするのが大変! ・まず最初に押す力、引っ張られる力、反発する力(圧力)、摩擦力、重力などの量は  すべて私が適当に考えた数値です。決して物理学で正確に計算などを行った数では  ありません。あくまでイメージ的に当てはめた数値です。つまり、私自身が仮想空間  の物理法則を勝手に定義したのです。→わぁ、神様みたい! ・これからは前回の図解を元に説明します。 本題: ・『E3』に +100 の力が加わるとき、その押された力が +95 で『D3』を押す力となって  伝わります。このとき同時に上下の『E2』と『E4』へ『E3』を引っ張りなさいという  信号を送ります。この引っ張りの力が『-100』という数値で表しています。→値は適当 ・1つの分子『E3』では左側、上部、下部の3方向にだけ信号を出します。  これが基本です。 ・そして『D3』は +95 の力が伝わるため次は『C3』へ +90 と減らした値を伝えます。  この直線的な方向が『押す力』の軸(中心)になります。 ・つぎに『E2』、『E4』は『E3』から『引っ張りの力』を信号としてキャッチします。  このとき、今度は『E3』が『E2』、『E4』を『引き合う力』として『E3』へその信号を  送ります。このときの数値は -100 → -95 に減少させます。  これで -100 と -95 から -5 という数値が差になります。  この差が実際に『E2』、『E4』が『E3』を引っ張る力または引き合う力になります。  画面上では 5 という差をピクセル値として『E2』、『E4』を『E3』に近づけましょう。 ・つまり、  『押す力』はプラス値を減少させながら次の分子に送り、  『引っ張る力』はマイナス値を減少させてから、送られてきた分子の送信元へ  『引き合う力』としてマイナス値を送り返します。→簡単な『万有引力の法則』を再現!  このため、図解したセル信号の向きが双方向のマイナス値として描いたわけです。  マイナス値なので『引っ張る力』または『引き合う力』が働くことになります。 ・よって、セル1つ1つに対する信号の流れは『押す力』は単純に1方向で表現します。  『引っ張る力』はのちに『引き合う力』として信号が戻ってくるので数値の引き算をして  その差を本当に『引き合う力』の大きさとして『分子』位置をピクセル単位などで描きます。 新たな力: ・『摩擦力』と『重力』も『引き合う力』と同じ考えでマイナス値で表現します。 ・特に『摩擦力』のマイナス値が大きいと +100 の押す力だけでは『固体』全体がまだ移動  できる力が全体に伝わらない状態という事になります。つまり動かない。  また『摩擦力』をゼロにすれば周りとの接触していないため力の伝え方を -5 ステップで  減少するのではなく -0 ステップ、つまりそのまま力を伝える方法を取ります。  ただ『摩擦力』をゼロというのが『無重力』を表すことになり、地球上では『空気抵抗』  という『摩擦力』に代わる力が存在することになります。ですので『摩擦力』をゼロというのが  『無重力』を表すのです。 まとめ: ・『押す力』、『反発する力(圧力)』、『引っ張る力』、『引き合う力』、『摩擦力』、『空気抵抗』、  『重力』とすでに7つの『力』が登場してしまいました。→考えていくとゴロゴロと新しい力の影響を  考えなくてはなりません。大変難しい質問に回答してしまいました。→反省。 ・まずは簡単な物理法則を把握するところから始めないとまともな『アルゴリズム』も考えられません。 ・一旦、『物理』カテゴリで『力とはどう物質に伝えられるのか?』という質問をされたらどうでしょう。 ・私ではこれから先、正しい回答を出す自信がありません。大まかでよければ引き続き回答などの  やり取りをしますが…。 ・以上。今後の方針などを教えて下さい。

takagoo100
質問者

補足

ご返答ありがとうございます。 そうですか・・・残念です。でもしょうがないですね。 たしかに難しい分野ですけど、私の理解力がもう少しあれば いい感じで進んでいきそうなんですけど・・・ 自分で質問立てたので当り前ですが、これは凄い興味あることなので まだ続けていたいというのが本音です。 ここまで付き合って頂いたことに感謝します。 正直まだOh-Orangeさんの考えを完全に把握していませんが 大事な個所をいくつか教わったので、それをベースに組んでいきたいと思います。 できるものなら徐々に徐々に原子に似せていきたいと思います。 またいづれ目処が立った後で疑問になることがあった時に お答え頂ければうれしいと思います。 この質問に携わったみなさんにも感謝します。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.9

★追記。 ・メモ帳の設定でフォントを『MS ゴシック』、『標準』スタイル、『10』サイズにすると  罫線が崩れずに見れます。 余談: ・『ドラクエ4の戦闘のAIが知りたい』のその後は? ・同じ質問者さんでしたか。 ・さっき気づきました。 ・以上。おわり。

takagoo100
質問者

お礼

ご返答ありがとうございます。 あ、その節はお世話になりました。 基本的にOh-Orangeさんの一例のアルゴリズムで検証したりしています。 別にちゃんとマップを用意してとかじゃなくて 20種類ほどのキャラをランダムで総当りにして 勝率や不具合を調べたりといったところです。 図解を作って頂きありがとうございます。 この1つの問題に拘って申し訳ないのですが、まだ不明な点があります。 力の伝わり方、方向は分かったのですが(たぶん・・・)、これがどのように(どれくらい) 動くのかが分かりません。右から左に動くのは分かるんですけど、 100の力で1回だけ押した時に何ピクセル(1ピクセル1の力として)動くのでしょうか? この氷(固体)が真空(ここでは周りに原子も無い状態とします)に浮いてたら 右から左に止まることなく進みますよね。それだと逆にイメージしづらいので、 氷の下(A5からE5の下)に地面(氷を留めようとする力)設置して E3を100の力で1回だけ押した時に、その時の分子の力の流れと分子の移動先を 示してもらえないでしょうか? 地面の摩擦の力の数値をいくつにするかなどもお任せしたいと思います。 宜しくお願いします。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.8

★5方向とは? ・押されている方向以外の5つの事ですが、そのうちの1つは確かに押すという力を伝えます。 ・それ以外の4つの方向が引っ張る力になります。→前回のは説明が正しくありませんでした。 ・5方向の表現を押されたり、引っ張られるプラス、マイナスの影響力の数と言いたかったのです。  省略しすぎました。言葉が足りなくてすみませんでした。 平面では: ・質問者さんの図でいくと『D3』だけは +95 というプラスの押す力(E3→D3)が働きます。  残りの2方向『E2』、『E4』が水素結合によるマイナスの引っ張りの力になります。 ・よって質問者さんの『普通はE3がD3を右から左に押す』であっています。 図解: ┌─┐─→┌─┐─→┌─┐─→┌─┐─→┌─┐ │A1│←─│B1│←─│C1│←─│D1│←─│E1│ └─┘ -75└─┘ -80└─┘ -85└─┘ -90└─┘ │↑-75-75│↑-80-80│↑-85-85│↑-90-90│↑-95 ↓│  -75↓│  -80↓│  -85↓│  -90↓│ ⇒ここの部分は全体的に ┌─┐─→┌─┐─→┌─┐─→┌─┐─→┌─┐⇒A2→B2→C2→D2→E2と │A2│←─│B2│←─│C2│←─│D2│←─│E2│⇒左から右へ突っ張ろう └─┘ -80└─┘ -85└─┘ -90└─┘ -95└─┘⇒とする圧力が発生する │↑-80-80│↑-85-85│↑-90-90│↑-95-95│↑ ⇒-5→-5→-5→-5→-5 ↓│   ↓│   ↓│   ↓│   ↓│-100 ┌─┐  ┌─┐  ┌─┐  ┌─┐  ┌─┐ │A3│←─│B3│←─│C3│←─│D3│←─│E3│←押される分子(+100) └─┘ +80└─┘ +85└─┘ +90└─┘ +95└─┘ ↑│   ↑│   ↑│   ↑│   ↑│-100 │↓-80-80│↓-85-85│↓-90-90│↓-95-95│↓ ⇒ここの部分は全体的に ┌─┐ -80┌─┐ -85┌─┐ -90┌─┐ -95┌─┐⇒A4→B4→C4→D4→E4と │A4│←─│B4│←─│C4│←─│D4│←─│E4│⇒左から右へ突っ張ろう └─┘─→└─┘─→└─┘─→└─┘─→└─┘⇒とする圧力が発生する ↑│  -75↑│  -80↑│  -85↑│  -90↑│ ⇒-5→-5→-5→-5→-5 │↓-75-75│↓-80-80│↓-85-85│↓-90-90│↓-95 ┌─┐ -75┌─┐ -80┌─┐ -85┌─┐ -90┌─┐ │A5│←─│B5│←─│C5│←─│D5│←─│E5│ └─┘─→└─┘─→└─┘─→└─┘─→└─┘ 圧力図: →→→→→ ↓↓↓↓↓ ←・・・・←押される分子 ↑↑↑↑↑ →→→→→ 意味: ・矢印の方向が分子の押したり、引っ張られる影響力の信号をだす方向です。 ・数値が周囲に影響する力の大きさを表します。 ・プラスの数値は『押す力』を数値化したものです。 ・マイナスの数値は『引っ張り力』を数値化したものです。 最後に: ・上記の図解をコピーしてメモ帳などにペーストすると見やすくなります。 ・以上。図解すると分かりやすくなりますね。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.7

★補足の回答 (1)混ざるとは? ・まず、水(液体)と氷(固体)の状態とは何か? ・液体は水分子が固体の状態よりかはあちこちに移動できるスペースや振動に余裕があります。 ・固体は水分子が液体の状態よりも密集(整列)していて移動できるスペースに余裕がありません。 ・このことから、くまなく混ざることが出来るのは『液体』と『液体』の組合せです。  よって液体と固体では分子同士の間隔(密集度)も変え、液体では移動できるスペースの分だけ  分子同士がすれ違うだけで衝突頻度を減らします。 ・衝突したときは弾かれる角度などを適当な計算で方向転換させます。  厳密には、水分子の水素+酸素+水素の角度が120°という『/\』の形をしています。  この角度から絡み合って飛ばされる方向を計算すればより忠実に再現できますが…。 ・どこまで忠実にしますか? ・こんどは『液体』と『固体』の組合せですが、固体の方は分子同士の間隔(密集度)があるため  分子同士の結合(水素結合)が強いため少しの隙間に水分子が入り込めないようにプログラミング  します。→ちょうど磁力のS極、N極のように水素結合というやや強い結びつきが『固体』です。 ・ただ周囲の温度も考えるのならば、氷が解けて水分子として離れたり、水の分子の振動が緩やかに  なって氷の分子に付着していく要素もあるとより忠実に再現できます。 (2)反発力の省略とは? ・こちら(前回のアドバイス)は固体を想定していました。→固体の力の伝わり方です。 ・つまり、固体の密集した領域で力という振動エネルギー?の伝わり方をプログラミングでは『力100』  として表現しますという事でした。 ・固体は密集度が高いためぶつかってもあまり移動できるスペースもないと考えて、反発力を取り入れても  そばの別の分子にぶつかって行き動きが鈍くなり、振動が停止と考えたのです。→実際には固体でも  微妙に振動し続けていますが…。  とにかく省略しても、ぶつかって動きが停止しても結果的には同じになると思いました。 ・ただし液体の場合は(1)の説明のように絡み合って飛ばされる方向などとともに反発力を簡単に導入します。 (3)5つの方向とは? ・こちらも固体の力の伝わり方を想定していました。 ・力を与えたときに、単純に1方向だけだと直線的でそこの分子だけ移動するのはおかしいです。 ・そこで5つの方向なのですが、力の伝わりに関わる周囲に対しての引っ張られる力という事でした。 ・これはある水分子に右から左へ力というエネルギーが加わったとき、隣の分子へ押し出す力と周囲から  引っ張られる力も考えるということでそれが5つの方向なのです。→押す力ではありません。 ・このため、引っ張る力が球状のように周囲の分子に影響していくのです。ちょうど『風船』を『指』で  押えつける調子でしょうか。→へこみますよね。そして一番凹んでいる部分以外は分子が離れないように  水素結合の力から引っ張り合うわけです。 ・でも固体の場合は凹みは少なくて全体に力が行き届いたときに全体が動くのです。  それまでは引っ張り合う力で形を保とうとします。 ・つまり、引っ張られる力を周囲の5方向にメッセージ信号を出すわけですが、『引っ張られますよ』という  負の力が働くことになります。決して押し込むような正の力ではありません。 ・以上。頑張って文章にしてみました。→理系ですので上手く伝わりますように『祈り』ます。

takagoo100
質問者

お礼

ご返答ありがとうございます。 >・このため、引っ張る力が球状のように周囲の分子に影響していくのです。ちょうど『風船』を『指』で > 押えつける調子でしょうか。→へこみますよね。そして一番凹んでいる部分以外は分子が離れないように > 水素結合の力から引っ張り合うわけです。 >・でも固体の場合は凹みは少なくて全体に力が行き届いたときに全体が動くのです。 > それまでは引っ張り合う力で形を保とうとします。 この例えで、なんとなくですがどういう考えなのかイメージすることはできました。 ただそれ以前のことがまだ分からないで、汚い図ですが自分で用意しましたので、 できればこれを使って話を進めてもらえないでしょうか? http://www.csync.net/service/file/view.cgi?id=1169462713 ここではとりあえず2Dで考えます(左右上下だけ) 分子5×5の計25個の氷(固体)でE3を右から左に押します。 (ここからは自分なりの解釈なので間違ってるかもしれません(たぶん間違ってます・・・)) そうすると、Oh-Orangeさんの考えだとE2、D3、E4が100の力でE3に引っ張られることになります。 まず、この時点で分からないのですが、E3を右から左に押してるのに なぜD3がE3に引っ張られるかが分からないです。普通はE3がD3を右から左に押しませんか? あと、この場合(前提が間違ってるかもしれせんが)だとE2はどの方向に どのくらいの力が働いていることになるのでしょうか?

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★質問者さんはどこまで忠実に再現したいのですか? ・また、最終目標のようなもの(結果)は何ですか? ・アドバイスする為には、いろいろと疑問が出てきます。→私も好きですから。この質問。 ・そこで1つ提案があります。 提案: ・パソコン上でミニ宇宙(マイクロ宇宙)空間を実現してみてはどうかな? ・これをプログラムで実現するには『宇宙』、『星』、『原子』、『分子』や『アミノ酸』  などのいろいろな知識を必要とします。もちろん、学者さんほど熟知している必要はあり  ませんが大まかな仕組みを理解すべきでしょう。あとプログラミングの知識・技能もね。 方向性: ・まず最初(宇宙の誕生)に『水素原子』を有限の数(10万個)だけ用意(発生)させます。 ・そして時間の経過で水素原子の密集している場所は温度が高くなり、原子の運動が高速に  なって原子同士の衝突を起こさせます。このとき『水素原子』が持つ電子の数も管理して  安定になるように衝突時に融合して『ヘリウム』になるような仕組みをプログラミングで  定義します。→これを元に他の原子も原子核の周りに回っている電子の数を管理して安定  するように衝突時に融合して新しい重い原子が出来るような仕組みにします。 ・ここでのポイントは原子核の周りに回っている電子の K殻、L殻、M殻という輪が安定か、  不安定かの判断基準とします。→詳しくは『科学』カテゴリでどうぞ。 ・これを元に基本の原子(鉄まで)が出来たころから次のステップに入ります。 ・次は、『原子』と『原子』の結合で『分子』が出来る仕組みになります。 ・たとえば『水素』+『酸素』+『水素』を結合すれば『水』分子になりますね。 ・でも、いきなり3つを結合しないで『水素』+『酸素』の2つ、『水素』+『水素』の2つ  という組合せのバリエーションを持たせます。分かりますよね。 ・その上で『水素・酸素』と『水素』を結合すれば『水』分子になるようにしますが、中途  半端な出来損ないも出来るようにします。→『水素・酸素』と『水素・酸素』など。 ・でも、中途半端な分子は電子の数の関係で不安定であるため、存在している時間をタイマー  で分解(分子)される仕組みをとります。 ・つまり『水素・酸素』と『水素・酸素』の分子は K殻などから不安定になるため安定した  『水素・水素』と『酸素・酸素』に分かれるようにします。 ・上記は気体の H2 と O2 にすんなり分かれて安定な分子になりますが、中には出来損ない  がまた出来て今います。でも、この多様性の性質がシミュレーションには大切なのです。 ・とりあえず、ここまでアドバイス(提案)を終わりにしますが、質問者さんの考えはどうなのか  を『補足』メッセージで聞かせて下さい。

takagoo100
質問者

補足

ご返答ありがとうございます。 お忙しい中、この質問に付き合ってもらい感謝します。 ミニ宇宙での実践は面白そうで、できる限りの範囲でやってみたいと思います。 科学、プログラミング、両方とも中途半端な知識では太刀打ちできそうもないので 基礎からやるしかなさそうですね。 どこまで忠実に再現ということですが、自分としてはとにかく3Dの物体や流体を 画面上に表示させたいのです。そこには秩序(?)があって、物体に物体をぶつけても 簡単にくっついたりしないですよね。つまり1部でもいいので現実のような環境を 再現できれば、そこまで忠実じゃなくてもいいと思ってます(ただ忠実にやらないと無理なんでしょうけど・・・) とりあえず自分は水(流体)と氷(固体)を再現したいと思ってるんです。 ・水に水(水分子)はすぐに混ぜることはできる ・氷と水、氷は混ざらない(あくまで大まかなイメージです) 例えば、水槽に水が入ってたとします。その状態では水分子1つ1つに左右上下から 同じ力が加わっているので静止しているように見えます(厳密には違うんでしょうけど) そこで水槽が突然消えたとします。その途端、水槽に接している水分子は 水槽側からの押す力が無くなり、重力に引っ張られ(自分で言っててなんですが、 なんで横に引っ張られるかは疑問です)水が水槽の形を維持できなくなり 地面に広がっていきます。 一方、氷は固体なので重力にも負けず、その形を維持できます。 横からその氷を押せば押す方向に動きます。 そこでなぜ動くのかを1つ1つの原子自身のプログラム(自分の考えです) で解釈してみたいと思います。 押されてないところの原子も一緒に移動します。なぜかというと、その原子は 押す力(つまり原子同士を離そうとする力)以上の強い力で結合されています。 そして上下左右の原子からどの方向の力が加わっているか調べ加わっていたならその方向へ 座標を移動するプログラムを持たせているからです。 ここで1つの原子を調べるのに上下左右だけではなく、その調べた先の原子にも どのような力が加わっているのかを再起的に調べてるので、その部分が最も 処理に時間がかかるような気がします。なので小さい固体の範囲なら可能かもしれません。 大きくなる度に、指数的に処理が増えそうです。 自分が知りたいのは、その部分のプログラムで、さらに水(流体)の時の 他の水分子との結合の仕方というか、そこらへんが特に知りたいです。 漠然としすぎてて申し訳ありません・・・

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★AIや遺伝的プログラムに近いお話ですね ・この質問は、とても興味深いです。 ・実は私も以前同じようなことを考えたことがあるのです。 ・分子・原子ではなくて、人間の DNA・遺伝子というアミノ酸をヒントに  やはりシミュレーション・ゲームを作ろうかと思ったのです。 ・自己増殖し進化して『単細胞国』と『多細胞国』の戦いみたいな感じです。 ・『3D』ではなく『2D』ですが…。 ・上記のアイディアは『ロード・モナーク』というシミュレーション・ゲームを  参考に考えたのです。でも、難しくて挫折してしまいました。 本題: ・原子自身にプログラムを持たせると壁への衝突『制御プログラム』は必要なくても  学習機能のようなプログラムは必要と思います。これこそが原子自身のプログラム  になってくると思います。 ・そして、このような機能が多分、原子自身のプログラムの中核になると思います。 ・最初は単純な動き回る原子、そして原子同士の衝突・回避、または衝突時の速度や  温度で分子同士の結合をある程度プログラムで定義すべきでしょう。 ・実際の原子も高温状態では『分子・原子』が高速な運動(振動)をしていますので。 ・例えば、太陽は核融合反応を行っているようですが、普通の『水素』と電子を1つ  多く持った『重水素?』の衝突があり『ヘリウム』という物質(原子)になります。  このときに莫大なエネルギーを放出します。→熱、電波、X線、紫外線、ガンマ線など。 ・つまり、基本の原子は『水素』でそれを2つに合体・融合(結合)すると『ヘリウム』  という原子に変化することだけはプログラム側で定義します。よって、結合したときに  出来る物質を、元素番号 1 番(水素)から 118 番(ウンウンクオクチウム)までを定義  します。→もちろんその後の原子の特徴(動き・重さ・性質)なども一緒に。 ・こうしないと原子自身の特徴を持たせることが出来ず、動作が同じになってしまいます。 ・以上。途中ですが文字数の関係でこれで終わりにします。 ・参考にして下さい。 周期表: ・http://www.ss.iij4u.or.jp/~ana/shuuki.htmhttp://ja.wikipedia.org/wiki/%E5%85%83%E7%B4%A0%E3%81%AE%E4%B8%80%E8%A6%A7_(%E7%95%AA%E5%8F%B7%E9%A0%86) 参考: ・http://www.yokoi.appi.keio.ac.jp/item1.html→『物質シミュレーション紹介』ダウンロードあり(mov) ・http://www.rsi.co.jp/kagaku/cs/ccg/products/application/simulation.html→『分子シミュレーション』 ・http://media.laic.u-hyogo.ac.jp/~hayashi/academic/Soc/CS98/abst.html→『分子シミュレーションとインターネット環境』 ・http://www.chem.miyazaki-u.ac.jp/~webms/model.html→『分子モデリングと分子シミュレーション』 ・上記のは google で『原子 分子 シミュレーションとは』と入力して検索してみました。 ・以上。おわり。

takagoo100
質問者

お礼

ご返答ありがとうございます。 やっぱり難しいですか・・・ >・つまり、基本の原子は『水素』でそれを2つに合体・融合(結合)すると『ヘリウム』 > という原子に変化することだけはプログラム側で定義します。よって、結合したときに > 出来る物質を、元素番号 1 番(水素)から 118 番(ウンウンクオクチウム)までを定義 > します。→もちろんその後の原子の特徴(動き・重さ・性質)なども一緒に。 ここはなんとなくイメージできました。ありがとうございます。 学習機能ですか、、、これまた厄介ですね。Oh-Orangeさんのおっしゃる通り たぶんそれが原子自身のプログラムになると思うんですが、それがどういう風に 原子が結合して物体になるのと関連するのかがイメージできないんです・・・ 例えば水素の場合、1つの電子では不安定なので、2つの原子同士が お互いに1つずつ電子を出し合い安定し結合する、そういう風にどんどん結合 していって物体が出来上がるイメージはできるんです(ただそのプログラム構成(書き方) も具体的に分からないので、そこも知りたいです) その学習機能がプログラムでなんとか書き纏められる範囲ならいいのですが、 もしその機能が複雑すぎて無理なら、それを抜きに作成(3Dの物体などを作ることが) することは可能か不可能なのかが知りたいです。

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.3

こういう考え方や実装は存在します. そして,実際に分子計算とかで使われてますよ. 各原子(に模したプログラム)が独立に動いて 相互干渉するようなものは「複雑系」方面でよく議論になっています. 社会学や心理学,株価,ブラウン運動,とかの 各種シミュレーションがこの典型です. #「地球シミュレータ」がやってるのものこの手の計算でしょう 古典的かつ有名なのはコンウェイの「ライフゲーム」でしょうか. また,いわゆる「アバター」を使って 仮想空間で動作するもの(オンラインゲームの類)は この手の考え方ですね. #ゲームの場合アバタは本物の人間が操作しますが #それが「機械になったら」という話とみなせます. これを巨大な規模で行うとすごいことになるので, 複数の機械を使います. 並列計算とかグリッドとかで調べると 山ほどの研究論文や書籍がみつかります. 日本語の研究論文だと, 情報処理学会の「コンピューティングシステム研究会」の 研究報告なんかによくでてます. 主に,巨大分子の構造計算やチェス・将棋のように 組合せ数が膨大になる計算を如何に行うかという話です. この手のものでは,結局, 一個の計算を「独立にできる部分」に分解して, そのそれぞれのパーツを別個の機械に計算させて 計算結果のみを統合させるって話になります. #その中で如何に無駄を省き,かつ各機械の故障や性能, #ネットワークの速度などの不確定要素の影響を排除しながら #どれだけの全体性能をたたき出すかの勝負です 一般人が参加できる,この手の巨大分散計算で,有名なところでは 「SETI@home」(電波を解析して宇宙人をさがそー!というような話)とか 名前は忘れたけど「白血病の遺伝子を調べる」プロジェクトもあります.

takagoo100
質問者

お礼

ご返答ありがとうございます。 ライフゲームって今までなんとなく聞いたことはあったんですけど、 具体的にどういうものか知らなかったので、これからやってみるなり 調べてみたいと思います。 たしかに原子関係のものを実際に実現しようとするなら たくさんの人のPCを使ってそれでも長い時間かかってしまいそうですね・・・ なんか量子コンピューターができたとしても、それでもまだ足りなそうな気がします。

  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.2

化学の知識がないのですが・・・ そのような判定でしたら、物体をセルやメッシュまたはポリゴンで表現して行うと思います。 例えば単純な壁でしたら、有限な平面を表現すればいいので、ただの矩形ですし、凹凸を表現したいのであれば、メッシュになるんではないかと。 ただこれらは、壁という物体に特化したデータ構造でtakagoo100さんがやりたい(理想的には)すべてを同じデータ構造で表現する。 とは違いますね^^; どちらかというと、セル(立方体など)で表現するのが近いですかね~

takagoo100
質問者

お礼

ご返答ありがとうございます。 そもそも3Dの概念自体が複雑ですからね・・・ それに加えて更に原子の振る舞いやら、電子やら、熱はどうするとか・・・・・ なんかとてつもなく無理なことをやろうとしてるのは分かっているんですけど、 なんとか方向性を知りたくて。 ただ厳密に原子を再現したいのではなくて、 簡略化できるならしたいんですよね(そんな甘いものじゃないんでしょうけど)

  • tyty7122
  • ベストアンサー率31% (238/764)
回答No.1

まず化学結合を厳密に再現しようとすると現在のコンピュータの性能では限界がある。SPARTAN、CACheやMOPACなど既存のソフトウェアを使って試してみると良いだろう。MOPACについてはお試し版を富士通のサイトから入手できたと思う。 しかし貴方が考えてる試みは、あらゆる分野で非常に有用なものである。学術的な分野だけでなくゲームとしても実に面白いものが出来るだろう。今までのソフトウェア設計では出てこなかった新しいアイデアを盛り込んで良いプログラムを作成してくれる事を大いに期待している。

takagoo100
質問者

お礼

ご返答ありがとうございます。 それらのソフトを試してみたいと思います。 自分ももしそういうのができれば、ゲームの分野で面白いことが できそうだと思っています。例えば(例えも変ですけど・・・)水道なんかも 作れますよね。タンクを用意して、水道管の中を水が流れ、蛇口で調節する。 こういうのは今の、if分岐で制御してテクスチャを貼り付けて作っていくやり方だと、とてもじゃないけど無理だと思うんですよ。 なので1つそういう仕組み(原子結合プログラム)ができあがれば あらゆることを再現できそうな気がします。

関連するQ&A

  • プログラムについて

    プログラムを勉強していてわからないことが3つあります。 1ソースプログラムを編集し、次にコンパイルしてオブジェクト プログラムを作成し、さらに関数を引用した場合などには他の オブジェクトプログラムと結合し、最終的に実行形式の プログラムを得て実行します。 と教科書に書いてあるのですが、関数を引用した場合などには他のオブジェクトプログラムと結合するとはどういうことですか? 2メモリを多く費やせば処理は速くなり、処理速度を犠牲にすればメモリを節約できるとありますがなぜこうなるのですか? メモリを節約するとどんなメリットがありますか? 3プログラムの高速化では 必要な演算回数を少なくする。無駄な繰り返しを省く。 速い演算を多くし、遅い演算を少なくする。 とあるのですが具体的にどういうことですか? プログラム初心者です。 わかりやすく教えていただければ幸いです。 どうぞよろしくお願いいたします。

  • 原子核モデル

    質量数1~12の安定原子核モデルについて私見を述べますのでご意見ご感想をお寄せください。 陽子の構造と生成機構につきましては過去の質問 https://okwave.jp/qa/q9574329.html https://okwave.jp/qa/q9576768.html を参照してください。 従来の、陽子と中性子がギチギチに詰まった原子核モデルは間違い。 質量数3以上の安定原子核では、陽子は、三陽子結合環状粒子か四陽子結合環状粒子の状態でのみ存在する。 安定原子核においては、陽子の数の、1/3以上2/3未満の極低軌道電子を必要とする。 単独の中性子がベータ崩壊するのは、陽子が、自身の数の、2/3以上の電子を、極低軌道に、安定的に保持することができないからである。 このモデルは、従来のギチギチモデルよりも、原子核の様々な、例えば「強い力は電磁気力の百倍も強いのに、なぜ(複数の)陽子だけで原子核は作れないのか」といった疑問に、シンプルに答えることができる。

  • プログラム解析について

    例えばゲーム会社が発売したゲーム(例えばPS2のソフト)のプログラムというのは同業他社がプログラム解析することは許されてませんが、技術的には可能なんでしょうか?何か暗証番号が必要になったりするんでしょうか?その解析結果によってグラフィック処理のプログラムを盗まれたりすることはありえるんですか?

  • プログラムの構成について

    構成上どれがいいんでしょうか? 1.複数のプロセスで同時に実行できるようにしたプログラムは再帰的である。 2.逐次再使用可能なプログラムは、再入可能でもある。 3.再入可能プログラムはを実現するためには、プログラムを手続き部分とデータ部分に分割して、データ部分をプロセスごとにもつ必要がある。 4.再帰的処理のためには実行途中の状態をFIFO方式で記録し、制御する必要がある。

  • C#/C++を使って3D画像をゲーム画面に表示

    C#/C++に3Dグラフィック画像を使ってゲーム制作をしようと考えてるんですが、3D画像をゲーム画面に表示させるときに、どのようなプログラム処理内容を打って画像の描画を行わせれば良いのか、そこを教えてください。 後付け足しで、3Dグラフィック画像とドット絵の画像をC++ではどのフォルダーに保存しておけばよろしいですか? 3D画像をどうしてもゲーム画面に表示させるようにしたいので方法をお願いします。 わかりやすいプログラム・説明の回答を待ってます。 宜しくお願いします。

  • C# ゲーム作成 FPSと描画処理に関して

    環境はVisualStudioC#Expressを使っています。 今回動きのあるゲームを作ろうと思ったのですが、 最も基本となるFPSの処理と再描画の処理が理解できません・・・。 簡単な動きのないアプリケーションくらいしか作れない程度のレベルなので、かなり細かいところになると分からないと思います。 プログラムだけ書かれてもどこにそれを書けばよいのか分からないほどだと思います。FPSに関してはTimerコンポーネントを使ってみたのですがうまくいきません。 そこで教えていただきたいことは、 (1)簡単なFPSのサンプルプログラム(出来れば精度とかもあるのでみなさんが普通にゲームに使っているようなものを) (2)簡単な再描画処理のサンプルプログラム (3)C#ゲーム作成にオススメなサイトや本 出来ればVisualStudio前提の説明だとありがたいです。 とりあえず球が『60FPSで動き、画面も再描画される』ことが目的です。

  • D言語+SDLでシミュレーションゲームを作りたい

    D言語+SDLでシムシティみたいなシミュレーションゲームを作っているのですが、クリックしたときにマス目にそって物体を配置するような処理はどのようにすればできるのでしょうか。どうしても物体が重なってしまいます。画像は24×24を使っています。

  • 法線について。

    どのカテゴリで質問しようか迷ったのですが、ここで質問することにしました。 現在OpenGLを使用して物体の描画を行うプログラムをC++6.0で作成しています。 特別な処理を行うため、結果としてポリゴン数が100万ポリゴンを超える場合もあります。 ポリゴンの描画としては単にそのポリゴンから求めた法線を割り当てているだけなので、フラットシェーディングとして描画しています。 しかしそれを改良して法線を計算しなおし、スムーズシェーディングでの描画を行えるようにしたいと考えています。 そこでスムーズシェーディングの描画にするためには、法線をどのように計算しなおせばよいでしょうか?先ほど述べたように100万ポリゴンを超えることもあるので、できたら多少高速なアルゴリズムがあればと思います。 ご存知の方がいたらご教授よろしくお願いします。

  • 当たり判定

    ゲームで欠かせない処理それが「当たり判定」ですよね。 攻撃によるダメージ、倒したり、倒されたり。 アイテム獲得や複雑な地形に対する行動範囲設定。 複雑な形をした敵(ボスキャラなど)の当たり判定など。 当たり判定にも多数あり、それぞれメリット・デメリットがあると思います。 最近はゲームも2Dから3Dに移りつつあるので方法は余計に増えてきたと思います。 その「当たり判定」の方法とメリット・デメリットを出来るだけたくさん教えてください。

  • 浮上型原子力発電所はできませんか?

    現在の原子力発電所は地上建築物か型が主流ですが、電源立地の公民館、体育館まで作らなくてはならず、また幾ら金をばら撒いても反対されるイデオロギー論争的様相を示してきており、発電の化石燃料依存が緩和しません。 軍事大国が原子力空母を建造していることから思いついたのですが、日本の造船技術と原子力発電所設計技術を融合して、1ギガワット程度の加圧型の商用原子力発電所を浮上型で建造することはできるでしょうか? 造船所で浮上型原子力発電所を建造し、それを東京湾など電力消費地近傍の海上、または河川上に曳航し、その場に錨をおろし(固定し)発電をします。消費地の近くで送電損失が最小ですし、海上、河川上は個人の使用権が及ばないために立地問題が軽減するメリットがあります。 それ以外のメリットとして、 1.造船所での繰り返し生産で、建造費に占める設計費の低下が可能。 2.炉心冷却に必要な水を海水からの濾過水で調達可能。 3.水中浮揚型なので耐震性が高い。 4.炉心溶融事故に際しても周辺水の潜熱で冷却可能。 5.廃炉の際には造船所に曳き戻してから集中処理。 6.途上国に輸出する場合でも、国内雇用が最大限活用される。 など、など、いくつでもあげられます。 炉心隔壁内部だけを作成し、原子炉周年の建屋で実施されている制御・管理などは遠隔で集中監視・集中制御するようにするとよいですね。途上国に輸出したり、ODA供与して世界のCO2削減に貢献しながら、その国が核ミサイルを日本に照準してきた場合には、電力供給を一時的に中止するなどの抑止力になもなるでしょう。 今までの加圧水型の原子力発電所が陸上に建設されてきた理由、そして、今後海上浮揚型原子力発電所が建造される可能性に関して、科学的見地でのアドバイスをいただけれたら幸いです。

専門家に質問してみよう