トップページgamedev
392コメント151KB

ゲームプログラミング相談室【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
0002名前は開発中のものです。02/11/04 20:42ID:???
■関連スレ
○【初心者歓迎】スレを立てる前にココで質問を【その3】
http://game.2ch.net/test/read.cgi/gamedev/1032814540/
○物凄い勢いで誰かが質問に答えるスレ@ゲ製板 4つめ
(※第3スレ後半〜第4スレ前半は一時的な紛争地域)
http://game.2ch.net/test/read.cgi/gamedev/1035601681/
○鬱だ氏のう DirectX  (DirectXに関する話題)
http://game.2ch.net/test/read.cgi/gamedev/1033920036/
0003名前は開発中のものです。02/11/04 20:49ID:???
age
0004あぼーんNGNG
あぼーん
0005名前は開発中のものです。02/11/04 22:41ID:???
乙彼〜
0006名前は開発中のものです。02/11/06 00:04ID:???
0007名前は開発中のものです。02/11/06 00:20ID:Hy1yMbKx
age
0008名前は開発中のものです。02/11/06 20:50ID:mrrgYg+p
某 MIPS 系のマシンで STL コンテナを使おうとすると、リンク時に "relocation
truncated"と怒られる。どうも template がらみでできる weak object の配置に
失敗してるみたいだけど、解決策知ってる人います?

(確かに MIPS だとグローバルポインタ相対でアクセスするから、配置する箇所に
よってはグローバル変数といえどアクセスできなくなるよな。ld に喰わせるスクリ
プトファイル書けばいいのか?)
0009名前は開発中のものです。02/11/07 01:44ID:???
>>8
ふつう -G0

ってコンパイラ何使ってるかくらい書けヨ!
0010エックサー02/11/07 19:03ID:O6dqrNtE
DirectX8使ってるんですけど、メッシュの頂点の、ディスプレイ上での座標を知るにはどうしたらいいんですか?
0011802/11/07 21:47ID:???
>>9
Thanks

> ってコンパイラ何使ってるかくらい書けヨ!
確かに。想像の通り gcc です。
0012名前は開発中のものです。02/11/08 13:56ID:mLnGgDjl
わたしも 3D座標をスクリーン座標に変換する方法が知りたいです。

 座標xyzをwで割るらしいのですが、xyzwの求め方がわかりません。
 xyzはただの3D座標なのでしょうか? それとも何かの行列を
 掛けたりしているのでしょうか?
 wはどこからでてくるのでしょうか?

 すみませんが 教えていただけませんか?
 
0013名前は開発中のものです。02/11/08 14:34ID:???
ビューと射影行列を掛けるだけ
DirectD3なりのレンダリングエンジンを使うにしても
描画前に行列をセットしていると思うが何が分からないのか分からん
0014802/11/08 21:31ID:???
STL の件だけど、要するに __malloc_alloc_oom_handler などの static 変数
が .sdata セクションに配置されるのが問題なんだね。

教えてもらった -G0 を使って「全部 .data セクションに置く」方法に加えて、
問題になってる変数に個別に __attribute__((section(".data"))) 指定する
方法でも動きました。

しかし、何で __malloc_alloc_oom_handler などのクラステンプレート中で
定義された static 変数に限って .sdata に配置できないのかは謎です。
.sdata や.sbss 使い切るほど static 変数定義してないんだけど。
0015名前は開発中のものです。02/11/08 21:41ID:???
>>12
オブジェクトのローカル座標に、ローカル・ワールド変換行列、ワールド・ビュー
変換行列、ビュー・スクリーン変換行列(a.k.a 射影行列) と順にかけて、出てき
た座標を w で割れば良い。

行列だけど、DirectX 使ってるなら SetTransform() に

D3DTS_WORLD
D3DTS_VIEW
D3DTS_PROJECTION

という第一引数を指定して渡してるヤツ。

>>13
まぁ、サンプルコードを深く理解せずに copy & paste してるんでしょう。趣味
でプログラミングしてるなら、そういう態度もアリだとは思うよ。
0016名前は開発中のものです。02/11/09 00:02ID:???
>>14
gccって、vtblを.dataに吐いてたりしない?
0017名前は開発中のものです。02/11/09 01:09ID:0QThSDoj
>>15
そーゆー奴ってさワールドからローカルへの変換ができねぇってことだろ?
動いてる物体にのれないのはもちろんのこと
スキニングも理解してできてねぇだろ?

逆行列はしっかり理解してから次のステップへいってもらいたいね。
俺も会社入るまえそうだっただけに応援したいね。
ローカルに直せるってだけでかなりできることが増えるね。
なにいってるかわかんなくなったね。
じゃあね
0018802/11/09 01:16ID:???
>>16
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 オプションで変更できる。
0019802/11/09 01:19ID:???
>>18 の続き

そういうわけで gp がらみで問題になるのは

1. .sdata, .sbss が溢れるほど大量に static データを定義した場合
2. 翻訳単位によって、閾値が異なる場合。たとえば同一のグローバル変数を
 参照するプログラムの片方を -G0 でコンパイル、他方を -G8 でコンパイル
 とか。
3. $gp を書き換える場合。特に位置独立なコードを使うシェアードライブラリの
 関数を呼ぶ場合。(ふつー Global Offset Table 用意して、$gp 書き換えた上
 で関数を呼ぶスタブを作る)

といった場合。クラステンプレートの static 変数が関わるとは思えんのよ。
PS2 Linux だとなんの問題もなく動いたような気がするし。
00201202/11/09 01:55ID:s6gdDMqC
>>15
ビュー行列 と 射影行列を掛けたものと、 3D座標を 掛けたの
ですが、でた xyzwで 
x/w
y/w
z/w
をやってみたのですよ。 
しかし、 値が1.0を超えているにもかかわらずスクリーンの端
にまで、 ラインが(この時二つの座標を線で結んでいました。)
届いてませんでした。

なので、 やり方が違うのかなとおもいまして・・・・
0021名前は開発中のものです。02/11/09 01:58ID:???
>>20
なんか微妙に日本語が変な気が。ありがちなのは行列をかける順番を
間違えてるとかだが。

> しかし、 値が1.0を超えているにもかかわらずスクリーンの端
> にまで、 ラインが(この時二つの座標を線で結んでいました。)
意味が良く分からん。
00221202/11/09 02:14ID:s6gdDMqC
>>21
すばやいレスありがとうございます。

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:gww9xFnI
ビューポートは考慮したーのーかーなーあーあーあーあ?
■ このスレッドは過去ログ倉庫に格納されています