Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!

log

2011.10.06 C++:パーティウォークスルー

ファイル 368-1.jpg

ようやく画面内のキャラクタ数が増えてきて、賑やかになってきました!

これもLWO,LWSファイルが読み込めるようになったおかげなのですが、同時に少し
妙なバグにてこずってしまいました。内容としては、Debugモードでは正常に
動作するが、ReleaseモードではLWOモデルで読み込んだスキンメッシュモデルだけ
ぐちゃぐちゃに描画されるというものです。で、これはVC外から実行した場合の話で
VC内からだとReleaseモードでも正常に描画されるという。

このバグを見つけたときは、LWO読み込み関数を調べたり、マルチレンダーターゲット
をOFFにしたり、デバイスの設定を変更したり等して色々調べてみましたが、、ようやく
分かった答えが。なんと、初期化していないbool変数を利用して描画分けしていたので
スキンメッシュモデルが背景モデルとして描画されていた、というだけのことでした…;
うーん、通りでプログラム上は問題ないように見える訳だ。問題の部分がごっそり
抜けてしまっているのですから苦笑。別個の関数からアクセスしているので、警告が
表示されるわけでもないですし。なかなかにやっかいなバグでした。。それにしても、
コンパイルするモードによって初期化される値が違うということのようですね。不思議だな。

2011.09.25 C++:コンストレイント続き


今度はボーンの方向をコンストレインさせるのではなく、ボーンのBank軸回転のみを
コンストレインさせる関数を作成したので、これでようやく頭を指定座標に向かせられる
ようになりました。

角度制限がついていないと流石に酷いので、とりあえず急ごしらえで角度制限機能を
つけてみました。処理としては、プレイヤー以外のキャラクターはプレイヤーのモデルが
正面にいる場合はプレイヤーの方向を向くようになっています。

まだ内分処理もしていないのでぎこちないですが、静的なモーションだけだった頃と
比べると妙なリアリティが感じられるようになりました。

2011.09.25 C++:向きコンストレイント

ファイル 366-1.jpgファイル 366-2.jpg

指定ボーンを指定座標の方向に向かせる機能を作成してみました。
本当はIKをやってみたかったのですが、IKを組んでいる過程でつまづく部分が多かった
ので、実際は単純な機能からやってみようかなというのがきっかけだったりします;

出来たことは出来たのですが、今のところ問題は2つあります。
1つ目は角度制限機能をつけていないので、曲がってほしくない範囲まで曲がって
しまうこと。もう1つはBank軸回転がどの向きを向くか予測がつかないということです。

2つ目について詳しく説明するとします。Bank軸というのはボーンの方向を回転軸とした
回転のことですが、ボーンの向きは定まってもボーンの方向を回転軸とした向きは、
言ってしまえばどれをとってもいい訳です。なので腕に対して使用した上の画像では
特に問題がありませんでしたが、頭に対して使用した下の画像では頭の正面の向きが
キャラによって異なっています。

まあ、一般的な3Dソフトの向きコンストレイントも同様の現象が起きるので、そういう
ものなのかもしれませんが。なにかいい解決方法が無いかなあ。

2011.09.09 C++:マルチレンダーターゲットの不都合

グローとSSAOがやりたかったので、とりあえずHLSLとレンダーターゲット周りを
改良していたのですが。いままでウィンドウモードで作業していたところ、どうやら
フルスクリーンモード時に正常に描画されていなかったことが発覚!

色々試してみて、マルチレンダーターゲットをOFFにすることで元に戻ったのでした。
それで、ネットでいくつか調べてみるとどうやら画面のビット深度とレンダーターゲットの
ビット深度が同じでないと駄目みたいなようです。
ttp://maverickproj.web.fc2.com/pgMemo.html

それで、画面のビット深度を調べてみましたが…これが同じ32Bitなんですよね。
なので、試しにD3DFMT_A8R8G8B8からD3DFMT_X8R8G8B8に変更して
みると、とりあえずRGB部分は正常に描画できましたが、この場合ウィンドウモードに
してみるとZバッファが利いていないかのような不自然な描画になるという怪奇現象。。

うーん、漠然とした感じなのですが。今まではDirectXの仕様にそった不都合という
のは度々ありましたが、これはDirectXの仕様というよりGPUの不備による
トラブルのような気がしてきました。以前からフルスクリーンモードはMSAAが
利かないので敬遠してましたが、どうやら擬似フルスクリーンにした方がよさそうだ。

しかしながら、自分が思いついたSSAO。頑張れば出来そうな気がしますが、針の
穴を通すかのようなかなりピンポイントの調節をしないとそれっぽくならなさそうです。
思いつきやすい処理であっても実装しづらい、というのは中々にやっかいである。

2011.08.28 C++:ビルボードビームとデバッグ用関数

ファイル 364-1.jpg

今回はビルボードビームを作ったり、新しく可変長引数が使いたいなと思ったので
ちょっとデバッグ用関数を作ってみたりしてみました。

実を言うと、ビルボードビームの実装自体はほぼ9割方、かなり前に組んでいたので
すが、そんなことをすっかり忘れていてふと再発見しただけなのでした苦笑。
とりあえず、テクスチャも用意してないけどサクッと確認。画像の白いライン部分が
ビルボードビームの実装です。基本的にはパーティクルと同じでビルボードの応用
ですが、ビルボードビームのポリゴンは完全にカメラと向かい合う訳ではないので
Zソートは出来ないんですよね。。さて、どうしたもんかと思いましたが。解決方法として
不透明なテクスチャのビルボードビームを描画した後にポストエフェクトでぼかすのが
一番都合がいいかなと思いました。

それと、デバッグ用のメッセージを表示する関数を作ったのでちょっと公開してみます。

// デバッグ用メッセージをダイアログで表示させる関数
void DebugMessege(
char* TitleMessage, // ダイアログのタイトル用文字列
char* Parameter, ... // メッセージ用文字列(可変長引数)
// printf()のように、Parameterの第1引数は書式文字列、
// 第2引数以降は変換するパラメータのリストを記述する
){
// メッセージ用文字列配列を作成
char ErrorMessage[1024];
// 可変長引数にアクセスするためのポインタ
va_list argument_pointer;
// 可変長引数Parameterの先頭引数のポインタを取得
va_start(
argument_pointer,// 可変長引数の先頭引数のポインタを格納
Parameter // 取得する可変長引数
);
// 可変長引数リストのデータを書式文字列に従って文字配列に書き込み
// cf.vsprintf_s()の第4引数部分は普通ならば関数に渡された
// 可変長引数の1番目の要素から始まりそうだが、
// vsprintf_s()の第3引数に直接Parameterを指定している
// ので可変長引数の2番目の要素からアクセスされる?
vsprintf_s(
ErrorMessage, // 文字列の格納先変数
sizeof(ErrorMessage),// 連結した文字列のサイズ
Parameter, // 書式文字列
argument_pointer // 変換するパラメータのリスト
);
// 可変長引数へのアクセスを終了したことを伝える
va_end( argument_pointer );
// メッセージをダイアログで表示。
MessageBox( NULL, ErrorMessage,
TitleMessage, MB_OK | MB_ICONSTOP );
// cf.デバッグウィンドウに出力する場合
// OutputDebugString( ErrorMessage );
}

コメント部分に書いておきましたが、vsprintf()の実装が今ひとつ分からなかったり。。
とりあえず簡単にメッセージを表示できるようになったからいいですけどね。
それにしても、、日記内にプログラム記述するのがちと面倒くさいな笑。

2011.08.26 C++:ひさしぶりなプログラミング

最近プログラム触ってなかったな、と思ったので。ちまちまとプログラムの修正を
したりしていました。新しく追加したのは、データの暗号化/復元化くらい…苦笑;

それとつい先ほど寝ぼけまなこでうつろうつろしながら、高速でSSGIとSSDOを
実装する方法を思いついたので、いそいそとメモし終わったところです。
上手く実装できれば、自分のようなへっぽこ環境でも結構綺麗なグラフィック
表現ができるようになるわけですが。。さて、どうなるやら。

今までの経験上、なぜか寝ぼけた状態が一番ひらめきが多いんですよね。
普段が人一倍頭が固いせいなのか、、他の人も同じようなものなのか。不思議です。

2011.07.28 LW:ゴリラA・B・Cがあらわれた!

ファイル 362-1.jpg

練習としてゴリラを作ってみましたが。とりあえずこれくらいのクオリティならば
1週間以内で作れるようになった訳だ。まあ、前から1週間以内でモデルは作れ
ましたがテクスチャは結構中途半端でしたからね;

ちなみに何故ゴリラかと云うと、ゴリラの体系はそのまま猿人やクリーチャ、
太った体系の人に再利用できるからです。取り立ててゴリラを作りたかったから
という訳でもなかったり苦笑。それと今回はふと発見があったのでメモしておきます。

人体を描いたり作る際は股部分を全身の中心にするのが一般的ですが、例えば
アニメ系のモデルやSDモデルのような頭が大きいモデルの場合は股部分を
中心にしてしまうと個人的には少し足が長く見えるということに気がつきました。

なんでだろうな、と思って色々考えてみましたが。自分が思うには、”頭が大きい=
幼児体系を連想する”ということで、股部分を中心にするのではなく、幼児体系と同じ
ように腰の出っ張り付近が中心でないと不自然に見えてしまうのかなあ、と思いました。
まあ足が長いモデルでも、それはそれでスラっとしていいと思いますが、一度自分の
価値観を疑ってみると云うこともまた大切かもなと改めて思ったのでした。

2011.07.23 LW:犬

ファイル 361-1.jpg

動物の練習がしたかったのでちょいと犬を作ってみました。
3色用意してみましたが、あなたはどの色がお好みでしょうか。

ここ最近は綺麗にテクスチャが描けるように色々とUV展開を試行錯誤していたので、
テクスチャは今までより割とすんなり描けました。動物の資料の方もそこそこに
充実してきたので、他の動物も気が向いたらチャレンジしたいところです。

2011.07.15 LW:ローポリのローポリ

ファイル 360-1.jpg

以前作っていたハイポリモデルのキャラクターをどんどんポリゴン数を減らした場合、
どこまでできるのかとふと思い立ったので、さっそく試してみることにしました。

最初のモデルのポリゴン数は1万ポリゴン程度から始まり、1300…800…400…と
減らしていき、最終的には100ポリゴンまで減らすことが出来ました。100ポリゴンと
いえば、某掲示板で一時期流行っていたエクストリームなんとかというやつですね笑。
100ポリゴンだと流石に別のテクスチャにベイクしないと無理でしたが、400ポリゴンの
モデルまでは同一のテクスチャを使いまわせるのでリアルタイム用のLOD処理に
使用できそうな感じです。

ちなみに実際は裸のモデルなのですが、最近のご時世を考えると訪問者やサーバー様
に迷惑がかかりそうな気がしたので、急遽ハイポリ用の下着をやっつけで被せて
みました苦笑;ワイヤー部分を見ると不自然で笑えてきますね。

2011.06.16 LW:UVアニメーション


LWでシーケンスアニメーションとUVアニメーションを行ってみました。
波がガタンガタンするのは動画がループしているためなのであしからずです。
ただ、テクスチャ画像が中途半端なのが個人的に残念だな苦笑;

LWでUVアニメーションを行う場合、プロシージャルテクスチャや投影マップの場合は
そのままグラフエディタでUVをコントロールできるのですが、UVテクスチャの場合は
なぜかオフセット項目がOFFになります。なのでノードからUVオフセットにアクセス
しなければなりません。ノードだとプレビュー表示ができないから面倒だったので
今回は投影マップに切り替えてUVアニメーションをつけてみました。

シーケンスアニメーションはプレビュー表示できないかな、と思いましたが出来ますね。
ちなみに通常の静止画像の場合はリロードしない限り画像ファイルが更新されませんが、
シーケンス画像の場合、フレームが切り替わるごとに動的にアクセスしているためか
リロードしなくても画像が更新されています。最初は「えっ!?」と思いましたが、
リロードしなくて済む分、これはこれで便利ですね。