[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 01/02 08:13 / Filesize : 170 KB / Number-of Response : 607
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】 DirectX初心者質問スレ Part15 【C】



1 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:56:40 ]
※回答する人も、質問する人も必ず読んでください

これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ

【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
 「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。

【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。

【C++】 DirectX初心者質問スレ Part14 【C】
pc11.2ch.net/test/read.cgi/tech/1189257706/

152 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:36:33 ]
VC++2005、windowsSDK、DirectX9 SDK(October 2006)の環境で
2Dの簡単なゲームを作ろうとしている所です

フルスクリーンモードでSetDialogBoxModeを使用している
全ソース付きのサンプルプログラムはどこかにありませんでしょうか?
できればフルスクリーンモードでのメニューバー表示のサンプルがあると助かります。

一応自分でもこれを実現するために
こちらの方のページを参考にしてほぼ丸写し状態でやってはみたのですが、
どうもメニューが表示されません。
ttp://www.geocities.jp/is3000nx/reading/dev/dev.html

ただ、SetDialogBoxModeを呼び出しても呼び出さなくても、
メニュー自体は存在しているようで、マウスで画面の上のあたりを
クリックなどしますと、瞬間的にメニューが現れ、メニューコマンドが実行されますが^^;

こちらに書いていない部分(DX初期化関連、ウィンドーモード、メッセージ処理etc…)
などで何か気をつける点でもあるのでしょうか???

153 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:48:55 ]
あ、VC++2005はExpressEditionです。よろしくお願いします

154 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:54:06 ]
板ポリゴンとかにテクスチャを貼ると、テクスチャが何故か右下にずれるのですが、何故なのでしょうか?
どうすれば直りますか?

155 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:28:43 ]
>>154
何かを間違っているから。

156 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 05:24:58 ]
どうすれば直りますか?

157 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 05:29:57 ]
間違いを修正する

158 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 05:49:02 ]
どうすれば間違いを

159 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 06:32:38 ]
どうやって貼りましたか?

160 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 08:12:48 ]
誘導
つttp://pc11.2ch.net/test/read.cgi/tech/1187922645/



161 名前:デフォルトの名無しさん [2007/12/25(火) 09:11:08 ]
DirectX9.0bSDK(2004October)付属サンプル2の、虹色の三角形表示プログラムについての質問です。

改造して四角形を表示させたいのですが、うまくいきません。

CUSTOMVERTEX vertices[] = に
{ 50.0f, 50.0f, 0.5f, 1.0f, 0xff0000ff, },
を追加することで頂点を4つにし、

Void Render()内の
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); を
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
にすることで、2つの三角形を連続して描画し、結果的に四角形になるかと思ったのですが
三角形一つしか表示されません。

また、
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); を
g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLESTRIP, 0, 0, 4, 0, 2 );
にすることで上記と同じ効果になるのかと思ったのですが、今度は三角形自体消えてしまいます。

どうしたら四角形が表示されますか?

162 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 09:26:56 ]
カリングされてるんじゃないかね?
SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE)

163 名前:161 mailto:sage [2007/12/25(火) 10:00:08 ]
できました!
あと頂点の順番?がおかしかったみたいで |X| ←こんな形になったけど、頂点入れ替えたら四角形になりました!
ありがとうございます!              ̄

164 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 10:35:15 ]
は?
頂点の順序が間違ってたのが原因、って事?

165 名前:161 mailto:sage [2007/12/25(火) 10:52:03 ]
>>164
三角形が一つしか表示されないという問題は
->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
で解決したんですが、今度は頂点の順番がおかしいせいか欠けた四角形になったんです。
/|  と  |\  の三角形の組み合わせで |X| こんな形に
 ̄       ̄                     ̄

166 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 14:42:39 ]
>>161
どうでもいいけどoct2004は9.0cだったと思うが

167 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:46:06 ]
疑問に思ったんだけど、四角形を描画する場合、頂点バッファを作ってDrawPrimitive()で描画するのと、
作らないでDrawPrimitiveUP()で描画するのとどっちが速いですか?
頂点バッファは頂点数が多いほど効果を発揮すると聞いたような気がするのですがどうなのでしょうか?

168 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 15:57:45 ]
疑問に思ったんだけど、なんで自分で試さないんですか?

169 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 20:21:12 ]
>>167

DrawPrimitiveUPのほうが早いですよ。
多くの方が様々なOSやビデオカードで検証済みです。










とか言ったらこいつは何も考えずにDrawPrimitiveUP使うんだろな。


170 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 22:21:13 ]
>>169
ありがとうございます。
やはり、頂点バッファは頂点数が多いほど効果を発揮すると言う事でしょうか?



171 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 22:23:17 ]
>>170
そうです。Microsoftが検証済みです。

172 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 01:31:37 ]
>>152
私も同じ事やろうとしたけど、どうも上手くいかないですね
でもこの人の作ったゲームだと実装されているっぽいし…
本当にSetDialogBoxModeを使ってるのかなぁ

この関数使ってまともにメニューが表示できた人っていますか?
というかフルスクリーンのメニュー表示はみなさんどうやってます?

173 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 01:40:45 ]
ステートブロックがいまいち良く理解できません。
1.普通のステート変更を最小限に抑えて変更する
2.(CreateStateBlock()で)キャプチャしたステートブロックを毎回適用する
3.カスタムステートシーケンス(BeginStateBlock()〜End...()まで)を適切に使用する
と三つのやり方があると思うんですが、
何も考えずに2.のやり方でも効率的にできるんでしょうか。
それとも多少のやりくりは必要なんでしょうか。
ピュアデバイスだとステート変更は変更するたびに行われるんでしたっけ?
ステートブロックの仕組みとかがわからないのでちょっと迷ってます。

174 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 02:30:21 ]
効率いいかなんてやってみればわかるだろ。アホか

175 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 02:47:54 ]
このスレっていったいどんな質問なら答えてくれるの?w

176 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 03:02:27 ]
パラドックス

177 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 04:01:19 ]
初心者ホイホイなのかな

178 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 07:20:42 ]
初心者であろうがなかろうが、自分で試せるものを試さないってのは単なる怠慢だと思うが。

やり方が分からないんであれば、どっちが効率的?などと聞くんじゃなく素直にやり方そのものを質問すべき。

179 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 13:52:41 ]
このスレいらねーなwwwww

180 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 14:13:55 ]
レンダリングステートを変更する事は、結構重いコストとして扱われるので、
Dx6まではコロコロ変化させずに、同じレンダリングステートのメッシュやターゲットを纏めて
レンダリングしたり、ステートの変化が最小になる順番でステート郡をレンダリングしてたりしたんだけど、
ステートブロックを使えば、複数のレンダリングステートの変化を一度にデバイスに適用出きるので、
上記の事をあまり意識しなくて良いレンダリングループが作れるようになったわけ。

でも、別にレンダリングするターゲットやステートの種類によってはステートブロックを使わなくても
そんなに処理が重くならないのも事実で、自分が作成しているプログラムでステートの変更が
重い処理だな、と思ったらステートブロックを試してみれば良いんじゃないの?
GPUとGPUへのバスの帯域、レンダリングするプリミティブの数、ステートの変更量といった要因が
あって、トータルで考える必要があるから、なんでもかんでも管理するのは効率的ともいえないし、
大規模エンジンを作るのに、ステートの管理コストを嫌って管理しないのも効率が逆に悪くなるし。

ケースバイで。効率的ってのは目的が無いと決定しない項目だから。



181 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 14:22:58 ]
>重い処理だな、と思ったらステートブロックを試してみれば良いんじゃないの?

そうなんだが、それを自分で試そうとしない輩が多すぎるな

182 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:19:34 ]
VisualC++2005、DirectX9.0c SDK、Windows SDKの環境です。

キャラクターのアニメーション等をさせる場合、
画面を毎秒60とか30フレームとかで更新、のような処理をしなければならないと思うのですが
その毎回の画面の更新タイミングはどのような手順で取るのでしょうか

183 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:38:29 ]
>>182
自分で試せ

184 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:49:08 ]
何を試せばいいのでしょうか

185 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:57:16 ]
「ゲームループ」でぐぐれ

186 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:58:02 ]
>>184
それを自分で試せ

187 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:00:24 ]
少し荒れてる状況で質問したのはタイミングが悪かったな

188 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:06:30 ]
>>187
自分で試せよ

189 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:19:19 ]
>>188
>>187に言うなよ!w

190 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 20:21:58 ]
マルチコア設計の描画エンジンだとステートブロック使うのは問題外の糞www
というnVidiaあたりのプレゼン資料なかったっけ



191 名前:180 mailto:sage [2007/12/26(水) 20:58:26 ]
>>190
まあ、実はステートブロックは、固定パイプライン時代の産物だから、基本的に
レンダリングステートなんてほとんど変えずに、シェーダでやれってのがDirectX9以降の
正しいGPUの使い方なんだと思う。

こんなの、実は悩むところじゃないと思うな。
固定パイプライン使ってても、レンダリングステートの変更なんて大した
負荷になってないっぽいもんね。所詮DirectX7時代の話だし。
一々ステートブロック作らなくても十分高速に動いてるし。
ステートブロックの解説も怪しいところあるから、普通利用を避けるんじゃないかな。

>>173は何故こんな事に疑問を持ったのか、謎だ。
(どこかの処理で実際に遅くなった、とかならわかるけど。)

192 名前:173 mailto:sage [2007/12/26(水) 23:38:39 ]
え、いや、普通な感じで
実装前にセオリーとか聞きたいなって…荒れさせたようでごめん
忘れて

>>180さん、なんかすいません…とても参考になりました…どうもでした
>>180さん、ごめん、俺のせいで

193 名前:173 mailto:sage [2007/12/26(水) 23:39:49 ]
>> >>180さん、ごめん、俺のせいで
>>182さん、ごめん、俺のせいで の間違いです ホント申し訳ないw

194 名前:182 mailto:sage [2007/12/27(木) 00:22:56 ]
>>185
ありがとうございます。_tWinMainの中でtimeGetTimeを使って
60分の1秒を数える方法を使ってみました
Windowsゲーは同期とかはキニシナイでいいんでしょうかね

>>193
いえいえキニシナイでください

195 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 02:19:50 ]
>>194
いや、同期取らないと駄目だろ。

196 名前:182 mailto:sage [2007/12/27(木) 02:55:23 ]
え?そうなんですか?>>195さんはどういった手順でやってるんでしょうか

197 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:00:18 ]
俺は可変フレームレートのが好きだな
要は1フレームでどんだけ時間が進んだかで
アニメーションの進行速度を変えればいいわけだから
そんでフレームの終わりにフリップすれば

198 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:15:47 ]
>>197
あれってどうやって実装してるの?
フレーム間の時間をグローバル変数にでも格納して参照するんだろうか。

199 名前:デフォルトの名無しさん [2007/12/27(木) 04:22:17 ]
DirectX9SDKを入れて、バージョンは8で開発したいんだけど、d3dx8.hとかないのね
d3d8.hとかはあるのに。

どうすればいいんだろ。どっかでDirectX8SDKを見つけてこないと駄目かな?


200 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 04:41:19 ]
9のOct2004だけど、d3dx8.hあるよ。



201 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 07:28:08 ]
仕事でどうしても必要じゃなきゃ9使った方がいいと思うけど。
まあ9x系対応とかだとDx9のOct2006までじゃないとダメらしいが

202 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 10:23:51 ]
>>199
リリースノートくらい読めよ・・せっかく日本語に訳してくれてるんだから。

------
この DirectX SDK には次のコンポーネントは含まれていません

Direct3D8 およびそれ以前の全てのバージョン
Direct3D RM
・・・・・・

これらのコンポーネントを使いたい開発者は、
MSDN から August 2007 DirectX SDK をダウンロードする必要があります。
        ~~~~~~~~~~~~~~~~~~~~~~~~~

203 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 10:26:15 ]
まあオーガスト2007だと8で作る意味が全くなくなるけどな

204 名前:デフォルトの名無しさん [2007/12/27(木) 11:12:48 ]
DirectX9でゲームを作ってたんだけど、DirectX9の独自の機能使ってないし、誰でもすぐに遊べる様にしたいからDirectX8にしたかったのさ。

>>200
>>202

サンクス。
とりあえず古いバージョン拾ってみよう。古いバージョンで上書き出来ればいいけど

>>203
そうなの?
結局XPの初期状態とかで動かないのかな?




205 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:56:09 ]
>>204
だからリリースノートを読めと。

----
すべてのプラットフォームでのインストール上の注意

・現在の DirectX SDK をインストールする前に、DirectX SDK の前バージョンを削除することを推奨します。
----

どのバージョンがどのOSに対応しているかも全てリリースノートに書かれている。

206 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 12:19:57 ]
もう、ほっといた方がいいかと。
一度受けた注意を怠るわ、質問している立場なのに偉そうだわ。
d3dx8.hの話にしても、>>104-105 で出てた話題なのに、
同じスレ内ですら検索かけてないし。

207 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:19:57 ]
2Dの描画で描画数がかなり多くなるため(1フレームに3000程度の数字テクスチャを描画)頂点バッファを利用して
1フレームに頂点バッファ一括ロック→memcpy→アンロック→DrawIndexedPrimitive
としているのですが、3000個描画するとシーン時間が6〜7ms程掛かってしまいます(それなりに良いスペックのPCで)
6000ポリゴン程度の描画でこんなに時間が掛かるはずがないと思うのですがやり方が間違っているのでしょうか?

208 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:40:20 ]
なんかmemcpyがボトルネックになってそうだけど
どの処理に一番時間がかかってるのか
もうちょっと絞り込んだ方がいいんじゃない?

209 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:43:44 ]
まず対照実験として、画面をクリアするだけで何も描画しない場合の速度を計るべきだと思う。

210 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:53:43 ]
ロック/アンロックが臭いと思うな。変なロックは速度に影響でかいから。
ロックを止めて、ダミーバッファにmemcpyする処理に置き換えてフレームレートを計測したら?
あと、頂点バッファは、まとめてる?ロックがボトルネックなら、頂点をまとめて1フレームにロックする回数を
1回にしてしまった方が良いよ。
それと、毎回コピーする頂点の計算処理は重くない?



211 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:04:19 ]
ところで、そろそろ>>152の質問に回答してくれる方はおりませんでしょうか?

ネットを漁り、アキバでDirectX関連の参考書を読みふけりましたが
どこもこの問題についてはあえて避けてるようにしか思えません

SetDialogBoxModeをマスターされました神様、いらっしゃいましたらお願いします

とりあえず、フルスクリーンでメニューとダイアログが表示できるようになればいいので
いい解決方を知っている方でも大歓迎です

212 名前:デフォルトの名無しさん mailto:age [2007/12/27(木) 20:05:35 ]
斜め投影した場合、投影されたCGがあえて歪んで見えるようにしたいです。
どこをいじればいいか教えてください。

213 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:16:28 ]
>>211
全ソース付のサンプル、か。

google code search で SetDialogBoxMode で検索したら結構引っかかったんだけど、やってみた?
検索結果の始めのほうはラッパのヘッダとか意味ないのばっかだけど
結果の後の方まで見てみると結構有用っぽいのがちらほら。Lunaとかも引っかかってたり。
ただライブラリ系ばっかでサンプルになるかどうかは分からん。

214 名前:207 mailto:sage [2007/12/27(木) 20:43:50 ]
レスありがとうございます
やはり描画部分が結構重いみたいです…
1フレーム当たりの時間が
ロック/memcpy/Drawを一切しない → 80μs
ロック→16000頂点分memcpy→アンロックでDrawしない → 450μs
一つ上の条件でスプライトを2000個描画 → 3210μs
いずれも他の描画以外の処理を含む時間で、memcpyは実際には描く分だけのサイズで行うので最悪条件でテストしています

215 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:46:38 ]
ロックしない/memcpyしない/アンロックしない/Drawする
っていうのも測った方がいいと思う。
頂点データがないのはアレなんで、計測外で初期化時にでも放り込んでおいて。

216 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:56:46 ]
PIXで、実際どのAPIが時間食ってるか調べてみたら?
GPUが忙しいのか、CPUが忙しいのか、プログラムが悪くってどっちも
遊んでる状態になってるのか、それを切り分けないと始まんないと思う。
あと、スペックに対しての期待値がどれくらいで、3210はどの位そこから遅いのか?

SDK付属ドキュメントの「Direct3D API 呼び出しの正確なプロファイル」あたりは一回読んでる?

217 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 22:23:55 ]
>>211
今てきとーに使ってみたら一応表示はできるみたいだがのー。
D3DPRESENTFLAG_LOCKABLE_BACKBUFFER忘れてるとかそんなオチじゃないよね?
しかし案の定XPとVistaじゃ挙動違うっぽいし、あんまし深入りしたくねぇなこれ。

218 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 22:35:28 ]
Dialogは普通に表示出来たけどメニューは
あんまりメリット感じないから使った事無いや。

219 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 23:35:17 ]
PIXの使い方がわからねぇ

220 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:02:20 ]
おれもおれも
まぁちょっとだけならわかるけど
つっこんでは分からねぇ



221 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:43:50 ]
助けて

頂点テクスチャフェッチのためにVertexShaderでtex2Dlod(Sampler,float4(In.tex,0,1))すると真っ黒になってしまいます
float4(In.tex,0,0)、float4(0,0,0,1)などでも同様でした
テクスチャのフォーマットはA32B32G32R32Fで、SM3.0にも対応しているのですが

tex2Dlodなどでぐぐってみたところ、MSのフォーラムなどで似たような症例がありましたが解決策がよくわからず・・・
原因に何か心当たりある方はいないでしょうか?

222 名前:221 mailto:sage [2007/12/28(金) 04:29:27 ]
ちなみにサンプラーは
MinFilter = Point;
MagFilter = Point;
MipFilter = None;
AddressU = Clamp;
AddressV = Clamp;
です

223 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 12:36:06 ]
等高線の形どおりに厚紙を切って重ねると、立体地図が作れますよね
この立体地図をプログラムで描画したいのですが、躓いてしまいました
今手元には等高線が書かれた白地図があるので
「等高線ごとに領域を分割し、各々に高さを与える」
といった処理にしようと思ったのですが、等高線ごとに領域を分割というのがどうしたらよいのか見当がつきません
このような処理の実現のしかたを教えてください
よろしくお願いします

224 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 13:06:56 ]
ダイレクトX関係ないじゃんといいたいが

・等高線が作る一つの輪を1リングとし、リング毎の高さと領域情報を保持
・高さの同じリングをまとめたものを1グループとして管理する
・グループ毎にY座標を変えて表示する
でいいだろ

もちろん、外壁も表示するのには各リングの輪郭線から頂点を自動算出して
外壁ポリゴンも作らんといかんけど

225 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 14:00:34 ]
すみません
3次元空間内の物体をピック処理をして、マウスの移動量で移動させたいのですが

ピックするところまでいったのですが
その後マウスの移動分動かすのはどうしたらいいのかわかりません。

初期値→移動後のマウス座標を得て、それをどのように3次元空間の座標に戻すのか
視点が回転したときに、xyzの移動量と向きはどうしたらいいのか

この二つがわからなくて壁に当たってしまいました。
ご指南お願いします

226 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 15:16:38 ]
>>225
視点から注視点の面上にあるポイントを結んだ物がマウスポインタのベクトル。
そのベクトルを対象オブジェクトまで伸ばし、ベクトルが変化した分だけ移動させればいい。

227 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 16:45:15 ]
すいません>>212もお願いします。

228 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 16:48:14 ]
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 |   お断りします  |
 |________|
    ハ,,ハ ||
    ( ゚ω゚)||
    / づΦ

229 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 17:02:14 ]
>>227
質問が抽象的すぎ

>斜め投影した場合
>投影されたCG
>歪んで

それぞれ具体的に

230 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 17:16:14 ]
>>212
誘導
つttp://pc11.2ch.net/test/read.cgi/tech/1187922645/

自分の質問を読んで、他人が内容を把握出来なければ、
ただでさえ少ない回答が0になるだけだよ。

>>223
>>224
もし、等高線毎に外周形状のみ与え、後は自動って言うのなら、
等高線が穴を含む形状の場合にめんどくさくなると思う。
形状に含まれる穴の数(トポロジー)に応じて、輪郭に対する
三角分割のアルゴリズムが変わるんじゃないかな?
穴が無ければD3DPT_TRIANGLEFANで外周頂点を与えれば良いので楽だが・・。



231 名前:224 mailto:sage [2007/12/28(金) 17:42:08 ]
>>230
山の事しか考えてなかったな
穴がある形状を考えるのを忘れてた

まあ、そもそも論として線だけ書かれたデータをそのまま読み込んで
処理しようとすんなら無理があるわな

232 名前:デフォルトの名無しさん [2007/12/28(金) 18:33:17 ]
頂点テクスチャフェッチ使えばできる
等高線の領域ごとにハイトデータで塗って
細分化した平面ポリゴンに適用すればできる
線のみからでもハイトデータを領域の関数で割り当てればできなくもない

自分ができないだけなのに威張ってるプログラマってカコワルイよね

233 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:39:05 ]
すみません、始めたばかりのところで理解できないのがあるのですが

デプスバッファの深度を書き込む/書き込まない
というのがあったのですが、そうすることでどうなるのでしょうか

デプスバッファ、というバッファ(1枚?)にZ値を書き込むというのはわかったのですが
書き込まないと、そこはどうなるのでしょうか?

いまいち何をしてるのか、したいのかが把握できなくて

234 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:39:36 ]
抽象的すぎてすいませんでした。

Xファイルを読み込んでCGを画面の中央に描画しているのですが、
そのCGを映しているカメラの位置をキー操作で変更できるようにしています。
で、カメラの位置を変更した場合に、
www.beamax.co.jp/Projec/PROJECframe.html の「斜め投影」の項にあるように歪んでみえるようにしたいのです。

D3DXMatrixIdentity(&m_view);
D3DXMatrixLookAtLH(&m_view,
&D3DXVECTOR3( cameraX, cameraY, cameraZ),//カメラの位置
&D3DXVECTOR3( 0.0f, 0.0f, 0.0f),//カメラの向き
&D3DXVECTOR3( 0.0f, 1.0f, 0.0f));//カメラの傾き
pD3DDevice->SetTransform(D3DTS_VIEW, &m_view);

一部ですが今こんな感じでカメラ配置をしています。
cameraX,cameraY,cameraZ はキー操作で増減するようにしています。
プログラムは、ソフトバンクの「DirectXゲームグラフィックスプログラミングVer.2.1Vista」という本を参考にしています。

よろしくお願いします。

235 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:57:46 ]
>>232
そりゃ失礼。

236 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:58:40 ]
まぁ、>>232も最後の1文は余計な一言だな

237 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 20:10:41 ]
>>233
最終的にスクリーンに描画するときに
各ピクセルに色を塗ると同時にそこにある物体が
カメラからどれくらいの距離にあるかをZバッファに記録しておく
そうすると
別の物体を同じピクセルに描画しようとしたときに
Zバッファの値を参照して
以前の値よりカメラに近ければ
新たな色を塗りZバッファの値も書き直す
以前より奥にあるものなら色をぬらない、という処理が可能になる

これをしないと後から描画したものでどんどん色を上書してしまうので
奥にあるはずのものが手前にあるものの上に描画されてしまう
したがって描画するときに奥にあるものから描画するというようなソート処理が必要になる

238 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 20:38:08 ]
>>234
それはビューの設定とは無関係
カメラの位置を変えたって、そんな変化は起こさないだろ
オブジェクト側を調整しろ

239 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 20:45:34 ]
>>237さん 回答ありがとうございます
つまり
 ______
|近 遠 近 …


Z値が書き込まれていって、それを参照するわけですね。
これは2次元平面に射影された状態ですよね

ある物体○△□が 奥行き方向に1列に並んでたとき
物体ごとにデプスバッファに

○ 書き込む    遠い
△ 書き込まない  ↓
□ 書き込まない 近い

としたら、最終的に一番近いのは□ですが、○が描画される、ということになるのですよね?


240 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 22:27:37 ]
>>232

線のみから求めてるわけじゃないじゃん
結局手動で山と穴の区別をつけたデータが必要だろ?



241 名前:223 mailto:sage [2007/12/28(金) 22:31:06 ]
>>223です
皆さんありがとうございます
231さんが仰るように「線だけ書かれたデータをそのまま読み込んで処理」というものを想定していました
穴を含む形状については今は考えず、概形が出来上がった後に改めて考えることにします
頂点テクスチャフェッチなど初めてきく言葉が沢山あるので、まずは片端から調べてみます
ありがとうございました

242 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 22:41:03 ]
>>239
違う

基本的に描画関数を呼んだ順に描画されるので
○△□の順番で描画した場合は問題ないが
□△○や△□○の順で描画した場合
一番遠いところにあるはずの○が一番上に描画されてしまう
それを防ぐために先に近いものが描画されていたら
それより遠いものを描画しないためのもの

243 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 22:56:49 ]
>>242さん
何度もありがとうございます。その点は理解できました。

描画の時にデプスバッファに書き込む物体と
書き込まない物体が混在したときにどうなるのでしょうか。
そこがわからなくて。

最終的にデプスバッファに書き込んでいる物体がちゃんとならんで
デプスバッファに書き込まない物体は描画順ということになるのですよね


244 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 22:58:38 ]
>>213
>>217
ありがとうございます
そのオプションをつけてウィンドウスタイルなどをいじってみたら、
開発環境のXPマシンだと、一応は表示されるようにはなりました

ですが、フルスクリーン→ウィンドウへと切り替えた場合に
ウィンドウ化しなかったり、古い98マシンで試してみた所
メニューを表示した瞬間に画面が激しくちらつくようになってしまったり
ダイアログは表示されなかったりと、挙動が酷くおかしいようです

とりあえずもう少しだけ教えていただいたサンプル等と見比べて
頑張ってみようと思います

最近のエロゲーとか、ホントこれどうやってるんでしょう?
やっぱり、DirectXで描画したなんちゃってメニュー&ダイアログなんですかねぇ

245 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 23:07:58 ]
そもそも標準のメニューを使っているようなエロゲーはDirect3Dなど使っていない。

246 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 23:23:28 ]
いや最近のエロゲは結構DirectX使ってるよ
とりあえず今入ってるはぴねすってエロゲーはDirectXで動作してるし
フルスクリーンメニューもちゃんと出てる

247 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 23:28:55 ]
もはや3Dも2DもDirectGraphicsで統合されてるし

248 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 23:32:23 ]
メニューやダイアログを表示中に
ゲーム画面が変化しているやつは見た事無いから、
そこに解決の糸口があるんじゃないかな。

249 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 23:47:57 ]
メニューループにはいったら普通に他は止まるだろ

250 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 23:50:33 ]
まさかとは思うが、メニューがある場所に、自分で別の物を描画しておきながら、
ちらつくとか表示されないとか馬鹿なことをぬかしているわけじゃないよな?



251 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:13:29 ]
>>250
ちらつく、というのはWin98環境の方だけで、XPでは画面上に
しっかりと表示されているので、それはないかと思います

>>248
いくつかフルスクリーンメニューのあるゲームを起動してみたところ
どうもメニューが出た時に画面が下にずれているものが多いようです

なんとなく思うのは、これはDirectXでのフルスクリーンモードではなくて
実際にはウィンドウモードなのではないかと。
画面いっぱいのクライアント領域をもつメニュー付きの通常ウィンドウを作って、
必要に応じてウィンドウを縦方向にずらしてメニュー表示しているのでは?

それが可能だとすると、環境によって挙動があやしげなSetDialogModeに
たよるよりも安定しそうな気もします
SetDialogModeはおいといて、まずこの方法でできるかどうか試してみようかと思います

252 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:53:25 ]
システムに依存することは止めたらどうかね?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<170KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef