「プログラミング」に関する日記(31)

プログラミング関係の話題。プログラミングコーナーを更新したとか、プログラミングの内容に踏み込んだ話とか。

<前 次>

透明レンダリング

3Dの新しい表現を考えてみたり。
トゥーンレンダリングは影を極端に強調したシェーディングと輪郭表示に関する技術を使うわけですが、たとえば、ドラクエ3のレムオルのように輪郭だけを表示して本体を表示しないとか。
しかし、それは意外に難しいことなのです。
なぜなら、トゥーンレンダリングの輪郭抽出は、本体があることが前提であるため本体を除くと輪郭が輪郭でなくなってしまうのです。
したがって、普通にトゥーンレンダリングで本体つきの輪郭を描き、あとから本体を抜くのです。
真っ先に思い浮かぶのは、本体に向こう側の景色を写して見えなくする方法。
もうひとつは真っ黒な背景に真っ黒な本体と白い輪郭を描き、白い部分だけを背景と合成する方法。
最初のは「TWINTAIL LOVERS.」の「真・ステルス」と「トゥーンシェーディング」を組み合わせて使えばそれなりにできそうです。
もうひとつのほうは、輪郭用テクスチャを用意してそこに輪郭を描画して、ビルボードで表示すればOK。
前者のほうが前後関係は正確に表現されますが、後者のほうが輪郭以外にゆがみが出ません。
いずれにしても実際に作って確かめてみないことには確かなことはいえませんが。

「Bomber丸World」のBGMアップしました。
研究所ダンジョンボスですよ。
かっこつけたつもりがぷぴーとかぴっぴこぴーとか入ってて台無しな曲ですよ。
トゥッティとはどんなものかなんとなくわかってきた予感。

マテリアル

う~ん、もともと色のあるメッシュでトゥーンレンダリングをすると元々の材質(色)が無効になってしまいます。
材質にはライティングの設定なんかも入っているためライティングをオフにすると材質もろとも無効になっちゃうようです。
例えば材質ではなく頂点カラーを使うとか?
例えばテクスチャに色をつけるとか?

あう~、レポートやらねば…
明日中に終わらせて月曜日は休みたい。

あんまり遊べなかった…

いろいろできそうに見えて案外面倒な設定が必要だったり結果が結構地味だったりして、画像ほど際立った効果は実感できませんでした。
さりげなく使って陰で雰囲気を盛り上げるような使い方なのかなと思ったりします。

パネルγのタイトルBGMを作りました。
パネルを消したときの音とゲームのメイン音楽との組み合わせです。

メッセージを送ると何かが起こる

DirectMusicですよDirectMusic!
VB用でもC/C++用ほどではないけどいろいろできるんですよ。
今夜はメッセージ送りまくって遊ぼう。

ミラクル!

パネルγのページを更新しました。
一番基本的なルールが説明されています。
一応プロトタイプにスクリーンショット機能をつけて撮った写真を加工したものを使っています。
パネルの柄をもっとパネルっぽく平面らしく作ってみたのですがどうもしっくりこなかったので元の柄に戻しました。
一番最初はガラス玉みたいなので、プレスに押されるとひびが入るというのにしようかと思っていたのですが今の画力では描けそうになかったので諦めました。
今まで明かした要素の中で、連鎖・コンボ・同時消し・アクティブコンボ(連鎖)などがあったのですが、今回紹介しますのは、これぞミラクル!空中連鎖でございます。
必要最低条件として、先に22個以上の同時消しをしなければならない秘術で、得点は普通の連鎖となんら変わりません。
ただ単に連鎖のタイミングでパネルが落ちていたらそうなることがあるというだけで、狙ってやるほどの価値はありません。
さて、ウィンドウモードでのプレイではマウスの移動位置を制限する必要があるのですが、ウィンドウモードといえばタスクの切り替えができなければならないということで、そのときにはポーズをかけるのだけれども、どんなタイミングでもポーズをかけていいというわけではないので、その辺の兼ね合いをどうするかが問題となりそうです。

あ、トゥーンレンダリングも更新。

鉤爪ロープで気絶したり

というわけでトゥーンレンダリング第2ラウンドに取り掛かり始めました。
大まかな原理は過去の日記に書かれているのでそちら参照。

「ゼルダの伝説-風のタクト」をやってました。
ゴードンの音楽変化パターンを見極めたり(サントラでの01:02までが顔行動開始前、それ以後が顔行動開始後に対応している)、ファントムガノンに回転斬りジャンプ斬り空き瓶で対抗したり特殊攻撃を成功させたりし(剣攻撃のときにA!)、ジークロックにいろんなアイテムを試してみたりして(仮面破壊後は何でも効く)、最終的にジークロックは置いてある爆弾を突っついて自爆。
やっぱ大ボスは弱いよ。

実質三行

トゥーンレンダリングの続きでもやろうかと思っています。
まずはトラのテクスチャを貼れるようにして、スペキュラを使えるようにして、シェーディング用のテクスチャに小細工を仕掛けて、でも輪郭抽出はやめておいて、どうせ輪郭つけるなら先進的でエレガントで、しかし不完全な方法よりも、原始的で力任せで、それでも確実な方法をとりたいと思っています。
できるんかいな…

迷惑な話じゃ

えーかげんDirectX9SDKでコンパイルできないのに痺れを切らしたので、DX9SDKをアンインストールし、DX8.1SDKをマイクロソフト以外から探してきてインストール。
一発でコンパイルが通りました。
これでまたパネルγの開発が再開できます。

今日は飛び込みがあったらしく電車が30分遅れに。
1時間ほど余裕を見て家を出ていたからよかったものを…

.NET

学校のVC++.NETでDirectXが使えなかったからVB.NETのほうで挑戦。
VB8からアップグレードする機能かなんかを使ってコードを書くまではできたけれどもセキュリティエラーにより動かず。
うちの学校は開発環境用意しておくだけ用意しておいて使えないようにしておくのか!?

重い思い

サーバーのOSはRedHatLinuxだ。
Linux系はマルチタスクOSであり、複数のユーザーが同時に利用する。
だから、あまり高負荷なCGIは設置できない。
私自身のためでも訪問者のためでもない、サーバーを共有するほかのユーザーのためだ。
しかし、時としてCGI上で重い処理を実行しなければならないときがある。
もちろん一番手っ取り早い解決方法は処理を軽くすることであるが、理論的にも現実的にも限界というものがある。
例えば、N個のデータに対して処理を行いたい場合は、どんな場合でも最低N回の処理が必要になる。
また、実行しないという方法もある。
つまり、データをローカル環境にダウンロードしてそこで処理をすればサーバーに負荷はかからないという計算だ。
しかしそれには時間も手間も余計にかかる。
そこで、原点に立ち返って考えてみる。
なぜ高負荷の処理をしてはいけないのか。
マルチタスクの動作原理からわかるとおり、実際の処理は1つのCPUがこなしており、単純計算すれば、2人が同時に処理を行えば処理速度はそれぞれ半分になるということだ。
低負荷の処理であれば処理は瞬時に終わるため、2人が同時に、ということは少なく、仮にあったとして処理速度が半分になる期間はごく短いということになる。
そしてもうひとつ考えてみる。
高負荷とは何なのか。
言うまでもなく負荷が高いことである。
負荷が高いとはどういうことを言うのか。
非常に多くの処理を行う場合であろう。
しかし、その非常に多くのそれぞれひとつは実は軽い処理なのである。
例えば、同じ処理でも、10倍の時間を掛けて処理すれば単位時間当たりの負荷は10分の1に減るだろう。
つまり、常にほんの少し重い状態をキープすれば一見重さを感じないのではないか。

ということで、日記の左側メニューを生成する処理を作りました。
ローカルテストではこの機能は一回約0.17秒かかるようで、実際に使うのは数日に一回程度だから多少重くても気にしない。
逆にチャットのようなものだと一回一回が軽くても呼び出し回数が馬鹿にならなかったりしますけどね。

困ったときのリビルド

DirectX9をインストールしたらDirectMusicで一部の曲の演奏が変になるようになりました。
よりにもよって自分の作ったMIDIが…
しかもDirectX9SDKだとVC++6でDirectSoundが使えないときた!
…と思ったらリビルドしたらあっさりコンパイルが通ったり。あほらし。
stdafx.hを変更したらリビルドするってことまだ覚えんのか自分は!
とりあえず理不尽なエラーが起こったらリビルドすればいいと覚えておこう。

「パネルγ」がルミネスに似ているというのは、問題なしということにしておきます。
四角形を作るというのは案外誰でも思いつきそうだし、落ち物と入れ替えではゲーム性も大きく違うし、音楽もコンセプトが全然違うみたいだし…

具体的な仕様についてですが、まず、FPSは、ゲームが4分の3秒単位で進行するため4の倍数、また、ミリ秒単位で性格にタイミングを合わせる必要があるため1000の約数、ついでに一般的な画面のリフレッシュレートは60FPSなのでそれ以下の数値、コマ数が少ないとパネルが落ちる表現やプレスから逃げる表現がしづらいので高いFPS、ということで、40FPSに仮決定。
コンボは一回につきコンボ継続数のみに比例した得点、連鎖は基本得点と連鎖継続回数に比例した得点、同時消しは単純にそれらの総和。
ただ、大きい正方形で消すと中に小さな正方形がたくさんできることになるので、同時消しも案外儲かると思います。
でも普通に消していくと多分数百点くらいがいいところだろうと予想しています。

再インストール完了

ブラウザを入れなおすためLunascapeのサイトに行ったらバージョン2があったのですが、プレビューリリースということで、今は導入しないほうがよさそうだし、だからといって旧バージョンをインストールしてもすぐにいらなくなりそうだったので、とりあえずしばらくはIEで我慢ということになりました。

1日に更新していたのですが、トップページの更新を忘れていました。

DirectX8.1SDKがなかったので仕方なく9SDKをインストール。
サンプル見てみたけど数は少ないし大して見た目変わんないのにピクセルシェーダなんか使ってコンマ数FPSまで重くなるし、利用者を舐めてんのかと言いたくなる内容。
実際に製品として組み込むときにはピクセルシェーダを使わない設定とか付けたりするんでしょうかね。
とりあえずこれで「パネルγ」をリビルドしてみたけど必要環境がDirectX9になってしまっていないか不安です。

CGI&PHPの動作確認環境も何とか復帰。
ついでに新日記もちょいと更新。

再インストール

昨日忘れたのはスペキュラ反射のこと。
亀仙人の頭が輝いている、アレです。
確かスペキュラ反射の強さを求める公式もあったはずだからもう一つテクスチャを用意して実現できそうです。

最近パソコンの調子が著しく悪いのでOSを再インストールすることにしました。
一週間ほどの間日記が書き込めないかもしれません。

トゥーンシェード再び!

アクセス解析のカテゴリに登録されてしまったからには仕方がないということで、アクセス解析にはありがちな統計機能をつけてアップしてみました。
えーっと、アップした、それだけ。

トゥーンレンダリング、前はトゥーンレンダリングをONにしたら虎のテクスチャがはがれていましたが、テクスチャを合成する方法でテクスチャを保持したままトゥーンシェードできるようになりました。
そうすると逆にトゥーンレンダリングをOFFにしたときにテクスチャが足りなくなって虎のテクスチャが無効になってしまうのですが、そのときは前の色をテクスチャにそのまま反映することで普通と変わらない状態にすることができました。
んでもって、シェーディング用のテクスチャにはちょっとした小細工を仕掛けておいて、トゥーンシェーディングの輪郭無しでもある程度境界がわかるようにしてみました。
えーっと、あとは・・・・忘れた!

ニ短調ト短調

決して多いわけではないんですけどサーバーのCPU使用率が上がってきてCGIの使い方とか見直したほうがいいかと思い、ちょっと考えてみました。
HTML-CPUパワーを基本的に使わない。更新が少なく全員同じ内容を見るページに適する。
CGI--最も重いがSuExecを導入しているのでファイル書き込み等はこれを使いたいところ。
PHP--データベースとの連携が強い。CGIよりは軽い。
というわけで、これを基準にいろいろ書き換えていくつもりです。

「ふにゃふにゃ」のBGMを調べてみたら、DmとGmの合わせ技だった。
本当は長調の曲のはずなんだけど、つくりが甘かったためかよく分からないうちに短調の曲に。
どっちかというとデータ上短調扱いしたほうがわかりやすかったということだけれども。
で、そう仮定するといくらか矛盾のある部分が出てきたので、いろいろ改良中。
一年以上もこれを放置してきたわけですが…

毎度毎度ギリギリです。

PSPのCM見たんですが、はめ込み画像ではありませんということだけをひたすら強調して、どんな面白いゲームがあるのか、といった一番重要な部分がすっぽり抜けている感じがしました。
ところで、はめ込み画像じゃないことはわかったんだけど、プレイしている人はどこ?
ワイヤレスコントローラでもつけてない限りはゲーム機本体に手を添えるかケーブルを繋ぐかしなきゃプレイできないはずなんだけど、手もケーブルも見当たらない。
つまり操作してなくっても動くってこと?
要するに動画垂れ流してるだけ?
たしか動画を再生するだけならGBAでも充分できるはずなんですけど…
http://www.playstation.jp/psp/

「スマブラDX」で新しい遊び方を開発してみました。
一人用の遊び方ですが、対戦モードを使います。
まず、設定でハンデをありにして、吹っ飛びやすさを2倍にします。
そして、自分のハンデを1にして、他は全部ハンデ9のCPにします。
すると、敵の攻撃を少しでも食らうとほぼ一撃KOされるようになり、逆にこちらからの攻撃では吹っ飛ばないどころか、よっぽどの攻撃でない限りひるみもしなくなります。
どれだけ吹っ飛ばされるかというと、ガノンちゃんの弱攻撃一発で、天井がなければ100%確実にKOされます。
あるときは触れられたことにすら気付かぬうちにスターフィニッシュされてました。
どれだけ吹っ飛ばせないかというと、ホームランバットのスマッシュが強攻撃並みにしか飛ばなくなります。
実際最大溜めジャイアントパンチをかましてもサムスはその場に倒れるだけでした。
敵の攻撃に全く当たってはいけないため、基本的に遠距離武器で攻撃しますが、ここであえてドンキーコングなどの肉弾戦のみのキャラを使うと白熱します。
ちなみにレイガンをシールドリフレクトされると即死です。
ファルコンに抱き付かれると即死です。
ピチューの雷食らうと即死です。
これで、体力制乱闘にして、全員レベル9にして、もちろん相手は3人チームで、全員落とさずに体力を0にして倒すというルールにすればベリーハードのノーダメージクリア並みに難しくなる…かもしれません。
私はベリーイージーのノーダメージクリアでいっぱいいっぱいなのでレベル9は1人だけにして、倒したやつから抜けていくという方式にして、アイテムを駆使してなんとか3人に勝つことができました。
やり直し回数数十回。

ふしぎのぼうし、グフーの倒し方がわからず断念。
あんまりいい回復アイテムを持っていなかったので最初から勝つつもりはなかったのですが、倒し方すらつかめずに終わってしまいました。

そうですそうです、トゥーンレンダリング!
あれ、あの勘違いがなければ、別の方法を考えていたと思うんですよ。
光の向きを計算して、その分だけテクスチャを傾けて…とか。
画像は右・左・右・左…を続いています。
ふぅ、これでふにゃ3D計画が実行できそうだぞ…

トゥーンレンダリング実現間近か!?

今日書きたいことは後日プログラミングのコーナーにアップします。

アクセス解析にて

新日記過去ログを2003年3月分まで入力しました。
で、そこでマインスイーパのことが書かれていたので、久しぶりにやってみたら、ハイスコア出しました。
中級50秒はなかなか速いんじゃないでしょうか。

アクセスログを回収してリファラを見ていたら、Googleからの訪問は激減していましたが、BIGLOBEのディレクトリサーチに登録されていたことがわかりました。
それもアクセス解析のカテゴリで。
あれ自分用にかなりカスタマイズされてるからそろそろ「MusicPlayer」と同じく完全自分仕様品にしちゃおうかと思っていたのですが、そうもいかなくなってしまったようです。
でも「TW Prog. Room」としてリンクしているところが他と違うところか。

テスト終了。
持ち込み可だった割には簡単だったので適当に回答。
途中式もいい加減。
大丈夫かな…

3D、自動で回るのを手動に切り替え。
ビューの位置を自在に変更していろんな位置から虎を見られるようになりました。
Direct3Dにはティーポットのメッシュを生成する関数があるそうですね。
実用性はともかく、練習用にメッシュを表示するときなんかには役に立ちそうです。

プログラミングのページにも説明つけるべきですかね…

世界の中心で虎が回る

「パネルγ」アイコン作りました。
何も表示されないけどせめてアイコンくらいは表示できるようにと。
あと、WM_PAINTメッセージを受け取ってBeginPaintとEndPaintだけするようにしました。
何もしてないときよりはマシなれど相変わらずぐちゃぐちゃ。

今日も3Dやってみました。
いろんなところから拾ってきたサンプルをつぎはぎして光の当たる虎を作りました。
カメラが回りライトも回ります。
本当は虎も回るはずだったのですが、いつの間にか回らなくなっていました。3Dの神秘です。
虎だけしかなかったら虎が回ってるのかカメラが回ってるのか区別がつかないので地面も用意してみました。
地面には法線ベクトルが設定されていないのでアンビエントライトしか当たらず暗くなっています。
ちなみに地面はこれまたどっかから拾ってきた世界地図で、虎に踏んでいるところはちょうどアフリカのあたりになっています。
ファイル置き場にそのときの画像があります。

<前 次>