1人でゲームが作れるように修行します。2 (487レス)
1-

128
(1): 名前は開発中のものです。 [sage] 2010/11/13(土) 16:11:56 ID:V7u6UtpM(2/2) AAS
あ、座標系か。ゴメン
129
(1): SGGK ◆6pZCoAtaxk [sage] 2010/11/15(月) 06:53:14 ID:vSKd6IqB(1) AAS
>>127,128
127(1): 名前は開発中のものです。 [sage] 2010/11/13(土) 16:02:39 ID:V7u6UtpM(1/2) AAS
カメラの向きによるでしょ
X軸は右方向がプラスの方が確かに分かりやすいのでカメラの位置と向きは変えようと思います。
いろいろ理由があり作業が止まったりしていますが、まだ諦めてはいません。(仮眠しようとしたら朝になってしまったとか…)
今のモデルは、フィールドが511x341(何故この数字にしたか忘れてしまった…)でその中心が原点(0,0,0)、
カメラの位置は(0,340,340)でカメラの注視点が原点(0,0,0)になっています。
作業の前にやっぱり簡単な例を用意して自分で(手作業で)変換行列を考えてみるところまで
やってみた方がいいかもしれないと思い始めてきたので、その作業分だけ進捗が遅れる可能性ありです。
130: SGGK ◆6pZCoAtaxk [sage] 2010/11/16(火) 00:25:11 ID:MqJY7qc7(1) AAS
今日はエクセルで準備的な作図を途中まで進めて終了。
書いた図が結局役に立たずに時間を無駄にする可能性もあるけどやってみる。
131
(1): SGGK ◆6pZCoAtaxk [sage] 2010/12/13(月) 23:37:18 ID:X8dPGQWF(1) AAS
む…無駄になってしまった感じ。
図は書いてみたけど、座標変換について結局あまり理解出来てない事がわかった。
悩んだ結果、恥ずかしいほどに簡単な例を用意し、それを図にして考えてみた。
オブジェクト座標からワールド座標への変換はなんとなく分かったような気がしてきた。
カメラ座標への変換(ビュー変換?)については、オブジェクト座標からワールド座標への変換と同じやり方でたぶん出来るだろうということにして省略し、
今は透視変換について考えているところ。
132: SGGK ◆6pZCoAtaxk [sage] 2010/12/15(水) 00:31:39 ID:KxIpLRHt(1) AAS
やっぱりやめることにした。
わずか一日で目標変更…。
昨日の続きをやるとなれば、また数週間経過しそうでそれでいいのだろうかという不安が急に出てきた。
透視変換についても>108
108(1): SGGK ◆6pZCoAtaxk [sage] 2010/10/01(金) 00:18:19 ID:EHwgOhQ3(1) AAS
>>107
ありがとうございます。3Dを不勉強なので、ビルボードも知りませんでした。
フィールドを3Dで表示して選手を2Dにして遠くにいる選手の画像は2Dのライブラリ関数で縮小表示できれば3Dらしくなるのではと自分はいままで思っていて、
しかしその縮小比率をどのように計算すれば良いのかが悩みどころでしたが、ビルボード関係を調べて何ができるのか読んでみると、
厚みのない画像でも3D空間の物体扱いにできてカメラ関数があればフィールドと一緒に選手も3D視できそうな気がしてきたので作業が進んだら挑戦してみたいと思います。

今日はホームページで3D関係を巡回したのみ。
3D空間からPC上のゲーム画面への座標変換を行うには、いろいろな行列を何度か掛ける必要があるとか、座標系の種類の説明がいろいろ。
これを理解してプログラムを書けるようになるにはどう考えても数カ月から…いや下手すれば数年かかるんじゃないかと感じた。
しかし、一方で昨日のDXライブラリのサンプル 32.3Dアクション基本 のソースを見る限りでは、行列を何回も掛けているような処理の記述は見当たらない。(探し下手で自分が見つけられていないだけかもしれないが…)
もしかすると、3D空間内にモデルを配置してカメラ関数の引数をセットすれば3D視できるその中に既にそういった計算が見えないところで行われてるのかもしれない。(これが>>103氏、>>104氏の言っていた事かもしれない)
とりあえずなんだかわからない状態だけど、なんらかのモデルを用意して、それを読み込んで画面に表示することに挑戦してみたい。
の頃の自分よりは理解してるつもりなので、とりあえずプログラムに戻り、それでダメならまた別の方法を考えよう。
133: SGGK ◆6pZCoAtaxk [sage] 2010/12/21(火) 22:35:38 ID:Uo1lQ495(1) AAS
変換についてやっぱりやめないで最後まで調べてUpするに方針変更。(葛藤し過ぎ)
できなければ出来たところまでをUpするつもり。
仕事じゃないんだし…、もう少し調べてみても無駄にはならないはず…。
趣味なんだからあまり無駄とか気にしないようにしよう!

今日は>>119
119(5): 名前は開発中のものです。 [sage] 2010/10/31(日) 14:36:58 ID:Ha18eay7(1) AAS
ConvScreenPosToWorldPosのサンプル内でMV1CollCheck_Lineを使って
ポリゴン上のマウス座標を出してるっぽいのがあるよ
氏のアドバイスのテストプログラムの動きの問題について考えてた。
>>120
120(2): SGGK ◆6pZCoAtaxk [sage] 2010/11/01(月) 00:11:40 ID:IY/H8hBE(1) AAS
>>119
こ…、これは気付きませんでした。ありがとうございます。
試しにサンプルで使えそうな部分をコピーしてプログラムソースに貼り付けてまさかのコンパイル。
これではおそらくバグが山積みだろうと思ったら、予想外に通った。画像の文字の意味についてはまだ理解出来てません。
サンプルでは、スクリーン上のマウス座標から直線が延びているイメージで、ワールド座標内のポリゴンに当たったらそこが黄色になるという内容だろうと解釈。
マウスを左上に持っていくとフィールドの左上が黄色、右下にもっていくと右下が黄色、フィールド外だと変化なし。
とにかく反応していることが確かめられたので、このサンプルコードを自分がやろうとしていることを実現できるように
書き変えられるか考えてみようと思います。

参考画像をうp
外部リンク[html]:gamdev4.hp.infoseek.co.jp

もちろん>>116〜118についても継続するので、並行作業で行く予定。
でプログラムが動いていたのは間違いないけど、画面左上に表示される
マウスでポイントした点が画面中のポリゴンと交差したところの点座標や他の情報を
表示している画面の文字がどんどん重なっていき見えなくなる問題が出ていた。
自分のプログラムでは、ClsDrawScreen と ScreenFlip() の間にゲームの中身の処理を
書いてループするようにしなければならないんだけど、テストプログラム用に無駄な箇所を消したり、注釈化していたときに
間違えてClsDrawScreenの行を //ClsDrawScreen のように注釈行化してしまっていたのが原因だとわかる。
気付くのに3日以上かかった(汗;)
ちなみにDXライブラリではClsDrawScreenは今でも使えるけれど、
公式のリファレンスからは削除されていて、代わりにClearDrawScreen()になっているという事をその時知った。
134: SGGK ◆6pZCoAtaxk [sage] 2010/12/30(木) 01:05:04 ID:8R77hh/I(1) AAS
年末休みだからとはいえさすがにもう寝なくては…。
>>131のカメラ座標への変換がなんとなくやっと理解出来たような感じ。
次は透視変換に挑戦。
ライブラリが無ければ自分は何も出来ないんだから座標変換勉強しても時間の無駄じゃないのか?
…という迷いはあるけど、あともう少しなのでこのまま進めてみるつもり…orz
135: SGGK ◆6pZCoAtaxk [sage] 2010/12/30(木) 16:53:47 ID:4FkYuEBu(1) AAS
やっと出来た。
間違いや内容不足はあるかもしれないけど、>>129の11月15日頃からの作業がやっと終了…。
1ページ目は結局使わなかった図。
2ページ目以降の8枚が勉強メモ。

外部リンク:ux.getuploader.com

オブジェクト座標系からスクリーン座標系まで勉強.zip
という名前でUP。
136: 名前は開発中のものです。 [sage] 2011/01/01(土) 02:34:44 ID:iSY3aMmJ(1) AAS
P2_page001〜004を見た。

そもそも何をしたいのか読み取れなかったけれども、
最初の赤枠の大前提については、ボールの位置はワールド座標系で管理して、
必要に応じて選手目線の相対座標(オブジェクト座標)を求める方が簡単じゃないかな。
137: SGGK ◆6pZCoAtaxk [sage] 2011/01/01(土) 22:31:50 ID:85GGaF9K(1) AAS
見てくれてありがとうございます。

自分はDXライブラリが無ければ何もプログラムできないので、
プログラムに直接影響しない事を調べてもあまり意味が無いのではないかと思う一方で
座標変換には3D入門の基本のような印象を持っていたので、
もし出来るならちょっと調べてみたいと思ったのが原因で1か月以上経過してしまいました…。

赤枠については今見ると自分もそう思います。
ボールに一番近い選手を知りたいなら選手の座標とボールの座標を
フィールド基準の座標系(ワールド座標系)で表して単純に距離計算した方がよさそうです。

次にやろうとしていることは、選手のデータ作り。
ビルボードの関数で選手を表示するので、メタセコイアで板(面?)のモデルを作り
テクスチャ?を貼りつける作業。2次元のデータのときには選手のアニメパターンを1枚の画像にしていたけど、
今度はそれを切り出して面のモデルに張り付けた3Dデータを何枚か用意する必要があるので、
メタセコイアの使い方を思いだしているところ。(忘れるのがものすごく早いので我ながらつらいw)
138: SGGK ◆6pZCoAtaxk [sage] 2011/01/13(木) 23:49:01 ID:XHIcVK/b(1) AAS
データはなんとか用意出来た。32ドット四方の面に選手移動アニメの一コマを貼り、
左歩行に2枚、右歩行に2枚、赤選手と青選手があるから(2+2)x2=8個のテクスチャ付き面モデルを作成。
上と下の歩行描写は省くことにした。
テクスチャの貼り方はなんとか分かったけど、今まで使っていた16コマを1枚にしていた2Dデータから
1コマずつ切り出すのに手間取った。
EDGEというソフトを使ってみたが、マウスできちんと32x32で選べない。
なんとなく「edge グリッド表示」でネット検索してみると、「ツクールの素材を作る」という名前で以下がヒット。
外部リンク[htm]:tanktown.web.infoseek.co.jp
まさにこれが知りたかった事なので作業できた。
余談だけどEDGEは2009年で更新が止まってるようで、競合も多いだろうしフリーだから
モチベーションを保てずにつぶれたのかな?と思ったらなんとiPhoneに場所を移して活動してるらしい事がわかった。
才能ある人はいろいろ出来てうらやましいと思った。
139
(1): SGGK ◆6pZCoAtaxk [sage] 2011/01/17(月) 23:51:17 ID:Px2vRAS2(1) AAS
>>115
115(2): SGGK ◆6pZCoAtaxk [sage] 2010/10/10(日) 00:13:14 ID:U9No5w8c(1) AAS
今日は進捗なし…orz
毎日何か進捗のある状態に持っていくことの難しさを痛感。
とりあえず次にやろうとしているのは、マウスでフィールド上の一点を指定できるようにすること。
今まで書いてた2D平面版ではマウスカーソルの位置に選手が向かうようにしていたので同じ操作方法を使えるようにしたいのが理由。
2D版では、ゲーム画面(640X480)の左上角の座標がゲームのフィールド全体の座標でみたとき(WX、WY)という座標で、
マウスカーソルの画面での座標が(X、Y)としたとき、マウスカーソルのフィールド上での座標値は(WX+X、WY+Y)になる。
3Dでもこれに相当する処理をしたいけど、3Dになるとカメラの位置が立体的に変化するからどうすればよいか想像が付かない。
このスレで教わった用語からいもづる的に出てきた用語を駆使して、
「ビュー座標からワールド座標を算出」というそのままなキーワードで検索してみたらたくさん出てきた。
どうすれば出来るのかある程度調べたら、使えそうなライブラリ関数を探す予定。
ライブラリで出来なければ、何も出来ない自分なので…orz ←まぁ、これはあまり気にしないでこれからも行き詰まるまで頑張るつもり。
で言った
>とりあえず次にやろうとしているのは、マウスでフィールド上の一点を指定できるようにすること。
については、どうやら出来そうな感じ。

それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど、
テストプログラムでは、試したいDXライブラリの関数をメインループにそのまま書き込んだだけなので、
今までのクラスを使ったやり方に比べ単純な例で試して上手くいったと自分が思っているだけなのかもしれないので、
今度は、今までの2Dで動かしていたプログラムの中身を少しずつ3Dのライブラリ関数に置き換えて
動作を確認していき、これでうまくいくようならUPする予定。

フィールド上の一点を指定する方法については、
>>116
116(8): 名前は開発中のものです。 [sage] 2010/10/10(日) 07:27:55 ID:iMXoTcjW(1) AAS
一般的な方法としては、
・E=視点座標、つまりカメラの位置をあらわす位置ベクトル
・L=投影面における視点からマウスカーソルまでの半直線ベクトル
から、仮想空間内の任意の物体との交差判定、交差位置特定がきる。

Eは、普通、プログラム上で管理されている。

Lは、FOV(視野錘台)を自分で管理されているなら容易に計算できるが、
投影変換行列の逆行列を使っても計算できると思う(そういう便利な関数があるかもしれない)。
L = Mproj.inv x (mouseX,mouseY,1)T
  Mprij.inv = 投影変換行列の逆行列
 (mouseX,mouseY,1) = マウスの座標(正規化装置座標系、同次座標表現)

特に、フィールドのような単一平面との交点計算は、
・O=原点(フィールド面上にあること)
・N=フィールドの法線ベクトル(正規化ベクトル)
に対して、Eがフィールドの表面にあると限定した場合、
LとNの内積が0以上の場合、交差しない(マウスカーソルは天空を指している)

さもなければ、
・h= フィールド面からEまでの高さ((E-O)とNの内積)
から、
・t= -h/(LとNの内積)
を求めれば、目的とするフィールド上の点Fは、
・F= E+L*t
のような手順で計算できるはず。

あとは、(F-O)をフィールドの座標軸(X-O)(Y-O)で分解すれば、2次元座標に戻せる。

うろ覚えで書いているので細かい間違いがあるかも知れないが(違ってたら乞指摘)、
ゆっくりでいいんで、参考にしてもらえれば嬉しい。
頑張れ! 
氏の7行目の投影変換行列の逆行列を使う方法では、
自分の力不足のため投影変換行列を作れないので断念。
座標変換、結構勉強してみたつもりだけど、さすがに投影変換行列を作るのは無理だった。
ライブラリを作れる人はすごいと思った。
>>119氏のConvScreenPosToWorldPosのサンプル内を使う案については、可能であることを>>120で確認済。
>>124
124(2): 名前は開発中のものです。 [sage] 2010/11/11(木) 00:28:36 ID:Jw3X6bp+(1) AAS
>>116 の Lは、
GetMousePoint( &Mx, &My ) ;
ConvScreenPosToWorldPos( VGet( Mx, My, 0.0f ) ) - E ;
で求まるんじゃないだろうか。

そこで詰まったんじゃないの?
氏の案についても昨日テストプログラムで試した結果、可能であることがわかった。

これでやっと>>65に取り掛かる直前の状況になってきた感じ。(感謝!)
もしうっかりスルーしてしまった項目があった場合、指摘あれば対応します。
140
(1): SGGK ◆6pZCoAtaxk [sage] 2011/01/18(火) 23:06:54 ID:IAGIcn+p(1) AAS
いざソースを書き直そうとするもののどこから手を付ければ良いのか見当がつかない。(いまさら何を言ってるのかと思われそうだけど…)
今出てる問題は、今までのプログラムにベクトルが使えるようにするために追加したクラス、関数(ベクトル同士の加算、減算とか)が
既にDXライブラリに用意されていて、当然DXライブラリの方が関数の種類も多い。
かといって今まで書いた自分のベクトル用関数もソースのあちこちに散っているので、
これをいますぐDXライブラリの関数に置き換えるのは数カ月単位の時間を要するのは確実。

とりあえず、
自分の書いたクラスVector3 ←中身はx,y,zだけ
DXライブラリの構造体VECTOR ←中身は不明だけど、リファレンスを見てるとx,y,zが含まれているようだ。
の型を持つ変数同士を変換する事が出来れば、自分の書いた関数、DXライブラリの関数のどちらでも使えるのではないかと予想。

一応、以下のような感じで書いてみた。まだ書いただけなので使えるかどうかは今後の進捗次第。

//Vector3型変数をVECTOR型に変換する関数。
VECTOR Vector3_To_VECTOR(Vector3 a){
VECTOR result;
result.x = a.x;
result.y = a.y;
result.z = a.z;
return result;
}
//VECTOR型変数をVector3型に変換する関数。
Vector3 VECTOR_To_Vector3(VECTOR a){
Vector3 result;
result.x = a.x;
result.y = a.y;
result.z = a.z;
return result;
}
141: SGGK ◆6pZCoAtaxk [sage] 2011/01/19(水) 23:11:10 ID:VXY/IGc8(1) AAS
念の為もうひとつ確認しておこうと思い、テストプログラムでメインループの中に
Zキーを押したら選手のx座標を少しずつ増やしていく処理を追加してみた。
コンパイルして実行してみたら選手の絵がx方向に動いた。
3Dのビルボードの命令で描画した選手でもいままでの2D命令でやったとき同様に動く事が確認できた。

これで多少は安心してソースの書き直しに着手できる…と思う。
142: 名前は開発中のものです。 [sage] 2011/01/20(木) 00:55:56 ID:yl8ufdN1(1) AAS
C#囓った俺だったら、Vecrot3にToVECTOR()関数を追加するかな
Vector3 a;
VECTOR b = a.ToVECTOR();
って書けるようにする

普段はVector3を使って、必要に応じてVECTORを吐き出すというイメージ
VECTORからVector3への変換はしない、という仕様にした方が多分デバッグは楽になると思う
143: SGGK ◆6pZCoAtaxk [sage] 2011/01/20(木) 23:35:43 ID:hnrlJRek(1) AAS
アドバイス、ありがとうございます。
確かに変数の型はどちらかに統一しておいた方が良さそうなので注意します。
変数はVector3に統一し、DXライブラリの関数の引数と出力の型がVECTORだった場合には、
引数に関しては、Vector3型をVECTOR型に変換した値を入力して、
VECTOR型出力に関しては、そのつど出力のx,y,z値をVector3型変数に入力すれば、>>140で言った
VECTOR型変数をVector3型に変換する関数は使わなくて済むので、これでやってみます。

今日のプログラム修正は、データのロード部分のみ。少しずつ進めていく予定。
144: SGGK ◆6pZCoAtaxk [sage] 2011/02/09(水) 21:46:30 ID:iFm8dF3D(1) AAS
修正が思い通りに進まないので悩む。
また以前のようにクラス図の様な図を書いて整理してからソースを修正した方がいいのだろうかと思ったが、
エクセルで書こうとするととても時間が掛かるので、クラス図を書くためのフリーソフトが無いか探してみた。

UMLdraw フリー版とシェア版があり、フリーでは印刷できないので不可。
UMLmemo  フリー、印刷無し、ビットマップ出力ありだけど、書いたテキストの空白が改行マークで埋め尽くされて見づらいので不可。
astah* community 無償版、印刷あるけど大きさの調整不可、使い方が難しいので不可。

無理してastah* communityでクラス図もどきを途中まで書いてなんとなく思い始める。

「頑張ってプログラムソースを書き直した方がいいような気がする。」

この状況になるまで約2週間経過。無駄な事をしてしまったのかも・・・。

今は選手のデータ関係を修正中。
前スレ>>885で選手のデータを入力しやすくするために考えた関数を使わずに
テキストファイルからデータ(初期位置座標など)を読み込めるように出来ないか考えているところ。
14歳シリーズのC(VS2008編)に使えそうな例が載ってたので参考にしてみるつもり。
145
(1): SGGK ◆6pZCoAtaxk [sage] 2011/02/11(金) 22:55:49 ID:83OV5fAw(1) AAS
テキストファイルからの読み込みをやると言ってすぐ壁に突き当たる。
選手のポジション(FWなど)を列挙型定数にしているけど、これは読み込めないらしい。
全てのデータをテキストファイルから読み込む方法に変える必要はないと思うので、
これについては、選手のゲームスタート直後の座標だけをテキストから読み込めるようにすればいいかなと考えた。

選手のデータ関係の修正作業は途中だけど、ちょっと中止。(方針変更しすぎ・・・)

クラス図を途中まで書いたときに感じた事だけど、状態を表す定数の追加やそれを使った分岐が
ソースを見づらくしており、他にも理由がいろいろあって、このまま気になったところから直してコンパイルしてもたぶん地獄の修正作業になると思った。

全部直してからでないと修正途中でコンパイルしたところでバグしかでないぞと思っていたが、
最低限のファイルだけ残して、残りはとりあえずコンパイルの対象となるフォルダの外に場所を移しておき、
残したファイルだけでコンパイルし動作確認出来たら、移動したファイルをいくつか戻して修正して・・・を繰り返していけばよいのではと思った。

ということで、メインループ関係とフィールド画像関係だけ残して、
メインループ関係のソース内のフィールド以外(選手、ボールなど)に関する記述は//を付けてコメント化してコンパイルされないようにしてみる。

その状態でフィールドが画面に表示されるまでを目標にしてみる。
146: SGGK ◆6pZCoAtaxk [sage] 2011/02/14(月) 00:35:14 ID:hwQDV7I3(1) AAS
11,12,13日の3連休では無理だった。(作業時間もすごく短いので・・・)
エラーの数は、20個→8個→30個と変わり、結局増えてしまった。
ゲームのループとそこから呼び出す関数はそんなに変更ないけど、
そこから先は思った以上に作り直しに近い感じなってしまった。
まだ先だけど、状態管理の定数を使った分岐処理もできればメインループの外に出したい。

一つの値があったとして、その値が自作のVector3型だったり、
ある時はDXライブラリのVECTOR型だったりするため、変換の方向を
Vector3 → VECTOR のみにしてソースを直すつもりだったのが想像以上に難しそうで、
プログラムソースもほとんど書き直しに近い感じになりそうなので、
この際思い切ってVECTOR型に統一して、ベクトル関係演算用関数については、
自作ではなくDXライブラリの関数を使って書き直していくやり方にしてみる・・・に方向修正。
147: SGGK ◆6pZCoAtaxk [sage] 2011/02/15(火) 23:25:56 ID:mNvxRe1H(1) AAS
やっとフィールドの表示が出来た。
今まではソースを書きかえる時に元のソースの先頭に//を付けてコメント化して、
いざという時に前の状態に戻しやすくできるようにしていたけど、これをやめて
コメントを減らしてソースを見やすくするようにした。
戻りたいときにはバックアップのソースを見ればいいのだから。
バックアップはコンパイルした時に出来るファイルを含め全部保存していたが、
考えてみるとプログラムソース(ヘッダファイルとCPPファイル)だけを保存しておけばよかった。
数年やってて気付かなかった・・・。
148
(1): 名前は開発中のものです。 [sage] 2011/02/17(木) 01:19:58 ID:s7Rh9Whn(1) AAS
パージョン管理ツールを使うと躊躇なく修正できるよ
subversionがおすすめ
149: SGGK ◆6pZCoAtaxk [sage] 2011/02/18(金) 00:25:58 ID:0vaBqQnH(1) AAS
>>148
パージョン管理ツールの存在を知りませんでしたので勉強になりました。
「subversion ゲームプログラム」で検索してみるとかなり難しいツールのようです。
難しくてもインストールして触るところまではネットで調べて試してみようと思います。
ありがとうございました。

現在の進捗は、選手関係のファイルをコンパイル対象の場所に戻して、
>145でやりかけてた選手の初期化関係を修正中。
150
(1): 名前は開発中のものです。 [sage] 2011/02/24(木) 13:41:44.03 ID:UHwXurlZ(1) AAS
ふと、このスレのこと思い出して帰ってきたけど
まだSGGK氏が頑張っててちょっと感動した
151
(1): STG [sage] 2011/02/24(木) 23:36:06.07 ID:x+thpv+K(1) AAS
当分書き込んでないけど俺もいるぜー。3Dモデル全般の勉強でなかなか進まない
SGGK氏がんばってるなー
152: SGGK ◆6pZCoAtaxk [sage] 2011/02/25(金) 23:02:15.17 ID:uikGAaqm(1) AAS
>>150
思い出して戻ってきてくれる人がいる事に感動です!
まだまだ頑張ります!
>>151
お久しぶりです!
お互い目標目指して頑張っていきましょう〜!!
1-
あと 335 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.019s