トップページ > 記事閲覧
スカイドームをどうやって実装するのか?
名前:珈琲 日時: 2013/05/20 21:56

3Dモデルでスカイドームを作ったのですが、 モデルが遠くに行くと空のテクスチャの向こう側に行ってしまいます。 どうすればいいですか? ただ単にスカイドームをめちゃくちゃ拡大すればいいのでしょうか?
メンテ

Page: 1 |

Re: スカイドームをどうやって実装するのか? ( No.1 )
名前:TE 日時:2013/05/21 21:35

スカイドームの座標をキャラクタの座標にしてしまえば良いのではないでしょうか。 そうすればキャラクタにスカイドームがついてくるのではみ出すことはないと思います。 ちなみにスカイドームを大きくし過ぎると描画範囲外で表示されなくなってしまいます。
メンテ
Re: スカイドームをどうやって実装するのか? ( No.2 )
名前:珈琲 日時:2013/05/21 22:58

別にカメラはキャラクターに追従しているわけでなく、結構頻繁に切り替わります。 カメラの座標とスカイドームの座標を同期してもいいのですが、有効視界距離がスカイドームの半径になってしまいます。 理想的なのは、一番最初、何があろうともスカイドームを始めに描画する、ということがDXライブラリの設定を変えずにできるといいのですが・・・
メンテ
Re: スカイドームをどうやって実装するのか? ( No.3 )
名前:takatwu 日時:2013/05/22 21:48

スカイドーム描画時にZバッファに書き込まないようにし スカイドーム→その他 の順で描画したらどうでしょうか
メンテ
Re: スカイドームをどうやって実装するのか? ( No.4 )
名前:珈琲 日時:2013/05/25 21:01

MV1SetUseZBuffer(Skydome,false); としてみたのですが その後 MV1DrawModel(Skydome); ↓ MV1DrawModel(Character); の順だと描画されるのに MV1DrawModel(Character); ↓ MV1DrawModel(Skydome); だとCharacterが描画されなくなりました。 イマイチ動作がよくわからないのですが、 MV1DrawModel(Character); の時点で既に描画されているのでしょうか? MV1DrawModel(Character); MV1DrawModel(Skydome); MV1DrawModel(Character_2); の順で処理した場合、Zバッファによる描画はScreenflipと同じタイミングとか想像してたのですが
メンテ
Re: スカイドームをどうやって実装するのか? ( No.5 )
名前:管理人 日時:2013/05/26 14:47

Zバッファの仕組みについてはご存知でしょうか? もしご存知ではないのでしたら「Zバッファ 仕組み」などで検索してみてください、 解説されているサイトが見つかると思いますので、よろしければご覧になってみてください MV1DrawModel(Character); ↓ MV1DrawModel(Skydome); でキャラクターが描画されないのは、MV1DrawModel(Character);で描画したキャラクターが 後からスカイドームの描画で上書きされてしまっているからだと思います ところで MV1DrawModel(Skydome); ↓ MV1DrawModel(Character); とすることで当初のスカイドームからキャラクターがはみ出す問題は解決すると 思うのですが、この方法では何か不都合があるのでしょうか? > の順で処理した場合、Zバッファによる描画はScreenflipと同じタイミングとか想像してたのですが Zバッファを使用する場合も使用しない場合も、MV1DrawModel を呼んだ直後に 描画を開始しています
メンテ
Re: スカイドームをどうやって実装するのか? ( No.6 )
名前:珈琲 日時:2013/05/26 15:35

その方法で出来たのですが、仕組みがちょっと理解できなかった、という旨で補足させて頂きました。 >Zバッファを使用する場合も使用しない場合もMV1DrawModel を呼んだ直後に描画を開始しています MV1DrawModel(Character); MV1DrawModel(Skydome); MV1DrawModel(Character_2); この順に処理した時、もしCharacterがCharacter_2よりも前に重なっていた時の動作がいまいち納得できませんでした。 Characterよりも遠いCharacter_2だけスカイドームの内側に描画される・・?
メンテ
Re: スカイドームをどうやって実装するのか? ( No.7 )
名前:管理人 日時:2013/05/26 18:27

MV1SetUseZBuffer(Skydome,false); を実行した場合は Zバッファを参照もしないしZバッファへ書き込みもしない、という設定になりますので この状態で MV1DrawModel(Skydome); を実行すると画面上に先に何を描画していても、スカイドームは 必ず描画されます なのでスカイドームが描画される箇所に既に Character が描画されていてもそれを 無視してスカイドームが上書きされます、要は3D的な前後関係は一切関係なく描画されます ただしZバッファへの書き込みも行わない為 Character を描画したときにZバッファに書き込まれたZ値は そのまま残りますので、画面構成的に Character2 が Character に隠れるような位置にいた場合は Zバッファの効果によって MV1DrawModel(Character_2); を実行しても Character2 は描画されない という現象が発生します
メンテ
Re: スカイドームをどうやって実装するのか? ( No.8 )
名前:珈琲 日時:2013/05/26 21:26

あー、なるほど ということは、やっぱりZバッファによる描画と入れ子で描画処理しないほうがいいですか? 一番奥か一番手前、みたいな・・・
メンテ
Re: スカイドームをどうやって実装するのか? ( No.9 )
名前:管理人 日時:2013/05/26 21:43

> ということは、やっぱりZバッファによる描画と入れ子で描画処理しないほうがいいですか? はい、というか原理上一番奥にスカイドームを置くことを前提とした処理のご提案なので入れ子も一番手前もできません
メンテ
Re: スカイドームをどうやって実装するのか? ( No.10 )
名前:珈琲 日時:2013/05/26 22:00

なるほど、確かにそうですね ご丁寧に最後までお付き合いいただきありがとうございました
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存