HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1229
ZANMETUE3D スプライトについて20解決


ZANMETU

リンク

2008/12/29(Mon) 21:39:45|NO.22083

Easy3Dで3Dシューティングを作っています。敵をロックオンしたときの表現で敵に四角い
照準を表示させます。よくあるやつです。その照準をスプライトを使って表示してるんです
が、敵に弾を発射して、弾が敵の近くまで来ると弾が消えてしまい困ってます。
奥行き情報が関わってるみたいですが、E3DRenderSpriteのp6の値を1.0に近づけると
この問題は解消します。しかし、今度は地面の形状データや他の形状データに
スプライトが隠れてしまうようになり、スプライトが見えなくなりました。
どうすればこの弾が見えてなおかつ地面形状データにも隠れないようにできるでしょうか。



この記事に返信する


とおりすがりかも

リンク

2008/12/30(Tue) 13:08:24|NO.22096

ビルボードでやるといいですよ。
E3DSetRenderStateで
D3DRS_LIGHTINGを0に設定して
D3DRS_ZFUNCをD3DCMP_ALWAYSに設定すると、
Zの値にかかわらず常に表示されて、ライトの影響も受けなくなります。



ZANMETU

リンク

2009/1/1(Thu) 23:31:18|NO.22155

おお、ありがとうございます。これでできるようになりそうですね。
感謝します^^
あ、明けましておめでとうございます!!



ZANMETU

リンク

2009/1/2(Fri) 00:26:53|NO.22168

ちょっとまってくださいww
hsid = ビルボードのID

E3DSetRenderState -1, hsid, D3DRS_LIGHTING, 0 E3DSetRenderState -1, target, D3DRS_ZFUNC, D3DCMP_ALWAYS
こんな感じですか?



とおりすがりかも

リンク

2009/1/2(Fri) 12:18:48|NO.22175

ZFUNCの方もビルボードのことを言ってたつもりなんですが。
まあ、やってみてください。

普段は描画の順番も気をつけた方がいいですよ。
半透明は最後に描画です。



ZANMETU

リンク

2009/1/2(Fri) 22:22:44|NO.22181

え E3DRenderStateについて もっと知りたいんですが、なんか「DirectXのヘルプの
SetRenderStateをご覧ください」ってHSPのヘルプには書いてあるんですよ。でも、その
DirectXのヘルプってのがどうやったら見れるのかわかりません。知ってますか?



GENKI

リンク

2009/1/2(Fri) 23:22:57|NO.22182

> DirectXのヘルプってのがどうやったら見れるのかわかりません。知ってますか?

DirectX SDKのページで入手できます。
http://msdn.microsoft.com/ja-jp/directx/aa937788.aspx

SDKはいらないので日本語ドキュメントというのをダウンロードすればOKです。



とおりすがりかも

リンク

2009/1/3(Sat) 11:40:02|NO.22184

GENKIさんのリンクはDirectX10だからバージョンが違うんじゃないかな。
DirectX9.0cのドキュメントはここです。

http://www.microsoft.com/downloads/details.aspx?familyid=4B9B1752-6F6C-440E-816C-35D247570AE4&displaylang=ja



ZANMETU

リンク

2009/1/3(Sat) 20:39:32|NO.22193

皆さんありがとうございます。
とりあえず両方DLしましたw



GENKI

リンク

2009/1/3(Sat) 21:11:13|NO.22197

> 両方DLしましたw

あれ。とおりすがりかもさんのと同じものだったはずですが…。
> Microsoft DirectX 9.0 Update (October 2004) 日本語ドキュメント

まあいいか、とりあえず、とおりすがりかもさんのものをDLしておけばよさそうです。


しかし…よく考えてみればMSDNがあるじゃないかと今頃気づきました。(^ ^;
http://msdn.microsoft.com/ja-jp/library/cc324230.aspx
これかな?



ZANMETU

リンク

2009/1/3(Sat) 22:42:17|NO.22200

すいません。頭が混乱してきました。

E3DSetRenderState -1, target, D3DRS_LIGHTING, 0 E3DSetRenderState -1, target, D3DRS_ZFUNC, D3DCMP_ALWAYS
以上のように書いてみましたが 何も変わりませんでした。

確認しますが、
12月30日のとおりすがりかもさんのご回答で

D3DRS_LIGHTINGを0に設定して...
とありますが、それは、E3DSetRenderStateのp3にD3DRS_LIGHTINGを指定し、
p4に0を指定するということですか?
あと

D3DRS_ZFUNCをD3DCMP_ALWAYSに設定すると....
これはp3にD3DRS_ZFUNC、p4にD3DCMP_ALWAYSを指定するということですか?



とおりすがりかも

リンク

2009/1/4(Sun) 12:44:11|NO.22202

targetがビルボードのIDを指しているのなら
ZENMETUさんが書いたコードであってますよ。

ビルボードの位置はE3DConvScreenTo3Dを使うと楽に計算できるかも。

あとはビルボードを半透明設定して一番最後に描画すればOKだと思います。

>GENKIさん
SDKの方が新しかったから勘違いしてました。
よく見たらドキュメントは同じですね。
失礼しました。



とおりすがりかも

リンク

2009/1/4(Sun) 12:56:17|NO.22203

それでも希望の効果が得られなかったら

ビルボードのD3DRS_ZFUNCをD3DCMP_ALWAYSにして
D3DRS_ZWRITEENABLEを0にしてビルボードを弾より先に描画する
という設定もあります。

いずれにしても
D3DRS_ZFUNC、D3DRS_ZWRITEENABLE、D3DRS_LIGHTINGの意味を理解した上で
組み合わせれば解決できると思いますよ。
がんばってください。

どうして解決できなかったら
orz labさんが照準付きのゲームを開発しているので
直接どうやっているのかを聞いてみるといいかも。
http://wikiwiki.jp/orzlabo/



ZANMETU

リンク

2009/1/4(Sun) 13:12:24|NO.22204


E3DSetRenderState -1, target, D3DRS_LIGHTING, 0 E3DSetRenderState -1, target, D3DRS_ZFUNC, D3DCMP_ALWAYS
こう記述するとビルボードがまったく見えなくなります。
試しに E3DSetRenderState -1, target, D3DRS_LIGHTING, 0 だけを記述すると
ビルボードもちゃんと見えてライトの影響も受けません。しかし、Zの値によって見えなく
なりますし、敵との間に障害物があったときにビルボードが障害物に隠れて見えなくなり
ます。やはりE3DSetRenderState -1, target, D3DRS_ZFUNC, D3DCMP_ALWAYSは必要です。
しかし、それを記述するとビルボードが見えなくなる・・・・・・・・・・・・・・
どうすればよいでしょう??
すいません。何度も質問して;;



ZANMETU

リンク

2009/1/4(Sun) 15:49:42|NO.22208

すみません。DirectXのヘルプ見てたら、わかりました!
>E3DSetRenderState -1, target, D3DRS_ZFUNC, D3DCMP_ALWAYS
これは、僕がとおりすがりかもさんが言ったのをそのまんま記したために起こったミスでし
た。DirectXヘルプにはD3DCMP_ALWAYS=8とあったので、ほんとは、

E3DSetRenderState -1, target, D3DRS_ZFUNC, 8
でした。
これで、障害物に阻まれていてもビルボードが見えるようになりました。

みなさんヒントをありがとうございます。また問題が発生したら書きます。



ZANMETU

リンク

2009/1/4(Sun) 16:17:25|NO.22210

すいません。ビルボードについてもう一つ聞いていいですか?
みなさんのおかげで照準をビルボードで作ることができました。
そこで、また問題が発生しましたw敵から遠ざかるほど、ビルボードが小さくなっていきま
す。全距離でビルボードが同じ大きさに見えるようにしたいです。
何かいい方法ありませんでしょうか?



GENKI

リンク

2009/1/4(Sun) 16:24:35|NO.22211

E3DGetScreenPos2命令とスプライトの合わせ技で解決できると思います。



とおりすがりかも

リンク

2009/1/4(Sun) 16:33:31|NO.22212

ビルボードのままやるんでしたら、

まず敵の座標を2D座標に変換します。
E3DGetScreenPos2を使います。

そしてE3DConvScreenTo3Dで再び3D座標に戻します。
このときのzの値を一定にすれば、いつもカメラからの距離が一定になるので
大きさも一定になると思います。

試してないのでわかりませんが、この方法は誤差が出て
照準がちょっとぷるぷると動くかもしれません。

そんなときは手動で計算してください。
カメラの位置から敵の位置へのベクトルを計算して
E3DVec3Normalizeで正規化します。
正規化したベクトルに距離(適当な一定値)をかけます。
そのベクトルをカメラの位置に足せば求める照準の位置になります。



ZANMETU

リンク

2009/1/5(Mon) 21:32:01|NO.22249

とおりすがりかもさんが言ったとおり一つ目の方法では照準がぷるぷる動きました。
なので2つ目を試してみました。

;hsid2は敵のID ;targetは照準のビルボードID E3DGetPos hsid2, posx, posy, posz E3DGetCameraPos cposx, cposy, cposz E3DVec3Normalize cposx-posx, cposy-posy, cposz-posz, newvecz, newvecy, newvecz posx2=newvecx*10 : posy2=newvecy*10 : posz2=newvecz*10 posx3=cposx+posx2 : posy3=cposy+posy2 : posz3=cposz+posz2 E3DSetBillboardPos target, posx3, posy3, posz3
とやったんですが、照準が見えなくなりました。どうしてでしょう。
まあ、ぷるぷるなっても距離によって大きさが変わる問題は解決したので
いいのですが・・・



とおりすがりかも

リンク

2009/1/6(Tue) 11:33:20|NO.22262

cposx-posxじゃなくてposx-cposxですよ。
でもこの方法、よく考えたら照準の位置がちょっとずれるかもしれません。
ぷるぷるなってもいいのなら1番目の方法の方が正確かも。



ZANMETU

リンク

2009/1/6(Tue) 16:58:42|NO.22282

ぷるぷるなってもそれ以外は理想通りに実現したので、1番目にしようと思います。
この照準の問題を解決したことで、作成中のゲームのロックオンが比較的少ない行数で
完成させることができました。ありがとうございます。



ONION software Copyright 1997-2021(c) All rights reserved.