ゲームプログラミング相談室【Part5】
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
02/11/04 20:41ID:a1Mhmm8N扱う話題のダイナミックレンジはやや広め。包容力高め。
他の初心者質問スレとの棲み分けを探りつつ
これからもマターリと活用しておくれ。
■前スレ
【Part4】http://game.2ch.net/test/read.cgi/gamedev/1005040025/
■旧スレ(プログラム技術板)
【Part1】http://piza.2ch.net/tech/kako/969/969984472.html
【Part2】http://pc.2ch.net/tech/kako/985/985540361.html
【Part3】http://pc.2ch.net/tech/kako/1002/10028/1002894129.html
■関連スレなど
>>2-5
0015名前は開発中のものです。
02/11/08 21:41ID:???オブジェクトのローカル座標に、ローカル・ワールド変換行列、ワールド・ビュー
変換行列、ビュー・スクリーン変換行列(a.k.a 射影行列) と順にかけて、出てき
た座標を w で割れば良い。
行列だけど、DirectX 使ってるなら SetTransform() に
D3DTS_WORLD
D3DTS_VIEW
D3DTS_PROJECTION
という第一引数を指定して渡してるヤツ。
>>13
まぁ、サンプルコードを深く理解せずに copy & paste してるんでしょう。趣味
でプログラミングしてるなら、そういう態度もアリだとは思うよ。
0016名前は開発中のものです。
02/11/09 00:02ID:???gccって、vtblを.dataに吐いてたりしない?
0017名前は開発中のものです。
02/11/09 01:09ID:0QThSDojそーゆー奴ってさワールドからローカルへの変換ができねぇってことだろ?
動いてる物体にのれないのはもちろんのこと
スキニングも理解してできてねぇだろ?
逆行列はしっかり理解してから次のステップへいってもらいたいね。
俺も会社入るまえそうだっただけに応援したいね。
ローカルに直せるってだけでかなりできることが増えるね。
なにいってるかわかんなくなったね。
じゃあね
00188
02/11/09 01:16ID:???vtbl が配置されるセクションと、クラステンプレートの static 変数が配置される
セクションが違うと、何か問題がある? あと、今回の件に関しては STL のコン
テナが利用する allocator の話なんで、仮想関数は出てこないはず。
そもそも .sdata, .sbss に関しては、こういうことだと理解してるんだが、勘違い
があったら指摘して下さいな。
1. EE-core (っつーか MIPS) は 32bit 固定長命令を採用しており、アドレス
空間も 32bit ある。
2. したがって 1 命令で 32bit の任意のアドレスにアクセスすることはできない。
どうしてもアクセスしたければ
a) まず 16bit をレジスタの上位アドレスに読み込み
b) 次にオフセット付きメモリ参照命令を使って、メモリにアクセス
と 2 命令使う。
3. それだと効率が悪いので、汎用レジスタの一つ ($gp) をグローバルポインタ
として固定した値を入れて利用。static なデータは $gp から 16bit 相対で
アクセスできる範囲に入れておく。(これが .sdata と .sbss)
当然 16bit 相対でアクセスできる範囲は限られるから、そこから溢れたデータ
は効率悪くても 2 の方法でアクセスする必要がある。gcc は標準では 8byte
以下のデータは .sdata, .sbss セクションに、それ以上のデータは .data, .bss
セクションに格納する。この閾値は、必要に応じて -G オプションで変更できる。
00198
02/11/09 01:19ID:???そういうわけで gp がらみで問題になるのは
1. .sdata, .sbss が溢れるほど大量に static データを定義した場合
2. 翻訳単位によって、閾値が異なる場合。たとえば同一のグローバル変数を
参照するプログラムの片方を -G0 でコンパイル、他方を -G8 でコンパイル
とか。
3. $gp を書き換える場合。特に位置独立なコードを使うシェアードライブラリの
関数を呼ぶ場合。(ふつー Global Offset Table 用意して、$gp 書き換えた上
で関数を呼ぶスタブを作る)
といった場合。クラステンプレートの static 変数が関わるとは思えんのよ。
PS2 Linux だとなんの問題もなく動いたような気がするし。
002012
02/11/09 01:55ID:s6gdDMqCビュー行列 と 射影行列を掛けたものと、 3D座標を 掛けたの
ですが、でた xyzwで
x/w
y/w
z/w
をやってみたのですよ。
しかし、 値が1.0を超えているにもかかわらずスクリーンの端
にまで、 ラインが(この時二つの座標を線で結んでいました。)
届いてませんでした。
なので、 やり方が違うのかなとおもいまして・・・・
0021名前は開発中のものです。
02/11/09 01:58ID:???なんか微妙に日本語が変な気が。ありがちなのは行列をかける順番を
間違えてるとかだが。
> しかし、 値が1.0を超えているにもかかわらずスクリーンの端
> にまで、 ラインが(この時二つの座標を線で結んでいました。)
意味が良く分からん。
002212
02/11/09 02:14ID:s6gdDMqCすばやいレスありがとうございます。
2点をラインで描画しました。
ビュー行列 matView
射影行列 matProj
調べたい座標 Vec
計算後の値 v4
mat = matView * matProj
D3DXVec3Transform(&v4,Vec,mat);
Vecとmatを計算して求められた 値をwで割る
v4.x/v4.w
v4.y/v4.w
v4.z/v4.w
ここで スクリーン座標が求められるはずです。
スクリーン座標の値は xyに関しては -1〜1 zは 0〜1に なるはず
だけれど、 その値を超えたにもかかわらず そのラインは
画面の端まで届きませんでした。
mat = matProj* matView
でやってみても 値は変わりますが、 ラインが端まで届きません。
なので、計算の仕方が間違ってるのか、それか根本が間違っている
かどちらかだとおもうのです。
0023名前は開発中のものです。
02/11/09 03:22ID:gww9xFnI002412
02/11/09 03:44ID:s6gdDMqCすみません。 たしかに、 640,480のウインドウを値(1.0,1.0)に
する必要がありますが、 このビューポートを実際どのように
使えばいいのか。
002512
02/11/09 05:27ID:s6gdDMqCもとめられた値に windowのサイズの半分を掛けて
あげればよいのでしょうか?
640,480のウインドウなら320,240をそれぞれ掛けてあげる
x = x*320;
y = y*240;
それですと 一応それらしき値はでます。
0026名前は開発中のものです。
02/11/09 09:43ID:iuRz/9+A0027名前は開発中のものです。
02/11/09 14:55ID:9m0Zluol0028名前は開発中のものです。
02/11/09 14:59ID:???質問の仕方とか…ね。
0029名前は開発中のものです。
02/11/09 15:20ID:m4HooRjJ003012
02/11/09 17:41ID:s6gdDMqC>>ちゅーしんをあーわーせーろー。
中心ですか
どうやってあわせるのだろう・・・・・
視点と注視点から 角度を求めて それを 頂点に掛けて
あげるのでしょうか・・・
うーんでも、ビュー行列を掛けたときにすでに入っているような気も
しないでもないですね。
0031名前は開発中のものです。
02/11/09 21:43ID:???参考書でも読んで勉強したほうがいいと思うぞ。
0032名前は開発中のものです。
02/11/09 22:11ID:???試しに自力でライブラリ無しでポリゴン出してみなよ
ワイヤーフレームでいいからさ。いろいろ分かると思うよ
0033名前は開発中のものです。
02/11/10 00:18ID:laxcwGaC目的地をみさーだーめーていっちーょくせんでりろーんはそーれーかーら
かーんーがえーるーのがーすーきーだ。
ちーなーみーにーちゅうーしーんをもとーめるーとゆーんは、
たーすーだーけーだーよ?あ?
で、あーとーはーじぶーんでなーんとかしれー
0034名前は開発中のものです。
02/11/10 00:32ID:???誰なのかわかりますた ヽ(´ー` )ノ
初期化してないstatic class memberが
.bssに入らないで.dataセクションに
入っちゃうみたいだけど、それじゃない?
それが正しいのか間違ってるのかしらないけど。
http://chapuni.com/topics/psx/
でも、やっぱ -G0
003512
02/11/10 03:52ID:CLex+uUH私も とりあえず、足せば良いのかなと思いやってみたのですが
うまくいきませんでした。
>あーとーはーじぶーんでなーんとかしれー
いろいろご指導ありがとうございました。
いろいろ試して見たいと思います。
0036名前は開発中のものです。
02/11/10 07:26ID:???求まったxとyを使えば良いんじゃねーの?
その時、原点は画面中央、640×480の場合、xが0なら
画面中央320って事じゃないの?
…漏れの環境だとね。
zはカリングで使うじゃない?マイナスだとカメラの後ろに来てるって事。
0037名前は開発中のものです。
02/11/10 11:38ID:???static class menber でも、問題が出るものと出ないものがあります。
普通のクラスの static member object -> 問題なし
テンプレートクラスの static member object -> relocation truncated ... でリンク時エラー
普通のクラスとテンプレートクラスで異なる点は、nm で見た限りだとシンボルが
weak か否かという点。テンプレートクラスの static member は複数の翻訳単位
でインスタンス化される可能性があるけど、リンク後には実体を 1 つにせにゃな
らんので weak object になってる。
それで weak object + .sdata セクションという組み合わせが悪いのかと思ったの
だけど、違うのかなぁ。(これ以上は binutils のソース読まんと解決しないような
気がしてきた)
> でも、やっぱ -G0
らじゃ。
0038名前は開発中のものです。
02/11/10 17:12ID:X0lDMmpo>オブジェクトのワールド座標ににプロジェクション行列の逆行列をかけて
>求まったxとyを使えば良いんじゃねーの?
これですと 値が変動するときは プロジェクション行列が変わった時だけ
なのでうまくいかないと思います。
003936
02/11/10 19:10ID:???こっちの環境だと、独自クラスのカメラてのがあって
毎フレーム、視錐台の変更って感じでやっているから出切るんだわ。
0040前編
02/11/10 20:19ID:JSg4/5lDまず変換したいワールド座標にカメラの逆行列をかけます。
これはDIRECTXではGetTransなんとかでとれるあたいそのままです。
つぎにプロジェクションマトリクスをかけます。
これは大抵の環境で同じです。
それからビューポートの変換です。
これは640X480の場合は
0041後編
02/11/10 20:29ID:JSg4/5lDY=(Y/W)*-240+240
で終了です。
これはDIRECTXのヘルプにものっています。
ヘルプでビューポートで検索をかけるとみつかります。
これでできなかったら少し実際にものをだして動かしてみてはどうでしょうか?
004237
02/11/11 20:55ID:???.gnu.linkonce.s セクションのデータを $gp 相対でアクセスできそうなところに
配置しろ、ってことで。
(結局 gcc のソースを読む羽目になったよ……)
0043名前は開発中のものです。
02/11/12 00:59ID:???そんなんでgccのソース読む羽目になったの?
マップファイル見たらすぐわかりそうなのに。
0044名前は開発中のものです。
02/11/12 01:18ID:???それは「.gnu.linkonce.s セクションって何、どういう条件で作られるの?」っつー
のが、分からなかったから。推測はついたけど、裏をとらないと困るっしょ。
0045名前は開発中のものです。
02/11/12 01:35ID:???そこまで見たあんたに尋ねるが、ソノ環境で、vtblは何処に出てる?
.gnu.linkonce.d.vt とか、そんなんだと思う。
なんか、gccのデフォルトで、.dataの一部として吐かれるみたいなんだけど、
書き込み可能なセクションに吐く理由がわからなくて気になってるんだ・・・。
0046名前は開発中のものです。
02/11/12 21:24ID:???確かに .gnu.linkonce.d.__vt_なんちゃら セクションに書かれてる。
gcc/cp/class.c を読むと
#ifndef WRITABLE_VTABLE
TREE_READONLY (decl) = 1;
#endif
みたいな記述があるから .gnu.linkcode.r に配置されそうなもんだが。謎。
0047名前は開発中のものです。
02/11/13 00:43ID:???おお、そのマクロでしらべてみたら、なんかでてきたよ。
ありがとん。
で、デフォルトでそんなマクロは定義されないらしいのだが・・・。やはり謎。
0048あぼーん
NGNG0049名前は開発中のものです。
02/11/16 22:06ID:???| ここでおしまい |
|________|
∧∧ ||
( ゚д゚) ||
/ づΦ
0050名前は開発中のものです。
02/11/16 23:26ID:VL8Oafejはやまるなー
0051名前は開発中のものです。
02/11/21 03:03ID:277H+gCD0052名前は開発中のものです。
02/12/06 07:52ID:c2Ro9O0h0053あぼーん
NGNG0054名前は開発中のものです。
02/12/09 22:53ID:gy0Rwv2m丁度プロジェクトのハザマで暇なので
ツール作成でもしてみなさい、と上司に言われました。
イチから作成する根性もやる気もないのでとりあえず
VRAMを眺めるツールでも改造してみようかと思うんですが
どう改造したら勉強になるのか見当がつきません。
どうせ改造するならためになるほうがいいんだけど・・
ハードはGBAです、どなたかお知恵を。。
0055あぼーん
NGNG0056名前は開発中のものです。
02/12/10 09:19ID:JzMo+9Nzアイタタ
0057あぼーん
NGNG0058名前は開発中のものです。
02/12/23 20:03ID:CHDaAJj80059名前は開発中のものです。
02/12/23 22:42ID:frBmN/bA精妙なあたり判定を作りたいときは大小の四角を何個か組み合わせればいいのかな?
0060名前は開発中のものです。
02/12/23 22:45ID:mYrEUkS2具体的なビットマップだったり、矩形だったりするが
それはゲーム依存。
当たりを判定して、何に使うかというのもポイントだったりするので
そのへんもデザインしよう。
0061名前は開発中のものです。
02/12/23 22:57ID:frBmN/bA0062名前は開発中のものです。
02/12/23 23:53ID:OrL+tItn0063あぼーん
NGNG0064名前は開発中のものです。
02/12/25 01:36ID:06ow8SQ/ex・・・敵機X座標、ey・・・敵機Y座標、exa・・・敵機幅、eya・・・敵機Y幅
if ( (mx<ex+exa)&&(mx+mxa>ex)&&(my<ey+eya)&&(my+mya>ey) ) ...
シューティングのオーソドックス?な当たり判定はこんな感じのやり方しか
知らないんだけど他にはどんな方法がありますか?
ゲームやハードに依存しててもいいからいろんな判定の仕方が知りたいYO!
0065名前は開発中のものです。
02/12/25 02:21ID:fYJY+WkTcEnemy…敵管理クラス。
cEnemy* hitRect[40][30];
cEnemy* pHitList = hitRect[mx/16][my/16];
while(pHitList != NULL){
if( pHitList->IsHit(mx,my) ) printf("どっかーん");
pHitList = pHitList->GetNext();
}
0066名前は開発中のものです。
02/12/25 02:33ID:BLeCLBHq0067名前は開発中のものです。
02/12/25 02:44ID:e+neG+8zどちらにしろ定数にしておくべきだと思うが…。
0068名前は開発中のものです。
02/12/25 03:27ID:BLeCLBHq0069あぼーん
NGNG0070名前は開発中のものです。
02/12/25 07:56ID:dIcCINXPマジックナンバー使わんでくらはい(´д`;)
大きな判定の場合はどうするの?
複数のエリアに登録する?
0071名前は開発中のものです。
02/12/25 10:40ID:vBfJXHZb高速弾だとすり抜けが多発しそうだが、その辺は考慮に入れてあるのか?これ。
0072名前は開発中のものです。
02/12/25 10:48ID:Bqxu+V45たとえ弾幕系でも2Dシューティング程度の判定量で
んな小細工する必要皆無だと思うけど。
0073名前は開発中のものです。
02/12/25 11:18ID:ufF3sG4T1000個の弾との判定にかかるのは3万クロックだな。
60fpsで判定すると180万クロック。
1GHzのCPUなら0.2%で、2ミリ秒/秒だな。
安直にできそうなところはさっさとスルーしたほうがいいと思った。
0074あぼーん
NGNG0076名前は開発中のものです。
02/12/25 16:58ID:dIcCINXP計算量を、O(n^2)からO(nlog2n)までもっていけるらしい。
0077名前は開発中のものです。
02/12/25 19:40ID:RXUO2PKHまず何から作り始めると良いでしょうか?
0078名前は開発中のものです。
02/12/25 19:40ID:/cDNIeOU0079あぼーん
NGNG0080名前は開発中のものです。
02/12/25 21:16ID:ocB35uV6まずあなたがどこまでできてるのかがわからないことには・・・。
>>78
http://www.campus.ne.jp/~ishigami/CREATION/
ここの下のほうに解説ページがあるよ。
0082名前は開発中のものです。
02/12/25 21:37ID:Kq2zu9Npまずマップチップ(背景データの素材)を用意して
それを配置したマップデータを用意して
マップデータから1画面分のデータを読み込んでマップチップを貼り付けて
それをスクロールさせる(読み込み位置を変化)ところから。
グラフィック関係はBitblt関数でやってもいいしDirectX使ってもいいし。
素材が無いと気合入らない事もあるし・・・
2Dアクションって・・・シューティング以外の格闘系だったりする?・・・
0083名前は開発中のものです。
02/12/25 21:43ID:ocB35uV6マップ上にキャラクターの絵を置いて、キーボード操作によって
キャラの位置を動かすのをやってみるといいかも。
習作としてはシューティングが最適だったりするんだよね。
重力の概念とか考えなくていいし。
0084名前は開発中のものです。
02/12/25 21:45ID:C+V8gp8bどんな教科書だ?
008581
02/12/25 21:59ID:RXUO2PKHサラマンダみたいなやつの背景をうごかせるようになればいいのか。
CとDirectX、どっちが関数使いやすいですかねぇ。
>>84
C言語の本で確か「初めてのC」って名前でした。
0086あぼーん
NGNG0087名前は開発中のものです。
02/12/25 22:06ID:Kq2zu9NpCでDirectXを操作するのだよ。DirectXは言語じゃない。
0088名前は開発中のものです。
02/12/25 22:09ID:qyObx7qFうむ。
っつか素の ANSI C だとグラフィック関係を制御するライブラリ関数ないし。
0089名前は開発中のものです。
02/12/25 22:13ID:Kq2zu9NpC言語の関数でやってみてからDirectXに移行した方がいい。
グラフィックを扱う部分は大した量じゃないから後ですぐ移行出来る。
009085
02/12/25 22:15ID:RXUO2PKH勘違いしてました。
今手元にあるヴィジュアルCはグラフィック関係を制御できますか?
0091名前は開発中のものです。
02/12/25 22:26ID:Kq2zu9NpVC持ってるんならここのスクリプトを使えばいい。
ここの講座もためになる。
0092名前は開発中のものです。
02/12/25 22:40ID:qyObx7qF> C言語の関数でやってみてからDirectXに移行した方がいい。
要らぬ誤解を招かぬように「まずは Win32 API (GDI)」とでも言っておいた方が
良いと思われ。
標準 C ライブラリ関数には GUI 関係は全く既定ないから。(それどころか CUI
のスクリーン制御さえ既定ないわけだが)
> 今手元にあるヴィジュアルCはグラフィック関係を制御できますか?
もちろん。
Win32 API でプログラム組みたいなら、「プログラミング Windows」って本がバイ
ブル。分厚い本だが、懇切丁寧に書いてあるから読むのは難しくない。
0093名前は開発中のものです。
02/12/26 03:31ID:sowo2pdCWindows95 APIバイブル1も一冊あるとかなり便利。
ただ、ヘルプを読んでれば十分という話も。
0094あぼーん
NGNG0095名前は開発中のものです。
02/12/26 11:15ID:9T0jKzmaVC++ == MFC みたいな
0096名前は開発中のものです。
02/12/26 12:11ID:FD9iJ3tpC++は言語
0097名前は開発中のものです。
02/12/26 12:12ID:LkNUpvkb0098名前は開発中のものです。
02/12/26 13:16ID:u+QTkfIN0099あぼーん
NGNG010090
02/12/26 19:37ID:kDKABYvSVC++の使い方が分かりません。
0101名前は開発中のものです。
02/12/26 21:26ID:KKaDaCig0102名前は開発中のものです。
02/12/26 21:29ID:bqU4KP+U拡張機能多いからな。インラインアセンブラ, typeof, 可変引数を使える #define と
か便利。
話が変わるが、頂点ブレンディング。剛体変換を行う複数の行列 M1, M2, ... と、
頂点毎に重み w1, w2, ... を用意して
M = Σwi * Mi (ただし Σwi = 1)
で出した M を使うってのは分かるんだが、当然この M って剛体変換じゃない
よね。
頂点変換は良いとして、法線ベクトルの計算をどうしたものかと思ってるんだが、
o 法線ベクトルの算出も M を使う。
o ただし法線と M の積を求めた後で、出てきたベクトルをノルムが 1 になるよう
に正規化する。
で良いのかね。
0103100
02/12/26 22:09ID:kDKABYvSまずはVC++の使い方から調べます。
0104名前は開発中のものです。
02/12/26 23:04ID:hDb5j8vT0105103
02/12/26 23:14ID:kDKABYvSVC++を立ち上げて新規作成を選んでファイルのところに
C++ソースファイル
HTMLページ
SQLスクリプトファイル
とか色々あるのでどうすれば良いのか分からなくなってます。
0106名前は開発中のものです。
02/12/26 23:31ID:u+QTkfINヘルプに「チュートリアル」があるので、
まずはそれを一通りやってください。
0107名前は開発中のものです。
02/12/26 23:50ID:5pSEx7R5VCの本を買えばプロジェクトの作り方から実行方法までは迷うことはないです。
その金も惜しむなら、検索エンジンで
猫でもわかるプログラミング
で検索をかけてください。
0108名前は開発中のものです。
02/12/27 03:00ID:8wDhiAR8君はここじゃなくてプログラム板の初心者質問スレッドで
聞いたほうがいいよ。
0109あぼーん
NGNG0110105
02/12/27 10:18ID:CvRh/hw0がんばります。
0111名前は開発中のものです。
02/12/27 10:19ID:3lURIe+n「素人は数値や文章を打ち込む事をプログラムだと勘違いしている」
「数値や文章なんて、プログラムと切り離してエクセル等でササーっと打ち込めば済む事」
といった類の事を耳にしました。
テキストエディタのマクロを使う事くらいしか思いつかず、
どういやって切り離すのかまったくイメージ出来ません。教えてください。
あと、「そんな事はスクリプトを組んでスクリプトにやらせるべきで、逐一書くのなんて作業効率悪すぎ」
なんて事もどこかで読みましたが、ここで言うスクリプトって言うのは関数の事で合っていますか?
0112名前は開発中のものです。
02/12/27 10:27ID:USn1psUAいいえ。
0113名前は開発中のものです。
02/12/27 12:00ID:njWlRsrn遅レスだけど、
>if ( (mx<ex+exa)&&(mx+mxa>ex)&&(my<ey+eya)&&(my+mya>ey) )
こーやったほうが処理が稼げると思ふ。。。
if( mx > ex+exa ) goto HIT_CHECK_END;
if( mx+mxa < ex ) goto HIT_CHECK_END;
if( my > ey+eya ) goto HIT_CHECK_END;
if( my+mya < ey ) goto HIT_CHECK_END;
// 当たったヨ
アボーン;
HIT_CHECK_END:
// 当たらなかったヨ
ヤレヤレ;
0114名前は開発中のものです。
02/12/27 12:38ID:lBLepIDxコンパイルかけたら同じ出力になると思う。
0115あぼーん
NGNG■ このスレッドは過去ログ倉庫に格納されています