パスワードを忘れた? アカウント作成
12658949 story
ゲーム

awkで実装されたFPS 40

ストーリー by hylom
正直スゴイ 部門より
route127 曰く、

awk(gawk 4.0以上)で実装されたというシューティング(FPS)ゲーム「awkaster話題になっているawkで作られた3Dシューティングゲーム「awkaster」が凄い)。

記事中にもあるようにレイキャスティング法を用いているそうなのだが、レイトレーシングとの違いや647行で実装できるものなのか等スラド諸兄に聞いてみたい。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by T.Sawamoto (4142) on 2016年01月20日 18時53分 (#2952487) ホームページ

    レイキャスティングと言っても、タレコミのリンク先にあるような本格的なものじゃなく、Wolfenstein 3Dと同じ方式ですね。

    Ray-Casting Tutorial [permadi.com]
    (英語ですが、分かりやすい内容です)

    このタイプでは、視線追跡に1次元(2次元マップ中にいるため)しか必要ありません。
    (壁の高さは、距離から計算で求められる)
    かつ、壁にぶつかった時点で追跡を打ち切っていますので(透過・反射なし)、計算量はさほど大きくならないはず。

    --
    へ へ
    の の
  • by Anonymous Coward on 2016年01月20日 22時48分 (#2952565)

    ascii 文字による描画なんてアルゴリズムにしたがって計算して
    エスケープシーケンスを投げまくればいいだけなんだから、
    その気になれば awk だろうが sh だろうが brainfuck だってできる。
    わざわざ awk でそれをやるんか、というだけで、別にすごくはない。

    こいつのすごいところは、行単位でしか入力を読み取ることができない仕様の
    awk で実装されてるのに、キーボードからの入力をリアルタイムで
    読み取ってるということなんだよ。

    どうやって実装してるんだこれ、とコードを確認したら、

    system("stty -echo")
    #avoids depending on bash and gawk
    #by izabera from #bash on freenode
    cmd = "saved=$(stty -g); stty raw; var=$(dd bs=1 count=1 2>/dev/null); stty \"$saved\"; echo \"$var\""
    cmd | getline input
    close(cmd)
    system("stty echo")

    …うん、ぜんぜんすごくなかった。
    awk でできないから外部コマンドに丸投げしてるだけ。

    • by Anonymous Coward on 2016年01月20日 22時59分 (#2952569)

      「awk内部でなんでもできるもん」という言語を作ろうとしたらperlになっちゃったわけで、awkのプログラムが外部コマンドにおんぶにだっこなのは仕方ないんじゃ・・・。

      親コメント
      • by Anonymous Coward

        まあケチつけることに関しては、スラド民の右に出るものなしということで。

    • by Anonymous Coward

      ま、まぁ、こうなるわな…

    • by Anonymous Coward

      これをスゴイと思った人は何をどうスゴイと思ったのかちょっと興味があるな
      awkはワンライナーしか書けないとか、もっとずっと遅いというイメージがあったとか?

      • by Anonymous Coward

        コード読めない人には魔法に見えるんじゃないっすか?
        一番単純な実装だとこうだろうなぁ…でもすごいって言ってるからなんか違うのがあるのかも?
        とかちょっと期待したのが悲しくなった

      • by Anonymous Coward

        awkって遅いかな?
        単純な処理ならperlよりずっと速かったりして便利だった記憶があるけど

      • by Anonymous Coward

        思いついたことをとりあえずやってみる能力ですね。
        大抵の人は、まずやらない言い訳を考えようとしますから。

        • by Anonymous Coward

          同人ソフトはおしなべて「思いついたことをとりあえずやってみた」産物ですが、いちいちスゴイとは言って回りませんよね

    • by Anonymous Coward

      やる気になれない、向かないことをあえてやった点が凄いのかと。
      ♯実験的にやるならいいけど、仕事ではイヤな部類。

    • by Anonymous Coward

      >awk でできないから外部コマンドに丸投げしてるだけ。
      それはそれでawk的には正しいやり方に思えるが。

  • by Anonymous Coward on 2016年01月20日 17時26分 (#2952442)

    MSXの激走ラビリンスみたいやね
    見た感じレイキャスティングとか言うの必要か?コレ
    実質2次元に見えるので、左右でスィープして遠いところは短い棒、
    近いところは長い棒を書けばこんな感じに表示できるっしょ
    会社の研修の時にCASLでこんな感じの作ったわ

    • by taka2 (14791) on 2016年01月20日 18時47分 (#2952482) ホームページ 日記

      紛らわしいのですが、
      ストーリーに掲げられているリンク先で説明されている「レイキャスティング法」は、
      ボリュームレンダリングを行うアルゴリズムの一つで、
      一言で説明すれば「レイトレーシングを使ってボリュームを描画する」というものです。
      例えば、「半減距離1000の半透明ボリュームを、レイが長さ500だけ横切った」場合には、
      「そのボリュームの色を25%、そのボリュームの先にレイを飛ばして得た色を75%、ミックスした色」が
      そのレイで得られる色になるってことです。でも、それは今回のストーリーとは関係ありません。

      一方、FPSに使われている「レイキャスティング法」は、上記のボリュームレンダリングにおける「レイキャスティング」とはちょっと別物。
      3Dダンジョンなどの「垂直な壁しかない空間」という状況限定で、非常に高速にレンダリングできる、というDOOM時代のFPSに使われた技術です。
      一言で説明すれば、「中央部の水平1ラインだけレイトレーシングを行い、どの壁が見えるか判定」し、「その壁までの距離とその壁の高さに応じた長さの縦線を描画」するというものです。

      > 左右でスィープして遠いところは短い棒、近いところは長い棒を書けばこんな感じに表示できるっしょ
      それがまさに「レイキャスティング法」です。

      親コメント
      • 説明が微妙に間違っていると思います

        まず光線に沿って空間を走査する方法を
        レイキャスティング法やレイトレーシング法と呼びます
        https://en.wikipedia.org/wiki/Ray_casting [wikipedia.org]

        呼び方が2つあるのは,
        光線(Ray)を空間に飛ばす(cast)と捉えればレイキャスティング(ray casting)
        光線で空間を走査する(trace)と捉えると レイトレーシング(ray tracing)と呼ばれるからです.やっていることは同じです

        この方法を使って
        コンピュータグラフィックスの分野では,ボリュームレンダリングという処理を実現するアルゴリズム
        ゲームの分野では,FPS用のマップ表示アルゴリズム
        が考案されています

        つまり,前者は形状データを含む空間を光線で走査していて,
        後者は壁で構成されたマップを含む空間を光線で走査していることになりますが
        やっていることは大差ありません.

        たとえば,前者のボリュームレンダリングの特殊な場合,
        つまり空間が2Dで,半透明の壁が無くて,かつその空間を水平に走査する場合のアルゴリズムを考えると
        それはDOOM時代のFPSのアルゴリズムと同じものになります.

        親コメント
        • 一般的には

          レイキャスティング(広義): レイ(光線)と物体などと交差判定を行うという3次元処理についての一般用語。

          レイキャスティング(狭義): 画面の画素ごとに「視点から物体に向けて」レイを飛ばすことで隠面消去を行う、レンダリング(3D空間の2D画像生成)アルゴリズム。論文発表は1968年。

          レイトレーシング: レイキャスティング(狭義)を拡張したレンダリングアルゴリズム。論文発表は1979年。レイキャスティング(狭義)では、画素ごとに1本のレイを飛ばすだけですが、反射・屈折・影などで再帰的にレイを増やすことで、よりリアルな画像生成ができます。反射屈折のないレイトレーシングはレイキャスティング(狭義)と同じなので、レイキャステイング(狭義)と同一視されることがある。

          レイキャスティング(ボリューム): レイトレーシングを用いたボリュームレンダリングアルゴリズム。正しくはボリュームレイキャスティング法 [wikipedia.org]という名前になりますが、ボリュームレンダリング業界では「レイキャスティング」とだけ呼ばれる場合が多いです。

          レイキャスティング(FPS): レイキャステイング(広義)を利用した「垂直な壁と水平な床しかない」という限定状況での高速レンダリングアルゴリズム。このアルゴリズムのキモはレイキャスティング(広義)を使っていることではなく「水平方向1ラインの最近面判定だけで2次元描画できる」という点。特にアルゴリズム名は付いてないため「レイキャスティング」と呼ばれる場合が多い。

          という感じになるかと。

          「レイキャスティング(狭義)」「レイキャステイング(ボリューム)」「レイキャスティング(FPS)」は、どれも「レイキャスティング(広義)」の応用ですが、それぞれのアルゴリズムのキモとなる部分は全然別。
          以上を踏まえた上で、

          ストーリー本文で、「レイキャスティング(ボリューム)」のページを参照してレイトレとの違いを疑問に思っているし、
          親コメントでは「レイキャステイング法なんか使わなくても…」と言いながら、その後に「レイキャスティング(FPS)」のアルゴリズムについて説明をしてたりするんですから、
          それがどれも「レイキャスティング(広義)」に属するアルゴリズムだからといって「やっていることは大差ありません」なんて書いてもなんの意味もないでしょう。

          そこで、その差の部分について強調して言及したのが元コメントになります。細かい不正確さがあるのは覚悟の上。

          親コメント
      • by Anonymous Coward

        リンク先が同発音別用語とは思わんかったわ
        Wolfenstein とかdoomも同じやったんやね、
        まぁテクスチャ貼るだけやしな…

        • by Anonymous Coward

          原理は同じだから同じ名前になっちゃうんじゃね

      • by Anonymous Coward

        3Dダンジョンなどの「垂直な壁しかない空間」という状況限定で、非常に高速にレンダリングできる、というDOOM時代のFPSに使われた技術です。
        一言で説明すれば、「中央部の水平1ラインだけレイトレーシングを行い、どの壁が見えるか判定」し、「その壁までの距離とその壁の高さに応じた長さの縦線を描画」するというものです。

        DOOMって階段とか段差とかあったからそれだけじゃ描画できないよ。

        • by Anonymous Coward

          中央部と、段差のある部分に言い換えればOK

          水平でない階段や段差はなかったでしょ

          • by Anonymous Coward

            その辺りの、不可能なはずだったことを、可能にしていく進歩あれこれが熱い時代だった。
            レイキャストも壁のデータの持たせ方を工夫して、とかいろいろ解説されてた。
            現在も続く、GPUをぶん回してよりかっこいいCGをレンダリングするための計算テク開発競争の走り。

          • by Anonymous Coward

            中央部と、段差のある部分に言い換えればOK

            ちょっと何言ってるのかわからんですね。

            • by Anonymous Coward

              > 中央部の水平1ラインだけレイトレーシングを行い

              段差が1段なら床が2面(水平)に段差の面(垂直)が1つだからそれぞれサンプルして3ラインをレイトレする

              段差が床と平行でないならこうはいかないが

              • by Anonymous Coward

                段差が1段なら床が2面(水平)に段差の面(垂直)が1つだからそれぞれサンプルして3ラインをレイトレする

                DOOM知らないということは分かった。

    • by Anonymous Coward

      激走ラビリンスってのは知らないけど、
      wolfenstein 3dに見えた。

    • by Anonymous Coward

      プチコンでやってる方もいますね。
      プチコンに激走ラビリンスを移植してみた [nicovideo.jp]

    • by Anonymous Coward

      SeeNaを思い出した
      https://www.youtube.com/watch?v=cZKx6vbvy84 [youtube.com]

    • by Anonymous Coward

      WAYOUT [youtube.com]思い出した

    • by Anonymous Coward

      P6スペハリ(ry
      https://www.youtube.com/watch?v=cpLFLWAoxvM [youtube.com]

    • by Anonymous Coward

      FPSというよりダンジョンゲームに近い気がしますが…
      https://www.youtube.com/watch?v=364J35Sk3zM [youtube.com]

      • by Anonymous Coward

        FPSって何の略か知ってる?

        • by Anonymous Coward

          一人称視点射撃遊戯。射撃要素が無いのならSは何になるだろ?

  • by Anonymous Coward on 2016年01月20日 22時46分 (#2952564)

    Z-80 4MHz RAM 64kB の時代から
    CPU は GHz RAM は 1GB超 なんだよなぁ。

    Z-80 シミュレータを書いて1命令1000stepかけても Z-80 2MHz で
    動くんだよなぁ。

    • by Anonymous Coward

      そうだね。
      ときにPC-E200?それともAKI-80?

    • by Anonymous Coward

      システム全部がCPU内部キャッシュに入りますね

    • by Anonymous Coward

      Z80ってのIPCって1でしたっけ

      • by Anonymous Coward

        そういえば最低4サイクルじゃなかったっけ? IXとかいじるので最大20くらいだった気がします。

        • by Anonymous Coward

          最速のNOPでも4サイクル必要だったね

typodupeerror

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

読み込み中...