■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

【C++】 DirectX初心者質問スレ Part5 【C++】
501 名前:デフォルトの名無しさん :2005/08/31(水) 11:30:26
>>496の馬鹿ですが、
SetCooperativeLevelでDDSCL_NORMALを設定すると
思うのですが、サーフェイスを作成するところで躓いてしまいます。
DirectDrawの初期化については
ttp://www.cnet-try.ne.jp/akiji/directx.htm
こちらのサイトのソースを参考に拝借させてもらってます。
フルスクリーンから通常のウィンドウモードにするには何か他に手順が必要なのでしょうか?
低脳な質問ですが教えてください。おながいします。

502 名前:デフォルトの名無しさん :2005/08/31(水) 18:03:35
DirectInputでキーボードのAが押されたらA、Bが押されたらBと表示させるには
switchやテーブル変換等を使って表示させるしか方法ないですか?

503 名前:デフォルトの名無しさん :2005/08/31(水) 19:19:17
>>502
ヘルプのDirectInputのチュートリアルは読んだかな?
アレは中々上手い方法でやっているので一度は読んでみることをオススメする。

504 名前:デフォルトの名無しさん :2005/08/31(水) 19:52:51
>>503
ありがとうございます。早速読んでみました。
これのことですよね?

#define KEYDOWN(name, key) (name[key] & 0x80)

g_lpDIDevice->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
if (KEYDOWN(buffer, DIK_RIGHT));
// Turn right.

マクロについて勉強してきますorz

505 名前:デフォルトの名無しさん :2005/08/31(水) 20:01:06
あー、name[key]がマクロの特殊な構文なのかと勘違いしました。
直接入力の場合の構文ですね。ボケてたorz

506 名前:501 :2005/09/01(木) 19:27:08
すみません。情報不足だったでしょうか。
ひとつ訂正があるのですが、
×フルスクリーンから通常のウィンドウモードにするには
○ウィンドウモードにするには
ここではDirectDrawの質問は受け付けてないんですか?
せめて何がいけないのか教えてください。

507 名前:デフォルトの名無しさん :2005/09/01(木) 19:49:03
>>506
DDSCL_FULLSCREEN

508 名前:デフォルトの名無しさん :2005/09/01(木) 20:03:26
「躓いてしまいました」から何を察しろというのか。ホームラン級の馬鹿だな。

509 名前:501 :2005/09/01(木) 20:32:35
すみません。
ttp://www.cnet-try.ne.jp/akiji/directx05.htm
ソースはこちらと同じで
hRes = lpDD->SetCooperativeLevel(hWnd,DDSCL_NORMAL);
と修正しただけです。
躓くというのは
・・・
hRes = lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL);
if(hRes != DD_OK)
{
 lpDD = NULL;
 lpDDSPrimary = NULL;
 MessageBox(hWnd,"Step4","Error",MB_OK);
 return hRes;
}
ここでエラーになるという事です。

510 名前:デフォルトの名無しさん :2005/09/01(木) 21:00:28
また同じこと言うが
SDKのサンプルに答えがあるのに
なぜ見ない?

511 名前:デフォルトの名無しさん :2005/09/01(木) 21:54:42
あの、
pTexture->LockRect(0, &LockedRect, &rect, 0);
↑みたいなLock関数について伺いたいのですが、
Lock関数の引数で、ロックフラグ(↑のLockRectの場合は第四引数)が
0の場合はどのような意味を持つことになるのでしょうか?
DirectXのヘルプには、
D3DLOCK_DISCARD
D3DLOCK_NO_DIRTY_UPDATE
D3DLOCK_NOSYSLOCK
D3DLOCK_READONLY
D3DLOCK_NOOVERWRITE
のいずれかを使えと書いてあり、内容も理解できます。
しかし、いろいろサイトを見てきましたが
このフラグに0を指定してるソースが多々見受けられます。
解説が見つからなかったのでここで質問させていただきます。
どうかよろしくお願いします。




512 名前:501 :2005/09/01(木) 22:21:52
>>510
サンプルとは現在のSDKにも入ってるんでしょうか?
Direct3Dのサンプルなどならあったのですが…

513 名前:デフォルトの名無しさん :2005/09/01(木) 22:22:08
>>510
初心者スレでそうガーガーわめいたところで解決などしない。
それにあのSDKのサンプル郡は初心者には触り難いイメージがある。
アレは普通はみないよ。

俺も初心者の頃、DirectXの初心者本買いまくった方だから、
初心者の役に立たないサンプルソースの匂いってわかるんだ。

514 名前:デフォルトの名無しさん :2005/09/01(木) 22:34:44
>>511
日本語ヘルプはファビョってるから、英語のヘルプを読め。

515 名前:デフォルトの名無しさん :2005/09/01(木) 22:47:26
誰か「猫でもわかるDirectX」書いてくれ

516 名前:501 :2005/09/01(木) 22:54:26
>>513
役に立たないソースでも構いません。詳細きぼんです。

517 名前:デフォルトの名無しさん :2005/09/01(木) 23:03:33
>>512
DirectDrawなんて使ってると、わからないことがあるたびにそうやって
生き字引を探さなきゃならないわけだが・・・
それでもDirectDrawを使い続けるのか?
正直、旧バージョンのサポートなんて無いといっていい。
あくまで実行ファイルが動くってだけだ。
なんかさ、どうでもいいところで躓くのって嫌じゃない?
特に理由がないなら、DirectX9を奨めたいけどね。

518 名前:デフォルトの名無しさん :2005/09/01(木) 23:05:57
DirectX5と7の本ならまだAmazonに売ってる
近所の書店でも見かけた

519 名前:デフォルトの名無しさん :2005/09/01(木) 23:06:18
>>516
まあ、どうしてもっつーならこの本をかいたまへ
http://www.amazon.co.jp/exec/obidos/ASIN/4875937997/qid=1125583494/
もう、これっきゃないっしょー

520 名前:デフォルトの名無しさん :2005/09/01(木) 23:17:42
>>519
> I/O別冊第1編集部 (編さん)

「編纂」なのは分かっているが、ひらがななもんで一瞬「編さん(影さん・つぐ美ちゃん)」が書いたのかと

521 名前:デフォルトの名無しさん :2005/09/02(金) 01:37:59
DirectXの日本語ドキュメントって2002以降
作られてないの??


522 名前:デフォルトの名無しさん :2005/09/02(金) 02:01:45
(October 2004)が最後

523 名前:デフォルトの名無しさん :2005/09/02(金) 02:24:48
http://www.microsoft.com/japan/msdn/directx/downloads.aspx
ここ見たら、DirectX9は、2002しかないけど...

524 名前:デフォルトの名無しさん :2005/09/02(金) 02:35:20
>>523
http://www.microsoft.com/downloads/details.aspx?FamilyId=4B9B1752-6F6C-440E-816C-35D247570AE4&displaylang=ja

525 名前:デフォルトの名無しさん :2005/09/02(金) 03:00:21
スレのログは一応見たのですが、
D3DのDLLを個別に配布しないですむDirectX9は
Dec2004が最新ってことで良いのでしょうか?

526 名前:デフォルトの名無しさん :2005/09/02(金) 03:06:56
>>525
d3dx9_24x.dll〜d3dx9_27.dllの事ならそうだ

527 名前:デフォルトの名無しさん :2005/09/02(金) 03:21:03
>>524
ありがとー。


528 名前:デフォルトの名無しさん :2005/09/02(金) 15:52:30
>>501
サイトの方は見てないが
おそらくバックバッファとプライマリバッファのピクセルフォーマットが
異なっているんじゃないだろうか。
俺はバックバッファはOFFSCREENPLAINで作って、
ウィンドウモードのときはGDIでウィンドウに転送してる。

それとI/Oの本は持ってるけどその辺のことは全然書いてないし、
フルスクリーンで何も考えないでとりあえずDirectX使うところまでも
たどり着けないようなやつが買う本。たぶん参考にならない。

529 名前:デフォルトの名無しさん :2005/09/02(金) 22:14:55
同じメッシュを幾つも描画する時どうしてますか?

位置情報を元に一つのメッシュを幾つも描画してますか。

それとも
vector<Mesh*> array;
初期化部
Mesh* pmesh = new Mesh;
array.push_back( pmesh );

描画部
for( int i = 0; i < 10000; i++ )
     array.Draw()
こんなんやってますか?

というのは
今までメモリを気にして前者のやり方でやってたのですが
本をみると(Spriteですが) listに放りこんでるではないですかっ!!

そこで試しに10000回push_backやってみたんですが
GlobalMemoryStatusで dwAvailPhysを見てみたんですが
殆どメモリが減ってない。
vector<Mesh*>は Meshサイズ分のメモリを食ってないのでしょうか??

530 名前:529 :2005/09/02(金) 22:19:02
おっと付け足して文を構成したせいで
描画部がわけわかんなくなっちゃったぜ


531 名前:デフォルトの名無しさん :2005/09/02(金) 22:44:39
VRAMに乗ってたりして

532 名前:デフォルトの名無しさん :2005/09/02(金) 22:45:25
VRAMの消費調べてみ

533 名前:デフォルトの名無しさん :2005/09/02(金) 22:55:10
VRAMの○×だよ!

534 名前:529 :2005/09/02(金) 23:05:24
ぐはっ
見当違いのメモリを調べていたのかw


535 名前:デフォルトの名無しさん :2005/09/02(金) 23:11:06
>>529
共通の描画用メッシュの参照ポインタを持てばいい。
そのためのAddRefだろー。

現実はあまり使わないけどなw

536 名前:529 :2005/09/02(金) 23:17:53
VRAMを調べてくれる関数がわからん・・・
フリーソフトはあるのだから
調べる方法は必ずあるんだろうなぁ

VRAM sprintf でググっても出てこんw

同じ物を描画する時はどうやってますかい?

537 名前:デフォルトの名無しさん :2005/09/02(金) 23:23:10
だからVRAMに保持させとく描画用メッシュは1つだけでいいだろ。

538 名前:529 :2005/09/02(金) 23:43:41
と、なると前者の方法で
位置情報を元に 一つのメッシュを
再利用すべきなのですな

1000回のチェックに下げて
VRAMチェッカー(フリーソフト)で調べると
2Mちょっと食われてた。

539 名前:デフォルトの名無しさん :2005/09/02(金) 23:58:29
ドラクエとかのマップだって、そうだろ?
同じマップチップを何度も使いまわしている。
それが3Dになっただけだ

540 名前:デフォルトの名無しさん :2005/09/03(土) 00:07:21
質問です。XP、Visual C++ .NET です。
MFC スレかどうか迷ったのですが、ここで質問させていただきます。
プロジェクトは MFC を用いて組んでいます。

DirectInput に関してです。

(プロジェクト名).rc(85): error RC2104 : undefined keyword or key name: DIK_BACK

というエラーが出て、rc ファイルを見てみると、次のようなコードがありました。

/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//

IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE PURE
BEGIN
"C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL, NOINVERT
DIK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT, NOINVERT
DIK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT, NOINVERT
DIK_F6, ID_NEXT_PANE, VIRTKEY, NOINVERT
DIK_F6, ID_PREV_PANE, VIRTKEY, SHIFT, NOINVERT
DIK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT
DIK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT, NOINVERT
"X", ID_EDIT_CUT, VIRTKEY, CONTROL, NOINVERT
"Z", ID_EDIT_UNDO, VIRTKEY, CONTROL, NOINVERT
END

(続く)

541 名前:540 :2005/09/03(土) 00:08:33

実は rc ファイルをいじったこと今まではなく、そもそも rc ファイルが何者なのかも理解できていません。
また、DirectX 関連のライブラリとのリンクなどはずっと以前から行っており、プロジェクトのビルドもできていましたが、
今日、突然このようなエラーが現れました。
このかん、DirectX に関連する部分をいじってはないつもりです。(いじったからエラーが出たと思うんですが・・・)

上の部分のコードはいつ生成され、エラーの原因は何なのでしょうか・・・。
よろしくお願いします。

542 名前:529 :2005/09/03(土) 00:12:48
そんな風に思ってた時期が(ry

ロールプレイングゲームプログラミング
という書籍に
CChipという関数に画像データを1個ずつ入れて
それを
list<CCharacter>にぶっこんでるわけですよ
      ↑(Image(画像を取り扱うクラス)を継承している。)
マップに存在する分だけ

そこで、オレもぶっこんでみようかなと
頭こんがらがったワケデスヨ。

>>540
.rcはResourceファイルでメニューバーやら
ショートカットキー(Accelarator)などを保存?みたいな
しているファイルで、それは
resource.hファイルというのに定義されている。
#include "resource.h"てのが抜けてるのだろうか?

543 名前:デフォルトの名無しさん :2005/09/03(土) 00:27:29
>>540
とりあえず "DIK_"ってのを"VK_"にすればいいんじゃないかしら。
間違って置換しちゃったとか。

544 名前:540 :2005/09/03(土) 00:29:36
>>543
置換・・・

orz やっちまったようです。こんな質問に対してエスパー解答本当にありがとうございました。

545 名前:関連リンク製作委員会 :2005/09/03(土) 03:45:01
【C++】 DirectX初心者質問スレ Part5 【C++】
ttp://pc8.2ch.net/test/read.cgi/tech/1122031254/
[詳細不明]DirectX9.0c日本語リリース[人柱]
ttp://pc8.2ch.net/test/read.cgi/win/1090985428/
鬱だ氏のう DirectX (Part 15)
ttp://pc8.2ch.net/test/read.cgi/tech/1096649788/
DirectXとOpenGL、ゲーム作るならどっち?
ttp://pc8.2ch.net/test/read.cgi/gamedev/1009941920/
Managed DirectX vol.2
ttp://pc8.2ch.net/test/read.cgi/tech/1061285378/
最強のDirectShow Filterを探そう
ttp://pc8.2ch.net/test/read.cgi/avi/1030190329/
Direct 3D
ttp://pc8.2ch.net/test/read.cgi/gamedev/1005293179/
OpenGL VS Direct3D
ttp://pc8.2ch.net/test/read.cgi/tech/1044308707/
出やがったなDirectX8.1
ttp://pc8.2ch.net/test/read.cgi/win/1005383406/
C#でDirectX9 初心者の館 2頂点目
ttp://pc8.2ch.net/test/read.cgi/tech/1103998649/
DirectShowと戦うスレ
ttp://pc8.2ch.net/test/read.cgi/tech/1026666092/
Direct3D
ttp://pc8.2ch.net/test/read.cgi/tech/1011762546/
VB.NET で DirectX 初心者の箱庭
ttp://pc8.2ch.net/test/read.cgi/tech/1106216291/
2D!!のDirectXをやってみるかもな
ttp://pc8.2ch.net/test/read.cgi/gamedev/1005133911/
━━━━Direct Draw━━━━
ttp://pc8.2ch.net/test/read.cgi/gamedev/1031289035/
DirectXのサンプルをしゃぶりつくす!
ttp://pc8.2ch.net/test/read.cgi/gamedev/1032657642/

546 名前:デフォルトの名無しさん :2005/09/03(土) 19:55:38
DirectInputにてバッファーからキー入力を取得しているのですが
SHIFTが同時に押されているかどうかはどう判断するのでしょうか?
今はシフトが押されたらbool isShift=true; 離されたらisShift=false:として
場合分けをしています。

547 名前:デフォルトの名無しさん :2005/09/03(土) 20:04:26
>>546
両方しらべればいいじゃない

548 名前:デフォルトの名無しさん :2005/09/03(土) 20:34:29
VC6.0で->とか関数で引数とかを表示してくれヘルプみたいなのを
使えるようにするにはどうしたらいいでしょうか?

549 名前:C初心者です :2005/09/03(土) 21:01:05
質問です。
NT系のOSってノートパッドに書き込める容量は制限されて無いみたいなんですけど、
Meってノートパッドに書き込みすぎるとメモリ不足って言う表示がでてしまい、それ以上書けなくなってしまいます。
そこで、Meで動作する容量の制限されないノートパッドをC言語で作ってるんですけど、イマイチ作れません。
だれか作り方教えてください。お願いします。

550 名前:デフォルトの名無しさん :2005/09/03(土) 21:09:59
>>549
スレタイ百回口にだしてよもう

551 名前:C初心者です :2005/09/03(土) 21:17:31
>>550
早とちりしてました。ほかのスレに行きます

552 名前:546 :2005/09/03(土) 21:31:25
自己解決しました。
よく考えたらバッファーからは押されたキーの情報を時系列順にしか取り出せないのだから
この場合はフラグでしか無理ですね…。

>>547
チェックした時点でSHIFTが押されているかではなく、あるキーが押された時点で
同時にSHIFTが押されているかどうかを調べたいので
やはりバッファーからの情報を元にフラグを立てることにします。

スレ汚しすみません。

553 名前:デフォルトの名無しさん :2005/09/03(土) 22:10:42
>>552
キーはな。
まず関数を作るんだ。
作る関数は

GetOnTrgKey関数  キーが押された瞬間をとる
GetOffTrgKey関数  キーが放された瞬間をとる
GetOnKey関数    キーが現在押されているかどうかをとる

の3つだ。
引数はスペースだとかリターンだとか上とか下とかキーの種類な。戻り値はboolな。
この関数ができれば、

if(GetOnKey(SHIFT)){
  if(GetOnTrgKey(ENTER)){
  }
}

って簡単だろ?
もちろん、前回のフレームのキー状態をとっておく必要はあるからね。
上の3つができたら、キーの長押しなんかも判断できる関数作ってみ。
長押しってのはRPGのステータス画面なんかで十字キーしばらく押してると
ピッピッピッピピピピピピピって連続で押されているみたいな動作するじゃん。それ。

554 名前:デフォルトの名無しさん :2005/09/03(土) 22:37:26
GetOnTrgKey実現するには
スッドレとイベントが必要だったり

555 名前:デフォルトの名無しさん :2005/09/03(土) 23:05:50
>>554
いらないと思うけど・・・

556 名前:デフォルトの名無しさん :2005/09/04(日) 02:03:14
>>552
答えようとしてる人達が、バッファリングデータのことを
知らない人ばかりですまないな。

557 名前:デフォルトの名無しさん :2005/09/04(日) 02:16:20
>>555
>GetOnTrgKey関数  キーが押された瞬間をとる
戻り値がboolで、キーが押された瞬間を捉えるとすると同期オブジェクト使うしかないやん。
スピンロックは却下な。

558 名前:デフォルトの名無しさん :2005/09/04(日) 02:21:36
>>557
フレーム単位であわせりゃいいじゃん。
つーか、フレーム単位でしかとらないほうがいいだろ。

559 名前:デフォルトの名無しさん :2005/09/04(日) 12:13:42
質問です。XP、.NET です。
MFC を利用してコードを組んでいます。

DirectX9 の勉強中です。
DirectInput によりキーボードの入力状態をチェックしてるのですが、上手く行きません。

コンパイルエラーは出なく、原因が全くつかめないため、
冗長かも分かりませんがソースの必要と思われる部分をUPします。

http://www.geocities.co.jp/CollegeLife-Club/7442/ts.txt

自作 CDirectInput8 クラスの InitDInput() を、MainFrame の OnCreate() 内で呼び出して
DirectInput の初期化を行い、OnTimer() 内でキー状態をチェックしています。
道中メッセージボックスでのエラーは出ません。
が、キー入力を行っても "成功" のボックスが出ません。
調べたところ、OnTimer() 自体は確実に呼ばれているようです。

お手上げ状態です。
かなり面倒な質問ですが、お時間のある方、ご協力をお願いします。

560 名前:デフォルトの名無しさん :2005/09/04(日) 12:24:02
>>559
hr = mpDInputDevice->Poll();
hr = mpDInputDevice->GetDeviceState(256,diKeyState);
if(hr != DI_OK){
hr = mpDInputDevice->Acquire();
while(hr == DIERR_INPUTLOST)
hr = mpDInputDevice->Acquire();
return 0;
}

その部分、俺のソースではこんなことになっていた・・・orz
なんか支離滅裂なコードなのであんまり気にしないでくれw

君のは多分Poll関数が呼ばれてないだけじゃないのかな?(違ったら素マンコ)

561 名前:559 :2005/09/04(日) 12:39:48
>>560
Poll() に関して調べてみました。
内容はまだ理解できていませんが、キーボードやマウスの場合は必要ないようです・・・。
申し訳ありません。

562 名前:デフォルトの名無しさん :2005/09/04(日) 12:50:12
>>559 SDKだとこんな風にしてるわよ。
//if (hr == DIERR_INPUTLOST){
//m_directinput.m_pDIDevice->Acquire();
//}
if( FAILED(hr) )
{
hr = m_directinput.m_pDIDevice->Acquire();
while( hr == DIERR_INPUTLOST )
hr = m_directinput.m_pDIDevice->Acquire();
return;
}


563 名前:デフォルトの名無しさん :2005/09/04(日) 12:52:55
>>561
ほんとだ。
いい加減なこといってすまん。

じゃ、やっぱ
while(hr == DIERR_INPUTLOST)
hr = mpDInputDevice->Acquire();
なのか?ちがうか・・・orz

564 名前:デフォルトの名無しさん :2005/09/04(日) 12:53:59
>>562
かぶった。すまん。

565 名前:デフォルトの名無しさん :2005/09/04(日) 12:58:45
GetDeviceStateの戻り値は調べたのか?
DI_OKならm_diKeyStateを直接表示してみては

566 名前:559 :2005/09/04(日) 13:01:03
しまった・・・
GetDeviceState() で SUCCEED していないようです。戻り値調べてみます。
ありがとうございます。

567 名前:デフォルトの名無しさん :2005/09/04(日) 13:04:00
やっぱ、ソースみると解決早いな。

568 名前:559 :2005/09/04(日) 13:06:24
GetDeviceState() の戻り値:

DIERR_NOTACQUIRED
The operation cannot be performed unless the device is acquired.

orz

569 名前:559 :2005/09/04(日) 13:10:02
ひとまず、指摘いただいたとおり
FAILED の時に Acquire() 呼び出すように改良してみます。
お付き合いありがとうございました。一旦失礼します。

570 名前:559 :2005/09/04(日) 13:16:49
動いたあああああ!!!!!!
ありがとうございました。ようやく次の作業にいけます!

長々とお世話になりました。それではー。

571 名前:デフォルトの名無しさん :2005/09/04(日) 16:34:03
すいません、ベクトルの回転について困っています。
ベクトルを任意軸で回転させ新しいベクトルを取得したいのですが、計算結果にわずかな誤差がでてしまうのです。
例えば (0, 0, 1) というベクトルを (1, 0, 0) という軸で90度回転させるとします。
+Zに向いているベクトルを-Yに向けたいのです。
ところが、計算してみると (0, -0.999998, 0) などコンピュータらしい誤差が生まれます。
この問題、なんとかならないでしょうか?

ベクトルの回転方法としては、ベクトルを行列に格納し、回転行列を作って掛け合わせ、その行列から
_41, _42, _43 を取り出して新しいベクトルとしています。
関数はD3DXMatrixRotationAxis() や D3DXQuaternionRotationAxis() と D3DXMatrixRotationQuaternion() などを使いましたが、
誤差をなくせません・・・。
よろしくお願いします。

572 名前:デフォルトの名無しさん :2005/09/04(日) 16:39:53
回避は『ほぼ』不可能です。
演算の手法や順番の工夫、遅くなるのを覚悟で倍精度や拡張精度の
浮動小数点演算を行うといった方法である程度軽減は可能ですが、
離散値しか扱えない以上は丸め誤差や打切り誤差は不可避です。

573 名前:デフォルトの名無しさん :2005/09/04(日) 16:43:05
マジか

574 名前:デフォルトの名無しさん :2005/09/04(日) 16:46:59
>>571
つーか、何がしたいの?
こういうの無理そうだって感覚的に理解できるっしょ普通w
また、こういう微妙な数字をゲームの判定なんかにつかっちゃ駄目だよ。マジで。
1ぴったりであることとか、0ぴったりであることとか。

575 名前:デフォルトの名無しさん :2005/09/04(日) 16:50:22
マジか

576 名前:デフォルトの名無しさん :2005/09/04(日) 18:04:08
誤差前提でプログラムを組むしかない。

577 名前:デフォルトの名無しさん :2005/09/04(日) 18:06:46
>>574
ん〜…
ある平面があって、その平面は指定したベクトルの先に展開したいので、
まず回転のない平面の4頂点を作り、指定したベクトルに応じた回転を与えることで、
4頂点の座標を求める・・・・ということをやっています。傘なんかを思い描いてもらえればいいかと思います。
傘の柄が指定したいベクトル。柄の先に有るビニールが展開したい平面。
そして、その平面と当たり判定をするのですが・・・その平面に対しつっこんできた点の、
反射ベクトルを求めようとしているのですが、なにか微妙な誤差がありまして。平面との反射角は、
法線と角度をとった場合、平面の表なら90以下、平面の裏なら90ど以上じゃないとおかしいじゃないですか。
それが、裏なのに89.9999...など「微妙に数値がずれてる」場合がありまして、うまく計算できないときがあるのです。
先ほどの例で(0,0,1)を(1,0,0)などで90度回転させた平面の座標を見たところ、しっかり90度で回転させているのに
頂点が綺麗な数字にならず14.9999...など回転させた際に誤差が生まれたようで。それが反射角が微妙に
おかしくなる原因かと思ったのです。
>>572
不可能・・・ですか。マジですか・・・。
まぁ、反射角の求め方もまだ怪しいので、もうちょっと調べてみます。

ありがとうございました。長文ですみません。

578 名前:デフォルトの名無しさん :2005/09/04(日) 20:09:10
浮動小数点を使っている限り数値誤差は避けられない。
スパコンで行う大規模数値計算ですらそれを前提に行う。
ゲームみたいなテキトーなものはテキトーでよい。

>>577
DirectXのヘルプのHLSLのreflect関数に公式が出てるよ。
説明はt-potに良いのがあった記憶が。

579 名前:デフォルトの名無しさん :2005/09/04(日) 23:16:45
この板や3Dプログラミング系のBBSで誤差が話題になることは稀だけど
多分それは、その部分は適当にすませてるケースが多いからだろうな。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4563036420/qid=1125843179/sr=1-7/ref=sr_1_10_7/250-0637096-8431410
この本がお勧めです。難しいけどね。

580 名前:デフォルトの名無しさん :2005/09/04(日) 23:34:27
>>579
わw
センスなさそーだなお前w
誤差がでることを前提に作るしかねぇってわかるだろ。
それとも何か解決策でもあったか?

くっだらねぇ本紹介する前にテメェがその本で獲た結論から言えや。

581 名前:デフォルトの名無しさん :2005/09/04(日) 23:44:51
>>580
著者に向かってなんてことを言うんだ

582 名前:デフォルトの名無しさん :2005/09/04(日) 23:45:46
>>580
この本は誤差がでることを前提に作れっていってるんだよ。
誤差があっても落ちない破綻しないようにする作り方を示してる。
でも他により良い資料があるなら是非紹介して欲しい。

583 名前:デフォルトの名無しさん :2005/09/04(日) 23:49:47
>>580
自分で自分をDQNだって明言することが趣味なのか?
アカデミックな本に関してアレルギーでも持ってるのかな?

584 名前:デフォルトの名無しさん :2005/09/04(日) 23:56:25
自分の本が売れないからって必死ですね

585 名前:579 :2005/09/05(月) 00:02:52
>>580
んーやはりちょっと気になるなぁ。
いったい何をもってくだらないと断じているのか知りたい。
ちなみに自分自身は、学歴ないし頭悪いし計算幾何学に通じてる訳でもないし
その本は半分ぐらい読んで放置中だw
でもいずれそれに沿った実装はしたいと思っている。
誤差は本当に頭が痛い問題だ、もっと簡単で使える技術があるなら本気で知りたい。




586 名前:デフォルトの名無しさん :2005/09/05(月) 00:03:09
アカデミックな本wwwキタwwwキタコレwwwww

587 名前:デフォルトの名無しさん :2005/09/05(月) 00:03:10
>>581-583
営業活動必死だなw

588 名前:デフォルトの名無しさん :2005/09/05(月) 00:04:51
>>582
>この本は誤差がでることを前提に作れっていってるんだよ。
読んでも読まなくても俺と結論がいっしょじゃねぇかよw

589 名前:デフォルトの名無しさん :2005/09/05(月) 01:29:15
質問です。XP、.NET です。
DirectInput の勉強中です。

class CDirectInput8
{
public:
 BOOL CALLBACK EnumDevicesBySemanticsCallback(
  LPCDIDEVICEINSTANCE lpddi,
  LPDIRECTINPUTDEVICE8 lpdid,
  DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef);
}

BOOL CALLBACK CDirectInput8::EnumDevicesBySemanticsCallback(
 LPCDIDEVICEINSTANCE lpddi,
 LPDIRECTINPUTDEVICE8 lpdid,
 DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef)
{
 //(中略)


自作 CDirectInput8 クラス内で上記コールバック関数を定義し、
CDirectInput8::InitDInput() (初期化用のメソッド) 内で以下のように EnumDevicesBySemantics() を使っています。

(続く)

590 名前:589 :2005/09/05(月) 01:29:52
// デバイスへのアクションマッピング
hr = m_pDInput->EnumDevicesBySemantics(
  NULL, &m_DIActionFormat, EnumDevicesBySemanticsCallback, NULL, DIEDBSFL_ATTACHEDONLY);
if (FAILED(hr)) {
 AfxMessageBox("デバイスへのアクションマッピングに失敗");
 return false;
}

すると、上記コードでコンパイルエラーが出ます。
〜\DirectInput8.cpp(44): error C2664: 'IDirectInput8A::EnumDevicesBySemantics' : 3 番目の引数を 'BOOL (LPCDIDEVICEINSTANCE,LPDIRECTINPUTDEVICE8,DWORD,DWORD,LPVOID)' から 'LPDIENUMDEVICESBYSEMANTICSCBA' に変換できません。

型変換ができないと言われましたが、
他の色々なサンプルを見ても、同じコードが書かれており、コンパイルが通ります。

原因分からなくて困っています。
よろしくお願いします。

591 名前:デフォルトの名無しさん :2005/09/05(月) 01:47:43
>>589
メンバ関数をコールバックに渡してっからだろ。

592 名前:デフォルトの名無しさん :2005/09/05(月) 01:51:22
>>589
ttp://sapporo.cool.ne.jp/tanomi/qanda/a014.html

593 名前:デフォルトの名無しさん :2005/09/05(月) 02:02:00
>>591-592
知らなかった・・・。完全に勉強不足でした。ありがとうございます。

594 名前:デフォルトの名無しさん :2005/09/05(月) 02:22:02
directx 9.0bってどこでインストール出来るんですか?

595 名前:デフォルトの名無しさん :2005/09/05(月) 02:29:58
>>594
なんで検索して自力で調べようとしないんですか?

596 名前:デフォルトの名無しさん :2005/09/05(月) 02:41:25
9.0bランタイムほんとに無いなw
デバッグするときどうするんだろ

597 名前:デフォルトの名無しさん :2005/09/05(月) 02:50:08
>>595
ケチ臭い事言ってんなよ
いちいち調べろとかわざわざ書き込むな
調べてもわからないから聞いてんだろコラ

598 名前:デフォルトの名無しさん :2005/09/05(月) 03:00:45
>>597
なら正しい検索の仕方から学んだ方が良いと思いますよ

599 名前:デフォルトの名無しさん :2005/09/05(月) 03:06:04
>>598
ほほう
ではその検索とやらの仕方はどーすんのよ?
ここは初心者スレだろ?

600 名前:デフォルトの名無しさん :2005/09/05(月) 03:09:35
日本サイトに無い場合は海外サイトね。
http://www.microsoft.com/downloads/details.aspx?FamilyID=bc7ddedd-af62-493d-8055-5e57bab71e1a&DisplayLang=en
んで、このGenuine Windows Validationってもう任意じゃなくて必須なのかしら。

601 名前:デフォルトの名無しさん :2005/09/05(月) 03:11:56
>>599
スレタイ読めますか?日本語の勉強からしたほうが良いかもしれませんよ。

602 名前:デフォルトの名無しさん :2005/09/05(月) 03:20:31
>>601
日本語から学べ?ハイワロスワロス


603 名前:デフォルトの名無しさん :2005/09/05(月) 03:22:37
そうやって逃げるような書き込みしか出来ないのですね。
まぁこの程度の事すら自力で調べられないようならプログラミングなんぞ無理でしょうけど。

604 名前:デフォルトの名無しさん :2005/09/05(月) 03:27:52
こんな夜中によく(r

605 名前:デフォルトの名無しさん :2005/09/05(月) 03:29:40
>>600
それSDKw
日本語サイトにもSDKやシンボルはあるよ

606 名前:デフォルトの名無しさん :2005/09/05(月) 03:36:42
サイト内検索でランタイムも見つかる。
ただ検索も満足に出来ない人に見つけられるかは知りませんが。

607 名前:デフォルトの名無しさん :2005/09/05(月) 03:38:36
ランタイムはダウンロードできない
試してみ?

608 名前:デフォルトの名無しさん :2005/09/05(月) 04:22:20
9.0cのランタイム入れれば9.0bも動くんじゃないの?
良くわかんないわね。

609 名前:デフォルトの名無しさん :2005/09/05(月) 04:48:25
そら動かなかったら大変なことになっとるがな

610 名前:デフォルトの名無しさん :2005/09/05(月) 04:49:11
香ばしい展開乙

611 名前:デフォルトの名無しさん :2005/09/05(月) 04:51:54
ランタイムは最新版だけ落とせるようにしてるんじゃないの?(よく知らないけど)
んで、仮にわざわざ9.0bの環境にしてデバッグしたいってことなら、
とりあえず初心者では無いわねw

612 名前:デフォルトの名無しさん :2005/09/05(月) 05:10:52
Developer Runtimeならあったけど何か違うの?
http://www.microsoft.com/downloads/details.aspx?familyid=c64e9f07-b562-4849-ad61-b2fc7fa55fd9&displaylang=en

613 名前:デフォルトの名無しさん :2005/09/05(月) 05:40:07
>>611
初心者ではないならなおさら見苦しいなwww

614 名前:589 :2005/09/05(月) 07:27:44
たびたび失礼します。XP、.NET です。
>>592 を参考に、コールバック関数を static で宣言しました。

class CDirectInput8
{
public:
 // (中略)
 static BOOL CALLBACK EnumDevicesBySemanticsCallback(
  LPCDIDEVICEINSTANCE lpddi, LPDIRECTINPUTDEVICE8 lpdid,
  DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef);
};

BOOL CALLBACK CDirectInput8::EnumDevicesBySemanticsCallback(
 LPCDIDEVICEINSTANCE lpddi, LPDIRECTINPUTDEVICE8 lpdid,
 DWORD dwFlags, DWORD dwRemaining, LPVOID pvRef)
{
 // (中略)
}

bool CDirectInput8::InitDInput(HWND hwndApp)
{
 // (中略)
 // デバイスへのアクションマッピング
 hr = m_pDInput->EnumDevicesBySemantics(
   NULL, &m_DIActionFormat, EnumDevicesBySemanticsCallback, (LPVOID)this, DIEDBSFL_ATTACHEDONLY);
}

615 名前:589 :2005/09/05(月) 07:28:37
こうしたところ、EnumDevicesBySemantics に失敗し、hr に E_INVALIDARG が返って来ました。

>DIERR_INVALIDPARAM
>無効なパラメータが、戻ってくる関数に渡されたか、オブジェクトがその関数を呼び出せる状態になかった。

どっちのエラーかも分からないのでなかなか解決しません。
お手を貸していただけないでしょうか。


616 名前:デフォルトの名無しさん :2005/09/05(月) 07:40:10
>>615
m_DIActionFormatが怪しいような。
アクションマッピング使ったことないから分からんけど。

617 名前:589 :2005/09/05(月) 07:56:43
>>616

// アクションマップの定義
int number_of_actions = sizeof(g_GameAction) / sizeof(g_GameAction[0]);
m_DIActionFormat.dwSize = sizeof(DIACTIONFORMAT);
m_DIActionFormat.dwActionSize = sizeof(DIACTION);
m_DIActionFormat.dwDataSize = number_of_actions * sizeof(DWORD);
m_DIActionFormat.dwNumActions = number_of_actions;
m_DIActionFormat.guidActionMap = g_AppGuid;
m_DIActionFormat.dwGenre = NULL;
m_DIActionFormat.rgoAction = g_GameAction;
m_DIActionFormat.dwBufferSize = 100;
m_DIActionFormat.lAxisMin = -1000;
m_DIActionFormat.lAxisMax = 1000;
lstrcpy(m_DIActionFormat.tszActionMap, "hoge");

こんな感じでした。

618 名前:デフォルトの名無しさん :2005/09/05(月) 08:31:31
ZeroMemoryでフィールドの初期化はしてある?
フィールドはそれ以外にもあるからそういうのが関係してるとか。
(あんまり関係ない気はするが一応やってみるのがいい)

ユーザー関数が呼ばれているかどうかはブレークポイントを関数内に設定してみ。
ブレークポイントで止まる前に落ちるなら、関数への設定パラメータのミスと考えるのが妥当かと。
まあINVALIDPARAMだし恐らくそうなんだろうけれど…

619 名前:589 :2005/09/05(月) 08:36:38
>>618
ZeroMemory を行っていなかったのでやってみました。
また、コールバック関数内にブレークポイントを設定してみましたが、そこは通らず、

 // (中略)
 // デバイスへのアクションマッピング
 hr = m_pDInput->EnumDevicesBySemantics(
   NULL, &m_DIActionFormat, EnumDevicesBySemanticsCallback, (LPVOID)this, DIEDBSFL_ATTACHEDONLY);
 if (FAILED(hr)) {
  /* ※ */
 }

※の行に設定してあるブレークポイントでストップしました。

620 名前:デフォルトの名無しさん :2005/09/05(月) 08:47:07
つーことは設定パラメータがおかしいんでは。

とりあえずリファレンスとかサンプル参考にしながら見てこう。
サンプルがあるなら、それと自分のコードの違いを見比べて、
怪しいと思ったところを修正するのが楽かな。

仕事行くのでこの辺で。

621 名前:デフォルトの名無しさん :2005/09/05(月) 13:56:24
だーめーだーわからん

622 名前:デフォルトの名無しさん :2005/09/05(月) 14:16:17
スプライトを左右反転させて表示するにはどうすればいいんんですか?

623 名前:デフォルトの名無しさん :2005/09/05(月) 14:24:42
>>622
[-1,0,0,0]
[0,1,0,0]
[0,0,1,0]
[0,0,0,1]
最初にこの行列をかける

624 名前:デフォルトの名無しさん :2005/09/05(月) 14:31:29
>>617
>>m_DIActionFormat.dwGenre = NULL;
NULLはだめみたいよ。他のを適当に代入。
あと、アクションマップは Program Files/Common Files/DirectX に
勝手に設定ファイル作ったりするので、個人的にお勧めできないわ。

625 名前:デフォルトの名無しさん :2005/09/05(月) 14:38:12
>>624
適当なものが無かったので、サンプルにあった DIVIRTUAL_SPACESIM を入れてみました。
が、ダメでした・・・。

マジですか
アクションマップだめですか。うーん。作り変えてみます。ありがとうございます。

626 名前:デフォルトの名無しさん :2005/09/05(月) 14:58:25
>>625
例えばDIBUTTON_FIGHTINGH_KICKを使うには
dwGenre = DIVIRTUAL_FIGHTING_HAND2HAND; になってる必要があるみたいね。
結局ややこしいからお勧めでき(ry

627 名前:デフォルトの名無しさん :2005/09/05(月) 17:46:45
よその質問スレッドで明快な答えをいただけなかったので
技術者の多いこちらで再度質問させてください。

なぜDirectXを使用したゲームはCPU使用率が100%(HTでは50%)になるのでしょう?

処理の重さに関係なく必ずCPU使用率が100%になります。
理由がわかるかたいませんでしょうか?

628 名前:デフォルトの名無しさん :2005/09/05(月) 17:58:51
技術者が多いかどうかは知らんが、別にすべてのソフトでCPU100%使うわけじゃないぞ。
PCのスペックが十分でFPSを固定してれば100にはならんし、
キーフレームアニメーション使ってて常時再描写してるんだったら100になるってだけだ。
例えばRigidChipsでもFPS固定して軽いモデル使えば50〜80くらいにはなる。

629 名前:デフォルトの名無しさん :2005/09/05(月) 18:02:33
そういえば同期待ちでCPU持っていくグラフィックボードがあったな

630 名前:デフォルトの名無しさん :2005/09/05(月) 18:11:27
>>627
CPUを100%使ってるからだろ。っていうか質問の前提がおかしい。ウザス

631 名前:デフォルトの名無しさん :2005/09/05(月) 18:18:33
>>627
CPUが100%になることを確認したソフトのリストと
PCのスペックを詳しく

632 名前:デフォルトの名無しさん :2005/09/05(月) 18:31:13
またビジーループ叩きかw
熱心なこった

633 名前:デフォルトの名無しさん :2005/09/05(月) 18:41:59
MSがあれだけ派手にビジーループ作るなって宣伝したらそりゃ叩かれるよ
プレゼン資料みただろ?w

634 名前:デフォルトの名無しさん :2005/09/05(月) 18:48:03
イニシャルDタイピングとかエロゲとか100%になりそうだよな。
ま、偏見だけど

635 名前:デフォルトの名無しさん :2005/09/05(月) 20:01:27
627です
叩いているとかいう以前に、なぜそうなのか疑問に思っただけです。

具体的なゲームタイトルとしては、RagnarokOnline Lineage2
Pangya ハンゲの3Dビリヤードなどなど

Direct3Dを使用するゲームは全般的にCPU使用率が100%になるようです

これというのはDirectXの仕様なのでしょうか?
それとも各ゲームのプログラム上の都合なのでしょうか?


>CPUを100%使ってるからだろ。っていうか質問の前提がおかしい。ウザス

画面を大幅に書き換えている状態でCPU使用率が100%になることはあり得るとしても
画面にほぼ動きがなく、処理もたいしたことをしていない状態でも
安定して100%状態を維持してます

※質問の要点は、なぜ軽い処理をしているときもCPU使用率が100%なのですか?という点です
わかりにくくてすみません


636 名前:デフォルトの名無しさん :2005/09/05(月) 20:07:10
>RagnarokOnline Lineage2 Pangya ハンゲの3Dビリヤード
チョソが書いた糞プログラムだけみて「全般的」とか言っちゃうのって
脳みそ腐ってんじゃないの?wwwww

637 名前:デフォルトの名無しさん :2005/09/05(月) 20:11:52
>画面にほぼ動きがなく、処理もたいしたことをしていない状態でも

お前プログラムしたことないだろ?
メッセージループ回してるだけでも、CPU100%食うんだよ。

638 名前:デフォルトの名無しさん :2005/09/05(月) 20:20:55
>>635
ちゃんとPresent( NULL, NULL, NULL, NULL )使ってるか?
あとSDKのサンプルも見て見ろ。
俺の環境だとSDKのサンプルを起動して更新をINTERVAL_DEFAULTにするとCPU使用率は100%にならない。

639 名前:デフォルトの名無しさん :2005/09/05(月) 20:21:45
>メッセージループ回してるだけでも、CPU100%食うんだよ。

食わねえだろボケ
おまえのInternetExplorerはアイドル中にもCPU100%食うのかよ


640 名前:デフォルトの名無しさん :2005/09/05(月) 20:27:32
>>639
アイドル中はGetMessage()で止まってるからループは回ってないぞ。

逆をいえば、GetMessage()ではなくPeekMessage()で溜まり具合をみつつ
ゲームのメインループを回してるとCPU100%になる。

641 名前:デフォルトの名無しさん :2005/09/05(月) 20:28:15
大雑把に言うと、
一般アプリはGetMessage関数でSleepされているが、
Direct3D系のアプリはPresentでSleepされている。
しかしドライバによってはPresentがSleepを使わず無限ループの場合があるらしい。
INTERVAL_DEFAULT(っつーかINTERVAL_ONE)でも100%になる原因みたい。


642 名前:デフォルトの名無しさん :2005/09/05(月) 20:44:12
>>641
>しかしドライバによってはPresentがSleepを使わず無限ループの場合があるらしい。
>INTERVAL_DEFAULT(っつーかINTERVAL_ONE)でも100%になる原因みたい。
ホントにその処理ってドライバ依存なのかぁ?
俺はSDKのサンプル以上のサポートはいらんと勝手に自分に結論付けたからどうでもいいけど。

643 名前:デフォルトの名無しさん :2005/09/05(月) 20:51:14
テメエでタイマーとGetRasterState見つつPresentで良いじゃない。

644 名前:デフォルトの名無しさん :2005/09/05(月) 21:26:32
>>627
DirectXを使っているかどうかは全く関係ない。
一般アプリケーションとゲームでは処理の仕方が違うだけ。

一般アプリケーションはユーザの入力に対して何か処理をするのが
中心だから、入力がないときは何もしていない。だからCPU使用率は低い。

ゲームの場合は、何も入力がないときでも常に進行していくのが普通なので、
CPU負荷は常に高め。
それでも大抵のゲームではCPU時間が余るが、余った時間を解放するか
どうかはプログラマーの考え方次第。
ただ、最近はノートPCの人も多いし、デスクトップでも消費電力が無視できなく
なってきたから、ベンチマーク目的以外では解放した方がいいが。

645 名前:デフォルトの名無しさん :2005/09/05(月) 22:19:33
>>644
CPU解放型のアプリってショボイの多いな。
結局、することなくて解放してるだけでさ。

646 名前:デフォルトの名無しさん :2005/09/05(月) 22:35:55
ノベルゲームとかが多いかな。
ファルコムなんかは100%だね。

647 名前:デフォルトの名無しさん :2005/09/05(月) 22:45:09
>>646
アリスソフトも100%だけど動作がいいぞ。

648 名前:デフォルトの名無しさん :2005/09/05(月) 22:55:10
>>647
うるせーエロゲマニア

649 名前:デフォルトの名無しさん :2005/09/05(月) 23:54:05
次のフレームまでの時間見て
Sleep使えば基本的にはいけるんだが
Sleepって実際はその時間で戻ってくるって保障されないんだっけ?

マイクロソフトがSetTimerとかSleepをもっとちゃんと作ってくれればなんとかなるのだがな

650 名前:デフォルトの名無しさん :2005/09/06(火) 00:08:14
Sleep(1)でも1tickくらいは平気で待たされている気がする。

651 名前:デフォルトの名無しさん :2005/09/06(火) 00:13:18
こないだのCEDECではQueryPerformanceCounter使えって話でてたな。
でもコスト高いから、たまに使う程度にしろとか。どーしろってんだ。
結局timeGetTimeかよ。

652 名前:デフォルトの名無しさん :2005/09/06(火) 00:23:58
>>651
それ、インテルのデュアルコアプロセッサでのマルチスレッド
の話の奴なら、意味が違うかと…

653 名前:デフォルトの名無しさん :2005/09/06(火) 01:14:30
GetRasterStateで状態監視するのって重くない?

654 名前:デフォルトの名無しさん :2005/09/06(火) 04:39:07
>>651
QueryPerformanceCounter使うと動かないっていう奴まだいるんだよなぁ

655 名前:デフォルトの名無しさん :2005/09/06(火) 05:23:12
>>651
最近は省電力とかでクロック数が動的に変化するCPU結構あるから
細かくフリーケンシー計らないと使い物にならない。 案外微妙。

656 名前:デフォルトの名無しさん :2005/09/06(火) 05:24:45
クロック変わったのを検地する方法(メッセージが飛んでくるとか)はないの?

657 名前:デフォルトの名無しさん :2005/09/06(火) 05:52:10
QueryPerformanceCounter=RDTSCなのか?

658 名前:デフォルトの名無しさん :2005/09/06(火) 08:20:16
>>654
え、マジで?
どういう環境で動かないんだろう。

659 名前:デフォルトの名無しさん :2005/09/06(火) 10:09:43
QueryPerformanceCounterってコスト高いんか。
CEDECでって、MSのセッション?

660 名前:デフォルトの名無しさん :2005/09/06(火) 11:39:33
PC97で高精度タイマの標準を提案していればこんなことにはならなかったのに。

661 名前:デフォルトの名無しさん :2005/09/06(火) 11:47:05
60fps で動かすときも SetTimer(0, 1, NULL) で呼んで
毎回 timeGetTime() でフレームを進めるかどうかをチェックしてる・・・
ダメなのかな?

662 名前:デフォルトの名無しさん :2005/09/06(火) 11:54:31
WM_TIMERの精度って50msとかじゃなかったっけ・・・

663 名前:デフォルトの名無しさん :2005/09/06(火) 11:59:49
WM_TIMERほど信用出来ないものはないな

664 名前:デフォルトの名無しさん :2005/09/06(火) 12:01:45
WM_TIMER は優先度が低いメッセージだから
ガンガン遅れるんじゃなかったっけか

665 名前:デフォルトの名無しさん :2005/09/06(火) 12:29:07
メッセージキューが空っぽに近い状態で IDLE に入ったら思い出したように出してくれる程度の精度
マウスで窓サイズの変更の真っ只中かだと、ぜんぜんやってこん

666 名前:デフォルトの名無しさん :2005/09/06(火) 12:50:10
>>660
普通に使う分には1msの精度で十分だから、あまり必要ないんじゃない?
時間に厳しい処理なんかは、WindowsXPはリアルタイムOSではない
という理由で実装されてないし。

QueryPerformanceCounterの精度なんて普通はプロファイリングにしか
必要ないよ。fpsの制御に使うのはオーバースペック。
リフレッシュレート75Hzや85Hzのモニタで60fpsの動画を再生したときの
最大の誤差を計算してみれば、1msの精度で十分だと分かるはず。

667 名前:デフォルトの名無しさん :2005/09/06(火) 13:06:43
進歩のない考え方だねえ

668 名前:デフォルトの名無しさん :2005/09/06(火) 14:04:46
もっと高精度のSleepがあればなぁ

669 名前:デフォルトの名無しさん :2005/09/06(火) 14:37:16
667は久多良木健

670 名前:デフォルトの名無しさん :2005/09/06(火) 19:43:17
ポリゴンを表示させると物体と背景との境界線のジャギが目立つのですが、
アンチエイリアス機能はDirectXにはないのでしょうか?

671 名前:デフォルトの名無しさん :2005/09/06(火) 19:50:18
>>670
ある

672 名前:デフォルトの名無しさん :2005/09/06(火) 20:06:12
低スペック志向をウリにする人が多いので
普通はアンチエリアスを無視しますよね。
全ハードで使える保障がないので先輩が怒りますし。

673 名前:670 :2005/09/06(火) 20:15:39
レスありがとうございます。
検索しても答えになるようなことが全く出てこないのでないものだと思っていましたが、
あるのならと思いあれこれ調べてたらやっとたどり着きましたorz
あまり実用的ではないからあえて触れていないのですね。


674 名前:デフォルトの名無しさん :2005/09/06(火) 20:15:47
>>671
どうすればよいのでしょうか?

675 名前:デフォルトの名無しさん :2005/09/06(火) 20:24:42
>>674
SetRenderStateで設定する。(たしか)

676 名前:デフォルトの名無しさん :2005/09/06(火) 20:27:05
D3DXMatrixMultiply関数の中身ってどうなっているのでしょうか?
調べても見つけられませんでした。

677 名前:670 :2005/09/06(火) 20:29:49
SetRenderStateはD3DRS_EDGEANTIALIASをTRUE
MultiSampleTypeはD3DMULTISAMPLE_9_SAMPLESを指定でフルシーンアンチエイリアス

678 名前:デフォルトの名無しさん :2005/09/06(火) 21:00:26
>>672
>全ハードで使える保障がないので先輩が怒りますし。
普通は使えるのかどうか調べるのだが
その先輩とやらは脳無しだから明日から下っ端扱いで構わない

679 名前:デフォルトの名無しさん :2005/09/06(火) 21:13:26
>先輩が怒りますし
この小学生みたいな台詞もどうかと思うぞ。

680 名前:デフォルトの名無しさん :2005/09/06(火) 21:36:19
>>677
ショックだと思うが、こころして聞いてくれ
D3DRS_EDGEANTIALIASはもうここにはいないんだ!!!

681 名前:デフォルトの名無しさん :2005/09/06(火) 22:39:00
あれこれ試してみましたが期待通りというか、実際に効果が出てるのか分からないうえに処理がクソ重くなりました。
ゲフォ5950Uだから問題は無いはずなんですが(´・ω・`)


682 名前:デフォルトの名無しさん :2005/09/06(火) 22:56:10
>>681
安心しろ俺の環境でもそうなるからw

683 名前:デフォルトの名無しさん :2005/09/06(火) 22:56:47
>>681
ちなみにRadeon9600Proね。

684 名前:デフォルトの名無しさん :2005/09/06(火) 22:59:43
んじゃよくFPSとかであるアンチエイリアス×○ とかは何なんだろ。

685 名前:デフォルトの名無しさん :2005/09/06(火) 23:06:58
>>684
いや、確実に効果はある。
たしかに淵は滑らかになってるけど、
ここまで速度を犠牲にしてまで、それにふさわしい効果があるかっていうと、
無いと言いきれる。そんなレベル。
こんなもんのスイッチいれるぐらいなら画面の更新頻度が多い方が絶対にうれしい。

686 名前:デフォルトの名無しさん :2005/09/06(火) 23:13:22
ごめん、間違えた
×アンチエイリアス×○ とかは何なんだろ。
○アンチエイリアス×○ とかはどうやってるんだろ。

687 名前:デフォルトの名無しさん :2005/09/06(火) 23:14:33
○×○×ややこしいな

688 名前:デフォルトの名無しさん :2005/09/06(火) 23:17:36
>>686
そんなのSetRenderStateに値を設定すればいいだろ!ウンコ!
何が聞きたいのかさっぱりわからないよ!ウンコ!

689 名前:676 :2005/09/07(水) 00:01:11
float *out = (float*)aOut;
float *mat0 = (float*)aMat0;
float *mat1 = (float*)aMat1;

for(int i=0;i<4;i++){
  for(int j=0;j<4;j++){
    for(int k=0;k<4;k++){
      out[i*4 + j] = mat0[k*4 + j] * mat1[i*4 + k];
    }
  }
}

こんな感じで頑張ってみました・・・
あってるでしょうか?

690 名前:デフォルトの名無しさん :2005/09/07(水) 00:06:02
液晶で解像度が同じだとかなり綺麗に感じると思うよ
解像度低くてスムージングかかってたり
CRTじゃあまり感じられないかもね

691 名前:マイク ◆yrBrqfF1Ew :2005/09/07(水) 00:39:16
>D3DXMatrixMultiply関数の中身ってどうなっているのでしょうか?

マトリックスの乗算公式をそのままコード化してるだけだろ

692 名前:デフォルトの名無しさん :2005/09/07(水) 00:50:45
D3DXはSSEとか使ってるから>>689より速いよ

693 名前:デフォルトの名無しさん :2005/09/07(水) 00:57:47
>>691
いや、それがどうだったけかなぁ・・・と。
なーんか、昔、DirectX5とか6の頃はヘルプにコードが載ってたような気がするんですけど
なーんだっけかなぁ・・・と、まあ、そんなところでした。

ところで・・・
まちがえますた・・・orz
float *out = (float*)aOut;
float *mat0 = (float*)aMat0;
float *mat1 = (float*)aMat1;

for(int i=0;i<4;i++){
  for(int j=0;j<4;j++){
    for(int k=0;k<4;k++){
      out[i*4 + j] += mat0[k*4 + j] * mat1[i*4 + k];
    }
  }
}


694 名前:デフォルトの名無しさん :2005/09/07(水) 00:58:27
>>692
いえ、それを使えない場面にあたっちまいまして・・・

695 名前:デフォルトの名無しさん :2005/09/07(水) 01:18:09
>>693
DX6のサンプルのd3dutils.cppより:

D3DMATRIX
MatrixMult(const D3DMATRIX & a, const D3DMATRIX & b)
{
  D3DMATRIX ret = ZeroMatrix();

  for (int i=0; i<4; i++) {
    for (int j=0; j<4; j++) {
      for (int k=0; k<4; k++) {
        ret(i, j) += a(k, j) * b(i, k);
      }
    }
  }
  return ret;
} // end MatrixMult

最初に出力行列を初期化しようね。

696 名前:デフォルトの名無しさん :2005/09/07(水) 06:05:12
DirectXはVC以外の開発環境でできますか?
希望する環境はEclipse+CDTですが可能でしょうか?

697 名前:デフォルトの名無しさん :2005/09/07(水) 07:15:13
>>695
ありがとうございます!

698 名前:デフォルトの名無しさん :2005/09/07(水) 12:03:22
Geforce256は1500万ポリゴン/秒ってあるのですが

12ポリゴンで構成されたメッシュを
900体以上表示させるとFPSの速度が落ちるのは
オレのプログラムが悪いからでしょうか?

699 名前:デフォルトの名無しさん :2005/09/07(水) 12:05:54
うn

700 名前:デフォルトの名無しさん :2005/09/07(水) 12:07:30
>>698
1回のDrawPrimitiveで1000頂点くらい描画しないと
その性能はでないよ。

701 名前:デフォルトの名無しさん :2005/09/07(水) 12:21:51
>>699
化ッ

>>700
なるほど そういうことですか。
for文が900回繰り返してるからかな?

702 名前:デフォルトの名無しさん :2005/09/07(水) 12:29:02
単純にDraw〜のみをループも使わず連続こぴぺで描画した場合だったりして

703 名前:デフォルトの名無しさん :2005/09/07(水) 13:22:06
パイプライン処理ってのを理解すればわかるよ

704 名前:698 :2005/09/07(水) 13:37:57
試しに28ポリゴンを900体
25200ポリゴン描画してみたら問題なしでした


熱でPCフリーズw

色々と、レス有難うございました。

705 名前:デフォルトの名無しさん :2005/09/07(水) 21:16:11
>>698
1ポリゴンあたりの面積も重要。

706 名前:デフォルトの名無しさん :2005/09/07(水) 21:22:28
テクスチャについて2つ質問があります。
 1つ目は四角形(三角2枚)のプリミティブに張るテクスチャを画像データの一部分を切り取っている場合、同一の画像を繰り返し描画することは可能かどうかです。
赤青 これで1枚の画像としたとき、
緑白  赤と青の部分だけ切り取って四角形のプリミティブに複数の縞模様をつける。
1枚の画像を全て使用するならアドレシングモードで設定できますが、DrawIndexedPrimitiveで200枚近く一括描画していますので、それぞれに専用のテクスチャを用意して設定していくのは非常に効率が悪いです。

 2つ目はポリゴンに張るテクスチャの作り方です。
地球のテクスチャ1つでも極の部分は赤道直下部分より伸びていて、球体に貼り付けると奇麗な地球に見えます。
こういうテクスチャを作るには、
適当にテクスチャを描く→ポリゴンに貼り付ける←<繰り返し>→テクスチャの描き直し
と言う風にしているのでしょうか。
それともポリゴンに直接模様等を描いてそれを画像データにするようなソフトでもあるのですか?

(長々と読みにくい文章ですみません)


707 名前:デフォルトの名無しさん :2005/09/07(水) 21:43:37
>>706
1.
その三角二枚のポリゴン頂点のUV値に、描画したいUV値を割り当てる方法でダメ?
仮に
赤青
緑白
で、赤と青を取り出したいなら、左上の頂点から時計回りにUV値(uv(n))は以下のようになる。
uv0 = {0.0f, 0.0f};
uv1 = {0.5f, 0.0f};
uv2 = {0.5f, 0.5f};
uv3 = {0.0f, 0.5f};
これを描画したい三角二枚のポリゴンの四隅の頂点に対して行えば良い。
いちいちuv値を計算するのがメンドクサイなら、あらかじめ表示したいテクスチャの区画を計算した
テーブルから値を引っ張ってくる。

2.
UVマッピング 球面
で検索をかけるといいかも。

708 名前:デフォルトの名無しさん :2005/09/07(水) 21:58:21
DirectX とは直接関係無いのですが、timeGetTime() の精度が 10ms しかないのは僕の環境だけでしょうか(´・ω・`)
う〜ん…… QueryPerformanceCounter を使うしかないのかなぁ……

709 名前:デフォルトの名無しさん :2005/09/07(水) 22:00:41
つtimeBeginPeriod(1);

710 名前:デフォルトの名無しさん :2005/09/07(水) 22:03:21
対にtimeEndPeriod(1);

711 名前:デフォルトの名無しさん :2005/09/07(水) 22:07:58
うぉ。即レスthx。さっそく試してみます orz

712 名前:706 :2005/09/07(水) 22:13:35
>>707
これだと赤しか表示されないような・・。
赤青
緑白 から赤と青を取り出し

赤青赤青赤青  
赤青赤青赤青
赤青赤青赤青
赤青赤青赤青 と表現したいのです。

赤青 のみの画像であれば、同じく
uv0 = {0.0f, 0.0f};
uv1 = {3.0f, 0.0f};  (V値は何でも問題ないですね)
uv2 = {3.0f, 4.0f};   にし、D3DTADDRESS_WARP等を
uv3 = {0.0f, 4.0f};    指定すれば複数の縞模様ができますが。


2番については検索の仕方が悪かったのか球体マッピングのやり方ばっかり出てきます。
実際球体ではなく白黒パトカーのテクスチャを作りたいのですが、
ボンネットの「く」の字の部分やドアの線が合ったテクスチャが作れなくて困っています。

713 名前:デフォルトの名無しさん :2005/09/07(水) 22:26:19
uv0 = {0.0f, 0.0f};
uv1 = {1.0f〜, 0.0f};
uv2 = {0.0f, 0.5f};
uv3 = {1.0f〜, 0.5f};

コレじゃだめなの?

714 名前:707 :2005/09/07(水) 22:27:52
>赤しか
すまんかった・・・OTL

>赤青 のみ
赤青で描画した四角形ポリゴンを目的の大きさになるまで複数並べるんじゃだめなんすか?


715 名前:706 :2005/09/07(水) 22:41:58
>>713
同一の色なら問題ないのですが、模様が描かれているので縦長に表示されてしまいます。
>>714
単純に縦横4倍ずつにすると16倍のプリミティブを描画しないといけないことになり、
試した結果かなり重くなりました。
1枚1枚テクスチャをセットしてラップテクスチャで描画をしたほうが若干ではありますが軽かったです。


716 名前:デフォルトの名無しさん :2005/09/07(水) 23:01:01
>>715
例題は何とか可能か知れないが
汎用ではないので、出来ないとするべきだろう。

717 名前:デフォルトの名無しさん :2005/09/07(水) 23:05:25
>>715
一括描画って、
for(******) {
dev->DrawIndexedPrimitiveUP(****);
}
って感じ?
これだと激しく遅い。

718 名前:698 :2005/09/07(水) 23:07:07
>>705
マジスカ

719 名前:デフォルトの名無しさん :2005/09/07(水) 23:10:20
なんつーか無理だと思ふ…

720 名前:706 :2005/09/07(水) 23:12:42
>>716
そうですか(´・ω・`)
>>717
dev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, (表示したい四角形の数)*4, 0, (表示したい四角形の数)*2);
だけです。


721 名前:706 :2005/09/07(水) 23:44:47
色々とレスありがとうございました。
1つ目の質問のほうは出来ないという結論で閉めておきます。
残る2つ目の質問なのですが皆さんはどういう風にテクスチャを作っているのでしょうか。
非常に単純なポリゴン+テクスチャを作ってみましたが、
ttp://vipquality.orz.hm/imageup/file/3946.jpg
見るも無残な姿に・・。
パトカーのように白黒ハッキリしているなら色に合わせて面を作っていけば出来なくもないですが、
ドアの枠線(境界線)などのように細かな模様を付けたい位置に調整するのが非常に困難です。
地球にしろ車にしろ人の顔にしろ1枚のテクスチャ画像に収まっていますが、
こういうのを作るにはどうすればいいのでしょうか?


722 名前:デフォルトの名無しさん :2005/09/08(木) 00:49:02
>>721
もしかして、テクスチャってどうやって作るの?って話してる?
ならこの本がオススメ。
http://www.amazon.co.jp/exec/obidos/ASIN/4881663488/
まあ、俺等の範囲じゃないけど。
知っておかないとカッコつかないしね。と思うなら買い。

まあ、掻い摘んでいうと、3Dモデル(左右対称だとする)を作ったら、
真正面から見た図、真横から見た図をウィンドウズのプリントスクリーンキーでとる。
で、とった図に色を塗ってそれをテクスチャにする。
で、モデリングソフトのUVマップの設定に平行投影っていう設定あるべ?
それで色をぬったテクスチャを真正面、真横からそれぞれ平行投影で貼り付ける。
って作業工程らしい・・・。

え?もしかして、そんなことが知りたいんじゃない?(笑)

723 名前:デフォルトの名無しさん :2005/09/08(木) 01:35:55
てかスレ違いだろ・・・

724 名前:706 :2005/09/08(木) 01:37:44
>>722
ありがとうございます。
そういうのが知りたかったのです。


725 名前:デフォルトの名無しさん :2005/09/08(木) 05:33:35
>>706
3Dモデルに直接描画できるソフトもあることにはある。

726 名前:デフォルトの名無しさん :2005/09/08(木) 05:43:30
今どき直接描画できないソフトはないと思うけど

727 名前:デフォルトの名無しさん :2005/09/08(木) 08:19:41
質問です。DirectX9のエフェクトファイルで作った頂点シェーダって
GeForceの3や4でハードウェアアクセラレーション効きますか?

728 名前:デフォルトの名無しさん :2005/09/08(木) 12:52:32
>>727
vs_1_1以下ならたぶん

729 名前:デフォルトの名無しさん :2005/09/08(木) 13:36:29
カメラがオブジェクトの周りをぐるぐる回るサンプルを作りたいです!!!

カメラ位置(Eye)に RotationX すると、回る事には回るのですが、ただオブジェクトが
回転しているようにしか見えませんでした。
そこで、注視点に同じように RotationX を掛けてみると望んだ結果に近い動きをするのですが、
うまく周りを回ってくれません。
どのような順序で演算すると、カメラがオブジェクトの周りをぐーるぐる回るのが作れますか?

730 名前:デフォルトの名無しさん :2005/09/08(木) 13:39:26
>>729
相対的な運動って意味わかるか?

731 名前:デフォルトの名無しさん :2005/09/08(木) 13:40:48
とりあえず二次元で図に描いて考えてみろ。

732 名前:デフォルトの名無しさん :2005/09/08(木) 14:03:01
>>729
>ただオブジェクトが回転しているようにしか見えません
これ以外になにがしたい?

733 名前:デフォルトの名無しさん :2005/09/08(木) 14:18:32
729=幼稚園児並みの立体感覚の持ち主

734 名前:デフォルトの名無しさん :2005/09/08(木) 14:31:25
自分がディスプレイをもってぐるぐる回るというのはどうだろう。

735 名前:デフォルトの名無しさん :2005/09/08(木) 14:54:58
>>734
そのまま80mくらい投げそうだ

736 名前:デフォルトの名無しさん :2005/09/08(木) 15:09:13
くるくる回せる液晶モニタとかいいわね。
>>729 vEye = vAt + α, αは自力で。

737 名前:デフォルトの名無しさん :2005/09/08(木) 15:27:04
>>729
吹いたw

738 名前:デフォルトの名無しさん :2005/09/08(木) 15:42:53
物体の背後に背景をつけるとか比較対象となる別の物体でも置いたらいいんでね

739 名前:デフォルトの名無しさん :2005/09/08(木) 15:55:06
質問です。XP、.NET です。

DirectSound を利用して、WAVE ファイルのストリーミング再生で BGM を流そうとしています。
方法と、スレッドを作成し、バッファの半分が演奏されたら Notify で通知し、もう半分を埋めるのを繰り返す、一般的な方法です。
が、プロジェクトの仕様上、BGM 切り替え時の遅延をできるだけ少なくしたいのです。

そこで、演奏する可能性のある BGM の数だけセカンダリバッファを作成し、全 BGM に対して、
WAVE をオープンすると同時にあらかじめ、ストリームバッファの半分だけバッファに BGM をロードし、
イベント通知用のスレッドを作成しようとしています。

が、こうすると、BGM の数だけのスレッドが待ち状態になり、効率が悪く思えます。
BGM の演奏開始時に、その BGM 用のスレッドを作成することも考えましたが、
スレッドの生成にどれだけ時間がかかるかが分かりません。

こういうときの定石みたいなものはありますでしょうか?
ゲームなどではよく出くわしそうな状況なので、「普通はこうする」みたいなのがあればと思って質問しました。
よろしくお願いします。


740 名前:デフォルトの名無しさん :2005/09/08(木) 16:32:48
>>739
1BGMに1スレッドにするから何本もスレッド作ることになるんでは。
俺は1スレッドで複数BGMを再生しているよ

741 名前:デフォルトの名無しさん :2005/09/08(木) 16:36:02
>>740
ああ、全くその通りでした・・・。ありがとうございます。

742 名前:デフォルトの名無しさん :2005/09/08(木) 17:53:38
質問です。XP、.NET です。
何度も申し訳ありません。

DirectSound を用いたストリーミング再生で BGM を演奏しているとき、
他の音を鳴らすと、BGM が飛ぶというバグが発生しています。
しばらくしたら元に戻るため、(1秒未満の間だけ、ずれた演奏ポイントで BGM が演奏される)
間違ったイベントが通知されているのではないかと考えていました。

調べてみたところ、同じ質問が各所であり、
DirectSound の有名なバグだという記述まで見つけたのですが、(真偽は分かりません)
詳細が調べられず、解決方法が分かりません。
質問が曖昧で申し訳ありませんが、もし本当に有名だとしたら、何かご存知の方、お願いします。


743 名前:デフォルトの名無しさん :2005/09/08(木) 18:14:19
イベントの発生が怪しいなら、イベントを使わない実装方法ならうまくいくかな。
すんごく原始的だけど、再生位置を常時チェックして、今どこを再生しているのか見る。
前回の再生ポイントから現在の再生ポイントまでを新しいバッファで埋める。
まあストリーミング再生なんて再生できれば十分なことだし、こんなんでいいかと

744 名前:デフォルトの名無しさん :2005/09/08(木) 18:17:35
.NET なら AudioVideoPlayback 使うとか。よく分からんが解決したりして

745 名前:デフォルトの名無しさん :2005/09/08(木) 18:52:10
>>742
前に自分で使ったとき、オンボードのサウンドチップで
バッファをハードの方に取るとおかしくなることがあったよ。

746 名前:デフォルトの名無しさん :2005/09/08(木) 18:59:59
>>745
試しに Play() に DSBPLAY_LOCSOFTWARE フラグを与え、
全てソフトウェアで再生してみたところ、通常に再生されました・・・。
何でだよおおおお

PCに高スペック要求してしまうかもしれないので、起動時にどちらで再生するかを選ばせるようにしてみます。
ありがとうございました。

>>744
AudioVideoPlayback についても調べてみます。ありがとうございました。

747 名前:742 :2005/09/08(木) 19:00:38
と、レス番号を名前に入れてませんでした、申し訳ないです。

748 名前:デフォルトの名無しさん :2005/09/09(金) 08:03:16
>>746
今時ハードウェアバッファ使う奴なんていないぞ。
余計にバス圧迫するからDX6の時点で打ち切りだ。

749 名前:デフォルトの名無しさん :2005/09/09(金) 16:38:25
やっとわかってきました。

注視点に RotationX を掛けたあと、オブジェクトをカメラ位置(Eye)から移動させて、
そしてから RotationX すると望んだ結果になりました。
てっきりオブジェクトを置いてからカメラで撮るような感じかと思ったんですが、
まずはカメラありき、、、なんですね。

そこで新たな疑問です!!!

一周ぐるりと回転させてるはずなのに、二個のオブジェクトがあるとなぜか二周?
ぐらい回ってしまいます。どちらかの RotationX を半分にするのかと思うんですが、
これはオブジェクトの個数が影響するんでしょうか?

750 名前:デフォルトの名無しさん :2005/09/09(金) 16:44:40
>>749
とりあえず君は基礎からやりなおしたほうがいいとおもう


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.