砂粒 (+ARPG進捗)

ps2_sand

つぶつぶ2に砂を追加しました。
初となる砂状の粒子です。

>> Play つぶつぶ2

 

以前は諦めかけていた砂粒子ですが、試行錯誤の末実装することができました。
特に苦労した点は次の二つです。

・液体のようになる
・簡単に圧縮される

つぶつぶ2の粒子は周囲の粒子とゆるいつながりを持っており、それぞれが少しずつ
影響を与え合うことで滑らかな流体を再現していましたが、それが仇となり砂のような
きっちりとした境界を持った粒子を扱うことができませんでした。


流体の計算モデル。SPHと同じく、影響半径内の粒子がゆるいつながりを持っている

 

そこで一旦計算モデルを変え、相互作用を狭い範囲に限定した上で
バネダンパモデルを適用してみました。


砂の計算モデル。剛体と同じように明確な繋がりがある

 

結果、一応砂らしくは動いてくれるようになったものの、
今度は簡単に圧縮されるようになってしまいました。
流体の時にはあったゆるい繋がりがなくなったためと思われます。

バネ係数や影響半径を変更したり色々試した結果、
爆発しない範囲でバネ係数を最大にしつつ、ゆるいつながりによる力を持たせたまま
砂の計算モデルを適用し、かつ2回の繰り返し計算を行う方法に落ち着きました。
若干流体よりも重くなりましたが許容範囲です。

 

未解決の問題として、安息角の低さがあります。
45度くらいが理想的でしたが、15度ほどになってしまいました。
摩擦係数など色々な調整を試みましたが効果は見られず。
これはどうしたらいいんでしょうかねぇ…


砂を積み上げる


崩れ出して…


こんな平らになりました

そんな訳でサラッサラの砂です。うまく使ってやってください。

ARPG

進捗:30%


すすまない。

46 Responses to “砂粒 (+ARPG進捗)”

  1. mihaell より:

    他の人のアップロード作品を見て、何だこの粉粒は? と思ったらSand更新されてたんですね!
    更新お疲れ様です!

    安定角の問題は粒子同士の反発にあると思います。
    試しに平たいWallの上に積み上げてみました。ゆっくり乗せれば45°は可能なのですが、この時すでに粒子がプルプル震えており、安定性に欠けて、上に砂を追加する程度の軽い衝撃で崩れてしまいました。
    粒子の振動は周囲に隙間があると発生する様です。
    粒子は仕様上蜂の巣状の六角格子状が一番安定しますが、砂が収まれる配置の選択肢が複数あると納得がいかない様子で振るえます。
    この収まりの悪さは恐らく、粒子同士の反発が強すぎる為ではないかと思います。

    周囲の砂の速度が遅い場合は六角格子状にビターーッ!っと安定する様な仕様にしないと安定角45°は難しいんじゃないかな?と思いました。

    長文済みません。あと、もう一つ、要望があります。
    冷却機の様なものを導入して欲しいです。
    LavaやGasをMetalと組み合わせる事で簡単に熱源が作れるようになりましたが、逆に冷ますのは難しく、Iceも直ぐに水になってしまい使い勝手が悪いです。
    そこで、熱源ならぬ冷源となる何かが欲しいです。
    よろしくお願いします。

    • saharan より:

      ありがとうございます。
      粒子が振動するのはおそらく毎回内部で粒子の順番をランダムに変えているためと思われます。
      これをしない場合、プログラム上は番号の先頭から順番に粒子を処理していくので、上から下へと粒子を追加した時に、上から順に力の計算が行われていき、下の方に溜まった力が逃げ場を失い、結果として重力などによって圧縮されやすくなってしまいます。
      副作用として粒子の振動などが生じますが、今の所は特に問題にはなっていません。

      砂の崩れやすさは粒子の形にも問題があるのかなーとも思いました。

      ”川砂では角が立っているので急角度でも安定であるが、海砂では角が取れているので緩やかな角度でも流動してしまう”(Wikipediaより)

      だそうなので、擬似的に形状を六角形にしてみるのも効果があるかもしれません。
      かなりの負荷増大に繋がりそうなので予定はありませんが…

      > 冷却機の様なものを導入して欲しいです。

      確かに今のままだと冷却がなかなか大変ですね。
      液体窒素あたりが有力候補です。

      • mihaell より:

        またこれは無理難題だと言われてしまいそうですが、液体窒素を導入するならば、
        液体ヘリウムを導入して欲しいです!

        つまり、超流動です!

        面白そうではありますが、処理の方法が皆目検討が付きませんw
        気が向いたらで良いので、ご検討下さい。

        • saharan より:

          粒子法では粘性を0にすると粒子が暴れだすので超流動の再現は少なくともそのままでは不可能ではないかと思います・・・
          いずれにせよ今は表面張力がきちんと計算できていないので、まずはそこの修正からですね(作用・反作用の法則が成り立っていない状態で、水銀に謎の推進力があるのはこのため)。

        • もちもち より:

          液体じゃなくて気体のヘリウムが欲しい。
          風船とか作りたいし。

          ヘリウムはガスを加工する感じでおながいします。
          まぁ、役に立つとは思えないけど。

  2. もちもち より:

    砂粒キタ!こいつはいいぞ!

    ふと思ったんですが出来ればひもが欲しいですな。
    こう、ゴムより丈夫でウッドみたいな燃え方して
    ペンの太さで太さが変わる…

    そんなのが欲しいですな。

    • saharan より:

      ひもは使い勝手がよさそうですが実装が難しそうですね…
      今のゴムに使われているバネを改造して繰り返し計算に対応させればいけそうですが計算量が課題です。

  3. 冷蔵庫 より:

    これは頑張りましたなwここまで来ると効果音ほしいw

  4. ジェット天狗 より:

    いつも楽しく遊ばせていただいております。
    この前、酸が登場しましたが、さすがに強力過ぎはしないでしょうか。
    特に水さえも腐食(?)して消えてしまうのは凄く気になります。
    水には反応しない、木やゴムの腐食には時間が掛かる、などの変化を付けて頂けると「それらしく」なるのではないかと思います。
    もしよろしければご検討ください。
    では。

  5. もちもち より:

    砂があるなら泥がいる(tr

    水を吸収して粘性が増し、
    加熱すると固形の砂になる。
    しかし固めた状態で水をかけると
    泥になって溶ける。

    というのはいかがですかな?

  6. 名無し より:

    オオーRPGー
    きのことか攻撃で取れたらイイナー
    雷とか火系の魔法でとったら焼ききのことかw

  7. 匿名 より:

    溶岩は冷えると固まるようにしてみたらどうですか

  8. にこにこ より:

    つぶつぶ2にてアップロードしたゲームの説明をここでします。ダメな場合は消してくれてかまいません。
    遊び方
    1、画面左下のマグマをつかむ
    2、そのままDrainにぶつからないように右側にマグマを投げる。
    3、右側でマグマをキャッチ。(ここで1点)
    4、左側へ投げる。
    5、再びキャッチ。(ここで2点)
    6、2に戻る。(Drainにぶつかってマグマが消えるまで無限ループ)

    得点を多く稼げるようにしましょう。

  9. souki より:

    ブログがあったことに今更気づきました(;´∀`)
    いつもつぶつぶ2やカラクリエイター2で遊ばせていただいております
    これからも頑張ってくださーい(笑´・w・`)

  10. tatsuki より:

    kesuyaさん、ゲームのほうでも言いましたがパクらないでください。

    • nazo より:

      パクリとか別にどうでもいい(著作権とかそんなものないし) 楽しめたらそれでいい
      そんなことより OOは死ぬシリーズよりも なんか別のものを作ってみてはいかが?

  11. tatsuki より:

    固形の物が他の物を通り抜ける現象をなくせないですか?(圧縮とかするとなります)

  12. Name より:

    つぶつぶ2にてアップロードしたゲームの説明をここでします。
    をみておもったんだけど掲示板とかほしいよね

  13. souki より:

    カラクリエイター2のことですが、選択した範囲の物体を一気に移動とかできるようにしてくださると嬉しいです。

  14. tatsuki より:

    アップロードしたゲームの遊び方
    ジャンル的に「防衛」かな
    1:酸が来る前に色々置く大体45秒(ブロック以外はOKシャワーは上に1箇所1粒)
    2:スタート後は祈るだけ
    クリア条件:45秒間耐久
    失敗条件:45秒以内に人が死ぬまたは負傷する
    3:酸以外で死ぬまたは負傷しても失敗(マグマ・火+TNTなど)
    (すいませんがミスがあります。鉄の右下の隙間を3つにしてくださいm(_ _)m)

  15. hiranet より:

    物理演算のページを探していてここにたどり着きました。
    水面・流砂・地球に感動しました。

    自分につくれるかわからないのですが、可能なことかどうか教えてください。

    風船のように形が可変のものの中に水(液体・流砂)を入れ、風船を回転させた時に中の水が
    どのような挙動をするか、その際に、中身の重さで風船がどのように変形するかを見られるものを
    作成したいと思っております。
    その際に、研究所の「地球」のようにマウスで風船を回転させながらできれば最高なのですが・・・。

    よろしくお願い致します。

    • saharan より:

      ありがとうございます。
      返信が遅くなってしまってすいません。

      変形する物体と流体との相互作用をライブラリなしで1から作成するのは
      なかなか難しいと思います……。

      2Dでしたら流体をSPH等の粒子法でシミュレーションしつつ、風船も粒子を
      使うか(丁度つぶつぶ2のようになりますが、圧力によって粒子がすり抜けます)、
      板状の剛体の繋ぎ合わせで再現するなどの方法があります。

      マウスで風船を回転させるのはシミュレーション自体ができてしまえば
      そこまで苦労はしないと思います。

      • hiranet より:

        返信ありがとうございます。

        やはり変形する物体は難しいですかぁ。
        物理演算のライブラリ等を探してみてはいるのですが、やりたいことに使えそうなのは見つけられていません。
        このページでもう少し勉強させていただきます。

  16. Name より:

    もう更新してから2ヶ月・・・
    ARPGカナー

  17. tatsuki より:

    aaekuoさんの作品が気分悪くなる

  18. akinori より:

    お疲れ様です。
    つぶつぶ2の(たぶん)想定外の動作について報告致します。

    ◆有重力→無重力の作用
    「Gravity:On 、Pause:Off」の状態から
    「Gravity:Off」の状態をロード(LO)すると
    静止しているはずの物質がゆっくりと下向きに動きます。

    ◆移動式Wall等
    下半分に圧縮された Water(気体)が詰まっており、上半分に何かしらの固体(Solid)が在る時、
    Pause をかけた上で当該固体を上書きするように Wall や Drain を設置して Pause を解くと、
    Wall や Drain の一部が固定されなくなることがあるようです。
    具体的な発生条件は判りません。
    この稼動式Wall等は重力の影響を受け、Block 以外の物質には普段通りの影響を与え、
    Block の影響を無視し、Boundary の OnOff に関わらず画面外まで移動します。
    なお、テストとして投稿させて頂いた「移動Drain」は Gravity:Off の状態で作成した
    移動式Drain を前述「有重力→無重力の作用」の要領で動かしました。

    ◆圧縮Water
    徹底的に圧縮した Ice を Pause:On の状態で解凍(0℃~99℃にする)し、
    Pause を解除すると、妙な固体(圧縮Water)が出来ることがあります。
    圧縮Water は重力の影響を受け、Wall の影響を無視し、
    Block 以外の物質を押しのけ(おそらく Mercury よりも質量が大きい?)ます。
    また、固体を構成する Water 粒子の数と体積(面積)の大きさが反比例するらしく、
    圧縮Water の一部を Erase で削除したり、温度を上げて気化させたりすると大きくなります。

    • saharan より:

      報告ありがとうございます。
      おお、まだこんなにバグがあったとは…!

      特に移動式Wallと圧縮Waterは驚きました。
      重力バグは心当たりがあるのですぐ直せそうですが…
      詳しく原因を調べてみます。

  19. ??? より:

    壁にも温度がある。仕様ですかな?
    仕様だったら温度測定できるようにしてほしいです

    • ??? より:

      補足

      爆発熱のみ反応します。
      溶岩では反応しませんでした。

    • akinori より:

      ユーザーの一人です。
      saharanさんに代わって勝手にお答えします。

      仰っているのは、TNT や Gas の爆風による影響のことだと思われます。
      これらの爆風は壁(Wall)を含む障害物を無視して、他の物質に影響を与えます。

      具体的には……
      TNT の爆発は粒子21個分程度の距離までにある物質を風で煽り、
      粒子15個分程度の距離までにある物質の温度を上昇させます。
      また、Gas の爆発は同10個分程度の距離まで、それらの効果が及びます。

      なので、爆発による熱は Wall を介して他の粒子に伝えられているのではなく、
      Wall を無視して直接その粒子を温めているのです。

      したがって、Wall が温度を持っているわけではありません。

    • saharan より:

      遅くなりました。

      akinoriさんの書かれている通りで、壁自体は熱を伝えることはなく、
      爆発による熱は壁を通り越すためです。

      Gasの場合は、TNTと同じだと一瞬で爆発して消えてしまったので、
      威力と温度の上昇範囲は弱めに設定してあります。
      またTNTのように固体を破壊することもありません。

  20. Name より:

    ウゴゴゴg、、更新、、、オソイ、、、シニ、、ソウ、、、

  21. munpyeong より:

    カラクリエイター2の使い方がよくわかりません。
    どなたか教えてください

  22. tatsuki より:

    soukiさんの作品を消してください。

Leave a Reply