WCE blog

早稲田大学公認 総合デジタル創作サークル 早稲田コンピュータエンタテインメント

三幕構成で物語の要素を考える

一人っきりのシナリオ班雀荘です。

今の流れならもうなんかこのまま
「おいしいうどんつゆの作り方」
とかでやってもいけるんじゃないかと。

いや、やらないし知らないけど。


今回はシナリオ班っぽいことをしようと思います。


三幕構成の導入[レッスン1、妙な期待をするな]


「三幕構成」というものがあります。
物語を「序盤、中盤、終盤で構成される」という考えで、
洋画なんかはこの三幕構成で主に考えられているらしく
2時間映画で考えると「序盤30分」、「中盤1時間」、「終盤30分」
という形式になっているのがほとんどだとか。

今回はこの「三幕構成」で物語の構築を大雑把にマトリックスなどを引き合いに
いろいろ考えていきます。
(きっとみんな知ってるだろう)


多分これをやっていくと、
いい感じにジャンプのバトルもの読み切りみたいになる気がします。

第一幕[謎の主人公・・・一体何者なんだ!]

第一幕では主人公を取り巻く状況などを
認知してもらうことになります。

そういうわけで、
主人公が「何者」で「何を望んでいるのか」
つまりは「何がしたくて・欲しくて」「何がいらないのか」
を考え、描写しましょう。

主人公の動機は物語のゴールを定めることにもなるので、
とても大事な要素です。
「欲しいもの・望み」があるから彼は
「日常」から「非日常」への変化の「きっかけ」に
飛び込むわけです。
もし主人公が特に現状に不満を持っていないのなら、
「きっかけ」に飛び込んでくれるわけがありません。
ここをおろそかにすると、後々困ります。割と。

もし必要なら「主人公を後押しする・引き上げる人間」とかを設定します。
主人公の欲求が今の生活とは違うもの、
漠然とした例えば「充実感」を求めている場合、
この人物がきっかけを与えることとなります。

マトリックスは後者に該当します。
ネオは凄腕プログラマーで「望み」とか大してないけど
「もやもやとした現実への違和感を感じつつ、
ぐったりと毎日を送っているところに『メール』が届いた」
みたいな感じで動き始めました。
この「メール」の送り主がネオを押し上げてくれる存在です。
この時点でネオはただの一般人ですからね。
「きっかけ」に飛び込む感じじゃないですね。


ともかくこうして主人公が
第二幕で「非日常」に突っ込んでいきます。

第二幕[「敵って?」「ああ!!」]

主人公は「望み」を持っていますが、
当然それは簡単に手に入ってはいけません。
手に入ったら物語は終わってしまいます。

そこで敵が必要になってきます。

この敵は物語を引き伸ばす要因みたいなもので、
物理的な敵や精神的な葛藤などです。
悪者でもなくとも、
例えば「ローマの休日」ならあのお姫様が敵なわけです。
彼女の存在が主人公(新聞記者)の
「スクープで大儲け」という目標において
「彼女への恋ごごろ」みたいな感じで立ちはだかります。

マトリックスのネオなんかは、
この第二幕でやっと「望み」を手に入れます。
「ベース基地の仲間」がそれ。
この仲間を守るために彼はわざわざ困難(エージェントとか)に
立ち向かうのですから。
敵はエージェントやなんか基地を探してる生き物とかですね。

第二幕としての物語要素はおそらくこれらを通しての
「非日常」の理解とその中での主人公の方向性を決めるのがメインになると思います。

マトリックスなら基地での食生活やどのようなシステムなのか、
この状況はどういうことなのか。
敵はどういう奴でどのくらい強いのか。
というのがいろいろな描写を通して説明されますね。

さて、こうしてモーフィアスがさらわれるなり
敵の総攻撃が始まったり
お姫様の帰りの期日が来てしまうなどして
主人公が抜き差しならない状況になって第三幕に入ります。


ここで何か自分で作った展開に疑問符がつくようなら第一幕を見直したほうがいいようです。

第三幕[望みを言え・・・。主人公が支払う代償はたった一つ・・・。]

クライマックス。
主人公は最終的な「望み」に向けて全力アプローチしちゃうわけです。

そして死ぬ。
精神的にないし物理的に。
ここの主人公へのいじめ具合は
結構作品評価とかに関わってくる気がします。
いかにして希望の芽を潰していくか、
視聴者・読者の思考を誘導するかなどが腕の見せどころかと。

そして生まれ変わる。

ジャンプで言うと主人公が「もうだめだ・・・」とか言って、
マトリックスだとネオがスミスにぼこぼこにされる。

でもこの後のことはみなさんお察しつくでしょう。

主人公に「何かの閃き」や「何かが訪れる」などして
逆転勝利を収める。
ジャンプなら可愛い女の子や友達を守ったりでき、
ネオならエージェント・スミスを頭突きでぶっ飛ばし、
ローマの休日」ならお姫様に「ローマは素晴らしい街でした」
と言われる。
敵の排除。心が打ち勝つ。一歩を踏み出す。

「望み」が叶う。大勝利。

主人公は何かを得て「日常」に戻れるでしょう。


もし自分で書いていて、このシーンに疑問符が湧いてしまった場合、
それは第一幕に問題があるようです。
それは主人公にとってそこまで必要だったのか?
その主人公は本当にそんなことするのか?
主人公の動機ってなんだっけ?
今一度主人公像を見直してみましょう。

最後[おばあちゃんが言っていた]

三幕構成は三角ベースだと。

どういうことかというと
「1,2塁間が長い」、
そして「最後はホームベース」に
帰ってくるということ。
主人公は必ず最初の位置に戻ってくる。
しかしそこには栄光の1点が追加される。

このイメージが基本だそうです。
しかしまあ、世の中いろいろな映画があるわけで
ホラーなんかはこれにあまり沿わないだろうし
(みんな生きたいと思ってる)
文学的に感情なんかを描写したり。
基本は基本で、
それ以上でもそれ以下でもないというところでしょうか。

そういえば、
マトリックスのネオみたいな巻き込まれ型主人公、
最近の学生系主人公に多い気がします。
少年誌やラノベなんかにありそうなイメージですね。

この文章を最後まで読んだあなた、
今度からジャンプの読み切りを読むときに
こういうこと気にしながら読むと
「これいまいちだけど、もしかして『動機』が弱いからじゃね?」
ってなるかもしれないぞ!


この記事を書くのに参考にしたもの
Togetter「chimumu」さんのまとめ
ここで書いたことが細かくいろいろ書いてあったり、映画の技法をわかりやすく語ってくれていたりします。

まだ使える資源で楽しもう!

どうもー、前回アナログ絵について色々(ってほどでもない)書かせてもらったノムラー油こと野村です。
デジタルの絵については他の人が熱く語ってくれると思うので今回はまたアナログ絵について語りたいと思います。

と言ったものの前回で言いたいことは全部言ってしまったので、今回は僕が個人的に絵を描く時に習慣としていることをつらつら書こうと思います。

「別に野村の習慣なんてどうでもいいんだよ! 早くプリンターのインク買え!」

という人は、いやいやちょっと待ってくださいよ。プリンターのインク高くね?
(突っ込むとこはそこじゃない)

・・・とまあ小ボケはさておき
(>0<)是非とも最後まで読んでいただけたら幸いです。

・・・・・・・・・・・・・・・・・・・・・・・・・

学校で毎日のように配られるプリント。
OOO方程式やら公式やら何やらが書かれているあのプリントの裏・・・まだ白い。捨てるのはもったいない。

というわけで配られたプリントの裏に絵を描き始めました。真っ白の裏面がそのまま廃品回収に出されているのがどうも切ない。

裏紙を使うことで「地球に優しい、絵描ける、ポケモンの調整にフル活用」というまさに「地球万歳、趣味全開、雨パ粉砕」の3部構成が完成する訳ですな。
(・・・何か一個余計だ・・)

まあ地球に優しい行いをしているわけですよ。
今日も穴のあいたクロックスをガムテープで補強して履いてますわな。

そんな貧乏性全開の僕が編み出し究極の節約。

学校のプリントの裏を使いまくる戦法ですわ。

これぞ野村クオリティ、真っ白の紙が廃品回収でアップアップしているのを救済するわけです。

ゴミじゃない、あやつは使いようによっては計算用紙、鼻紙、はたまた便所紙にもなりんす。

ってなわけで皆さんもまだ白い紙は捨てずに使ってみては?

それではー。
f:id:WCE:20130407020822p:plain

よいこのTwitterリテラシー -「1番仲の良いランキング」の事例-

プログラミング班新2年のさじです。

今回は流石にプログラミング班っぽいことを…と思ったのですが
私の大好きなTwitterからHOTなネタがきたので是非それで書かせていただこうと思います。
Webサービス、SNSという話題はこの界隈切り離せませんので…ということで。
ちょっと感覚的・感情的な部分も入りますがぜひ今後の参考にしていただければ。
※記事中の例示ツイートは垢名などを改変して掲載しています。


今回の話題はTwitterと連携するwebサービス「1番仲の良いランキング」(または「Friend Ranking」「あなたのフレンドランキング」)

Twitterをされている方は4/4~4/5頃、TLでこんな感じのTweetを見かけたことはないでしょうか
f:id:WCE:20130406043426p:plain
「1番仲の良いランキング」とタイトル付けされた、いくつかの@IDと元サイトらしきURL、ランキング画像…

Twitterでよく見かける「あるフォロワーとのリプライ数、共通語数などを『仲良し度』として換算して遊ぶサービス」のツイートかな…と思います
じゃあ自分もやってみよう、誰と仲良しになるかな…とサービスを認証してやってみると

勝手に、いつのまにかこちらのユーザーをフォローしてしまいます。
f:id:WCE:20130406043427p:plain
早い話が特定のアカウントのフォロワー増加のためのスパムサービスだったわけです。
(※現在はIDがyoisn03から変更されている可能性があります)

今回はフォロー増加ぐらいで「別にいいじゃん」って方もいらっしゃるかもしれませんが
しばしば問題になる「英語DMを踏んだら知らないうちにフォロワーにDMが!」というのもこれの類になります。

このようなTwitterと連携するサービスは認証画面(下記参照)で「何を許可するのかしないのか」を確認し信用できるようなサービスを取捨選択しなければ、知らないうちにアカウント操作をされてしまうことになります。
f:id:WCE:20130406043425p:plain
何も考えずに認証ボタン、押していませんか?
「プロフィールを更新する」や
「ツイートする」等
かなり重要な操作権限を渡していることが書いてあるのに思考停止してませんか?

まあ「ツイートする」等の操作は巷でよく利用されているサービスにもされているのですが
それにしても「これだけの操作を勝手にすることを許している」という認識を持って認証しなければいけない、ということです。

間違って認証してしまった、スパムサービスの認証を解除したい、という場合はこちらへ。
Twitter アプリ連携
Twitter公式から「設定」→「アプリ連携」と辿っていけばできます。

さて「1番仲の良いランキング」がスパムサービスであることは分かりました。
しかし自分としては「特定のユーザーのフォロワー増やし」という実害が発覚する前から「怪しい…」と思ってた所がありましたのでそこをいくつか紹介したいと思います。
今後新出したサービスを信頼出来るのか?という判断材料の一つになりうると思います。
まあ今回みたいにしばらくすればボロが出る、ってパターンも多いんでそれを待つのもアリですけど。

1.短縮URL

まずサービス利用時のツイートに付属したURLが「goo.gl/uakWi」という「短縮URL」の時点ですでにちょっと怪しいです。
短縮URLは字数制限の厳しいTwitterでは長いURLを縮めるのに有効です(当たり前ですが)。
しかし時に「リンク先のURLを隠す」目的に使われます。
次の「2.付属URL」でまさにこの目的で短縮URLが使われていることがわかります。

ちなみに他のサービスで、ツイートに付属するURLはどうなっているのでしょうか
今回は1例ですが「もちもち☆ゆめのん」様の「口ぐせ分析」を見てみます
f:id:WCE:20130406043428p:plain
URL短縮はされてませんね
この1例だけでは微妙かもしれませんが、「普通は短縮URLじゃないところが短縮URLになっているぞ…?」と「いつもと違う」ことに気づくのも大事かと思います。

2.ツイートに付属したURLのリンク先

短縮URLになっている、おそらく利用サービス元ヘ飛ぶと思われるURL。
クリックしてみると……いきなり認証画面へ飛ばされます。
普通、webサイトへ飛ばされ、どんなサービスなのかという説明と「興味があればやってみよう!+認証ボタン」ぐらいの最低限の形はあるものです。
それもなしに「勝手にツイートします、勝手にフォローします」という権限を認証させる画面へ、直にリンクしてるなんて危険なんじゃないか?という感覚はあっていいと思います。
(いきなり認証画面ということを隠すのに1.短縮URLを使っていたことがわかります。)

3.サービス元サイト

認証画面のサービス名の下に、サービス元URLが載っています。
ツイートに付属したURLは認証画面に直に飛んでしまうので、ここからサービス元webサイトに行ってみます。
あなたのフレンドランキング
(元サイトが消去された時のためweb魚拓を使用しています。)
するとなかなかシンプル…?というか急ごしらえの感じがします。
最近は随分シンプルなのも多いので一概には当てはまらないと思いますが
悪質なサービスだから存続させるつもりはなくてすぐに消す予定なのかも…等ちょっと推測もできます。

4.自動ツイート

サービスからツイートをする時、「サービス利用結果の入力された投稿フォームから手動で投稿」する場合と「サービスが自動で投稿」する場合があります。
前者の例では有名なのは「診断メーカー」様
後者の例では「今日のスタンド」様があります。
後者の例でもよく利用されているサービスがありますから、一概に悪質、ではないのですが
自動投稿の場合「投稿する前に自分でツイート内容を確認できない」のでより悪質なサービスに利用しやすい、ということはあります。
手動か自動か?はサービスを利用するまでわからないことが多いので、TLで「○○サービス、自動投稿されるのか…」等見かけた場合に警戒しておくのがいいかと思われます。

(個人的な愚痴を言えばスタンドは投稿内容確認してできるようにしてほしいかなとか…あまり面白いのが出ない時もあるので、なんて)

以上4点が怪しいと思った点です。
結構感覚的なものもありますが、逆に「危ないかも…!」というリスクヘッジの感覚はあって困るものではありません。
特に今回はたんなるお遊びのサービスであり、やらなくて困るというものではないですから、「危なそうだからやらない」という感覚を鋭くして損はないはずです。

スパムに対する危機感を身につけて安全なTwitterライフを!

自作PCのすすめ

CG班新3年のみずにゃんです。

PC作るのは敷居が高そうに見えるんですが作ってみると結構簡単です。
回路を基盤にはんだ付けして作るなんて工場みたいなことはしなくてもよくて、パーツを組み立ててケーブルつなげるだけです。
自作PCのメリットは自分で組み立てて知識をつけることで市販のものより性能をあげたり必要な機能に絞って特化させたりとカスタマイズができる点です。

以下、PCを構成するパーツと簡単な説明をします。


マザーボード
PCの一番大事なところ。他のパーツのほとんどのケーブルがこの基盤につながる。

CPU:
計算をする部分。性能(周波数Hz)が高いほど早くなる。

グラフィックボード(ビデオカード)
画面の表示に影響する部分。性能が高いほど綺麗に映る。
ゲームとか3Dグラフィックとかをやらないならそんなにいらない。

HDD
データを記録する場所。容量が多いほどたくさんのデータを保存できる。
OSもここにインストールされる。
データ容量はかなり減るが起動からの立ち上がりが圧倒的速さになるSSDもよい。

メモリ:
HDDと同じで記憶をする場所だが一時的なもの。
たくさん容量あればウィンドウやソフトをたくさん動かした時に遅くならないで済む。
8GBあれば一般的には十分。

PCケース
そのまんま。パーツ(特にメモリ)を静電気から守るのが一番かも。
冬場に静電気対策をしないでメモリを触れてしまうと一瞬で壊れてさようなら。

光学ドライブ
CD、DVDを読み込んだり書き込んだり。ブルーレイは高いので再生はPS3で
いいやって人は妥協してもいいかも。

電源
電気流します。出力が小さいとコンピュータに負荷がかかると電源がいきなり落ちて大変なことになるので650~700W以上あった方がいい。

OS(オペレーティングシステム)
Windowsもソフトなので最初はドライブから読み込んでインストールしないと
いつも私たちが見ているように起動してくれません。


これだけあって各種ケーブルを接続すれば動きます。
あとはウイルスソフト。これは超重要です。何らかのウイルスソフトを入れて
おかないとロクなことにならないので。ちょっと高くてもそれなりのものを買った
方がいいです。
個人的にはノートンカスペルスキーがオススメ。
前者はちょっと動作が重いですがそれなりにセキュリティーは固い、と思う。
後者は何か異常があった場合にその異常が起きる前の状態に戻ってくれるという
なかなかイケてる仕様。

あとはパーツに付属しているドライバディスクをインストールしまくれば完成。
ワードやエクセルなどのOFFICE製品は別途自分で購入してインストール
しないとダメなので面倒くさいですね。OFFICEって1万
以上したのでちょっと驚きました。


私は自作PC入門みたいな本を一冊読みながらやればなんだかんだで
きました。
知り合いのパソコン詳しい方数人も初めてならそれで十分みたいなことを仰ってたのでみなさんも是非PC組んでみよう。


15万以上あれば何か一つ妥協するだけでいいものが組めます。


※参考書籍 "[http://ec.nikkeibp.co.jp/item/books/196920.html:title=PC自作の基礎知識2012(日経BPパソコンベストムック
日経WinPCセレクト)]"

ゲームについて書かれた新書

f:id:WCE:20130403232952j:plain

プログラミング班新4年 hisoji です。
ゲーム制作に関心があるならば、「面白いゲームを作りたい!」「ゲーム会社に就職したい!」「スキル上げたい!」「とくにないです。」など何らかの思惑を持っていると思います。
おそらく、それらは多くのゲーム制作者も考えてきたことであり、自らの経験や考えを本にして書いてくれている人もいます。

そこでゲームを話題にした新書を、読んだことがある範囲で紹介しようと思います。
ここでは紹介されていない、筆者が知らない本も多数あるので、おすすめがあれば是非教えてください。
ちなみに新書で読む利点として、

  • 比較的安い
  • 一般向けに書かれており、読みやすい

などが挙げられます。

僕たちのゲーム史

昔のゲームと今のゲームは一体何が違うのかを、ゲームの変わらない部分と変わっていった部分を定義して、時代をさかのぼりながら考えていきます。

説明と一緒に、当時の記事が紹介されているのが特徴的です。当時の記事の語り口やゲーム画面がその頃の情勢を思い起こさせる気がします。
あの「スーパーマリオ」も発売当時は斬新なゲームだったようなのですが、別に「アクションゲーム」として売られたわけではないそうです。また、ハードウエアやROMの選択、青少年の非行問題など、ゲームとは直接関係ない事柄も歴史に深く関わってきたというのも新鮮に感じます。同人ゲーム、インディーズゲーム業界を取り上げているのも印象的です。

紹介されていないゲームも多々ありますが、各時代のゲームの歴史が、新書の中に可能な限り網羅されていると思います。

教養としてのゲーム史

各時代で有名だったゲームを、ゲームに対する「見立て」「意味づけ」を軸にして追っていきます。

一番初めの「玉を打ち合う」だけのゲームから、変化をつける、敵が攻撃してくる、地形に意味を持たせるなど、その都度多くのアイディアが付加されていく様子が見てとれます。時代が移っていくごとに、ゲーム画面の扱われ方も意味づけもどんどん変わっていきます。

後半のシミュレーションゲームの章も印象的です。シミュレーションゲームは人の欲望と共に成長していったという考えには興味を引かれます。思い通りの国を作り上げたいのか、恋愛を学園生活ごとやり直したいのか、「現実」で彼女と共に過ごしたいのか、時代によっても様々な願望があるようです。

クリエイター・スピリットとは何か?

デジタルハリウッド大学の学長によって書かれた本です。ゲームについては書かれていませんが、ゲーム制作者もある意味で「クリエイター」と言えそうなので今回入れました。

いわゆる「クリエイター」として生きていくとはどういうことか、どんなことをすればいいのかについて書かれています。自分の好きな道具を使ってみる、ひらめいたら何かの媒体(メモ帳、ブログ等)に残しておく等、実際に使えそうな方法が紹介されています。高校生向けだからか、日々の勉強や学校の選び方についても書いてあります。

途中の章では「日本は、クリエイターとして生きるには一番いい国だ」というのがあります。日本人は特定の価値観を押し付けられていないので、固定された世界観を簡単に破壊してしまうというのは、確かに少し思うところがあります。

ゲームの教科書

ゲーム会社での制作経験者が、ゲーム開発について書いています。

ゲームがどんなものか、どんな職業があるのか、実際のスケジュールはどんな感じなのか、どうすればゲーム会社に入れるのか等、ゲーム会社で働く事についての事柄が詳しく書かれています。
ゲーム開発者に必要なスキルが職業ごとに書かれており、ゲーム会社に就職したいという人には参考になります。また、実際にゲーム開発の過程を通じてゲームを作ってみる章もあります。

開発者の実際の一日が書かれているのは参考になります。ミーティングや打ち合わせが何度も行われており、常に試行錯誤しながら完成に近づけていくんだなあと身にしみます。

ちなみに本書内では先ほどの「クリエイター・スピリットとは何か?」が紹介されています。



このような本を読まずとも、普通にゲームは作れると思います。
ただ、ゲームの歴史や他人の手法を知ることは、今後のゲーム制作にも何らかの形でつながってくれる気がします。
興味があったら、是非手にとってみてください。

GDC 2013 関連記事ピックアップ

プログラミング班 @Reputeless です。

世界最大のゲーム開発者向けイベント Game Developers Conference (GDC) が、今年もサンフランシスコで開催されました。
GAME Watch4Gamer.net に掲載された現地取材レポートから、興味深い記事をピックアップして紹介します。

発表!「良いレベルデザインの10の原則」

Square Enix Montreal のクリエイターが、ゲームデザインの 10 の原則を実際の事例を交えて紹介。

「Journey(風ノ旅ビト)」のゲームデザイン解説

風ノ旅ビトが目指したのは「感情」のデザイン。そのアプローチを開発スタジオのデザイナーが解説。

「TOKYO JUNGLE」の成功から振り返る日本の感性を生かしたゲーム制作

普遍と普遍を組み合わせることで、普遍だがユニークなゲームとなった TOKYO JUNGLE の誕生秘話。

色々あったけどやっぱり気になる「シムシティ」 Part2

シムシティ開発チームがコンセプト共有のために用いた「ワン・ページ・デザイン」という手法の披露。

GAME NARRATIVE SUMMIT「教訓あるゲームを作るテクニック」

教訓や道徳を伝えるゲームの作り方を、Microsoft のシニアゲームデザイナーがアドバイス。

NASAがゲーム開発者を本気でリクルーティング

NASA が広報用に作ったゲームと、ゲームの技術を宇宙探査で活用しようとしている研究事例を紹介。

このほかにも、PS4 や Project SHIELD などのハードウェアに関する情報や、最新タイトル、エンジンのテクノロジー解説など、ゲームの舞台裏、そして未来を垣間見れる情報が盛りだくさんです。
目を通せば、きっとゲーム作りのヒントが見つかるはずです。

セルオートマトンを用いた幾何学模様の生成

f:id:WCE:20130401212821p:plain

プログラミング班2年のアゲハマです。
今回は砂山モデルの紹介と、それを使ったきれいな模様の作り方を書きたいと思います。

1.セルオートマトンとは

セルオートマトンとはセルによって構成される計算モデルです。
代表的なものにライフゲームが挙げられます。

詳しくは http://ja.wikipedia.org/wiki/セル・オートマトン へ。

2.砂山モデルの説明

今回用いる砂山モデルについて説明をします。
砂山モデルとは2次元セルオートマトンの一種で、砂山が崩れ落ちる様子をモデル化したものです。

f:id:WCE:20130401211607p:plain

エクセルのような、各セルが整数の値を持つ2次元平面を想像してください。
各セルの値はそこに積まれている砂粒の数を表したものです。
ここで、平面上の適当な場所に砂粒を落としていき、高さが4になったら隣接する4つのセルに1ずつ移動させる、という操作を繰り返します。
すると、この隣接セルへの移動が連鎖反応を引き起こし、大きな雪崩につながることがあります。
この雪崩の頻度と規模は、べき乗に分布することが知られており、べき乗法則に従う自然現象(地震など)の研究に用いられることもあるようです。

3.砂山モデルのプログラミング

では、この砂山モデルをプログラムに書き起こしてみましょう。
ここではSiv3Dライブラリを用いていますが、画像データをピクセルごとに参照できれば何を使っても大丈夫です。

#include <Siv3D.hpp>

const int repsize = 4;
const Point replacer[repsize] = 
{
    Point(-1,0),Point(1,0),Point(0,-1),Point(0,1)
};
const Color backcolor = Palette::Skyblue;
const Color sandcolor = Color(239,228,176,0);
const double scale = 1.0;
const Point size(512,512);

class SandHill
{
    std::vector<std::vector<unsigned>> m_cells,m_temp;
    Image m_image;
    DynamicTexture m_texture;

    //移動するセルの値をm_tempに保存する
    void calcFlow()
    {
        for( unsigned y=0; y<m_image.height; ++y )
        {
            for( unsigned x=0; x<m_image.width; ++x )
            {
                unsigned& cell = m_cells[y][x];
                if( repsize <= cell )
                {
                    const int plus = cell / repsize;
                    cell %= repsize;
                    
                    for(int i=0; i<repsize; ++i)
                    {
                        Point p = replacer[i]+Point(x,y);
                        p.x = Clamp<int>(p.x,0,m_image.width-1);
                        p.y = Clamp<int>(p.y,0,m_image.height-1);
                        m_temp[p.y][p.x] += plus;
                    }
                }
            }
        }
    }
    //m_tempに保存した値をセルに加える
    void updateCells()
    {
        for( unsigned y=0; y<m_image.height; ++y )
        {
            for( unsigned x=0; x<m_image.width; ++x )
            {
                m_cells[y][x] += m_temp[y][x];
                m_temp[y][x] = 0;
            }
        }
    }
    void updateImage()
    {
        for( unsigned y=0; y<m_image.height; ++y )
        {
            for( unsigned x=0; x<m_image.width; ++x )
            {
                m_image[y][x].a = 255*m_cells[y][x]/repsize;
            }
        }
    }
public:
    SandHill(int w, int h, const Color& c)
        :m_cells(h,std::vector<unsigned>(w)),m_temp(m_cells),m_image(w,h,c),m_texture(m_image){}
    void drop(const Point& pos, unsigned value)
    {
        Point p = pos;
        p.x = Clamp<int>(p.x,0,m_image.width-1);
        p.y = Clamp<int>(p.y,0,m_image.height-1);
        m_cells[p.y][p.x] += value;
    }
    void update()
    {
        calcFlow();
        updateCells();
        updateImage();
    }
    void draw()
    {
        m_texture.fill(m_image);
        m_texture.scale(scale).draw(size*(1-scale)/2);
    }
};

void Main()
{
    Window::Resize(size.x,size.y);
    Graphics::SetBackGround(backcolor);

    SandHill sandhill(size.x,size.y,sandcolor);
    
    while(System::Update())
    {
        if(Input::MouseL.pressed)//クリックした場所に砂を落とす
        {
            sandhill.drop(size/2+(Mouse::Pos()-size/2)/scale,500);
        }
        sandhill.update();
        sandhill.draw();
    }
}

実行結果:
f:id:WCE:20130401212750p:plain
なんとなく上から砂を落としているように見えますね。

4.模様を作る

先ほどのプログラムでマウスの位置を固定していると、対称的な図形が現れてきます。
初期値も行う操作も対称的なので当然と言えば当然な気もしますが、少しルールを変えればもっと綺麗な模様が作れそうです。
ということで、先ほどのソースコードの以下の部分を書き換えてみましょう。

const int repsize = 4;
const Point replacer[repsize] = 
{
    Point(-1,0),Point(1,0),Point(0,-1),Point(0,1)
};
const Color backcolor = Palette::Skyblue;
const Color sandcolor = Color(239,228,176,0);
const double scale = 1.0;

ここを以下のように書き換えてください。

const int repsize = 24;
const Point replacer[repsize] = 
{
    Point(-3,-3),Point(-2,-3),Point(-1,-3),Point(0,-3),Point(0,-2),Point(0,-1),
    Point(3,-3),Point(3,-2),Point(3,-1),Point(3,0),Point(2,0),Point(1,0),
    Point(3,3),Point(2,3),Point(1,3),Point(0,3),Point(0,2),Point(0,1),
    Point(-3,3),Point(-3,2),Point(-3,1),Point(-3,0),Point(-2,0),Point(-1,0)
};
const Color backcolor = Palette::Black;
const Color sandcolor = Alpha(0);
const double scale = 3.0;

書き換え前のreplacerは、現在のセルを中心とした相対座標で、上下左右の4つの隣接するセルを表しています。
それに対して書き換え後のreplacerは、下の画像の黒い場所を表しています。

つまり、セルに24個の砂粒が積まれたら、この画像の黒い部分に1つずつ割り振るという操作になります。
もはや砂山でも何でもないですが、実行結果は次のようになります。

実行結果:
f:id:WCE:20130401223804p:plain
面白い模様がいくつかできました。
画像がなんとなくぼやけて見えるのは、自動で補間がかかっているからです。
ちなみに、このようなドット絵を拡大する時はニアレストネイバー法を用いるとぼやけずに拡大できます。

5.まとめ

先ほどのreplacerを画像から読み込めるようにしたものがこちらです。
これで生成される画像はグレースケールなので、Photoshopのグラデーションマップなどで適切に加工すると良いと思います。