1人でゲームが作れるように修行します。2 (487レス)
上下前次1-新
135: SGGK ◆6pZCoAtaxk [sage] 2010/12/30(木) 16:53:47 ID:4FkYuEBu(1) AAS
やっと出来た。
間違いや内容不足はあるかもしれないけど、>>129129(1): SGGK ◆6pZCoAtaxk [sage] 2010/11/15(月) 06:53:14 ID:vSKd6IqB(1) AAS
>>127,128
X軸は右方向がプラスの方が確かに分かりやすいのでカメラの位置と向きは変えようと思います。
いろいろ理由があり作業が止まったりしていますが、まだ諦めてはいません。(仮眠しようとしたら朝になってしまったとか…)
今のモデルは、フィールドが511x341(何故この数字にしたか忘れてしまった…)でその中心が原点(0,0,0)、
カメラの位置は(0,340,340)でカメラの注視点が原点(0,0,0)になっています。
作業の前にやっぱり簡単な例を用意して自分で(手作業で)変換行列を考えてみるところまで
やってみた方がいいかもしれないと思い始めてきたので、その作業分だけ進捗が遅れる可能性ありです。
の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
>>115115(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する予定。
フィールド上の一点を指定する方法については、
>>116116(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行目の投影変換行列の逆行列を使う方法では、
自分の力不足のため投影変換行列を作れないので断念。
座標変換、結構勉強してみたつもりだけど、さすがに投影変換行列を作るのは無理だった。
ライブラリを作れる人はすごいと思った。
>>119119(5): 名前は開発中のものです。 [sage] 2010/10/31(日) 14:36:58 ID:Ha18eay7(1) AAS
ConvScreenPosToWorldPosのサンプル内でMV1CollCheck_Lineを使って
ポリゴン上のマウス座標を出してるっぽいのがあるよ
氏のConvScreenPosToWorldPosのサンプル内を使う案については、可能であることを>>120で確認済。
>>124氏の案についても昨日テストプログラムで試した結果、可能であることがわかった。
これでやっと>>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
お久しぶりです!
お互い目標目指して頑張っていきましょう〜!!
153: SGGK ◆6pZCoAtaxk [sage] 2011/02/27(日) 00:13:37.96 ID:wy4sbNmV(1/3) AAS
subversionの件、自分には難しすぎた感じ・・・。
でも、インストールして触るところまではなんとか出来た。
subversionで検索するとapachをPCにインストールして色々と準備設定が必要らしく、
これの設定の意味が全くわからず断念しかける。apachはサーバーのプログラムらしい。
VisualSVN-Serverというのも出てきて試そうとしたらポートの設定を求める項目があり、
理解せずに設定してパソコンを壊してしまうと大変なので断念。
「subversion apadh無し」とか「subversion サーバー無し」で検索するが、自分に分かりそうなページはヒットしない。
2、3日諦めてて、ふと「subversion ローカル」でやってみた。
TortoiseSVNというのがあるらしい。これはサーバに対するクライアント?のソフトらしく(←自信無し)、
これ単体でも自分のPCでバージョン管理が出来るらしい。
とりあえずホームページを探してTortoiseSVN本体(種類がいくつかありどれにすればよいのか迷ったがなんとか見つけた。)と日本語化ツールをダウンロードしてインストールした。
あとは説明ホームページを探して、リポジトリの作成、バージョン管理したいファイルのあるフォルダをリポジトリにインポートして、実際の作業を行いたいフォルダへ
リポジトリの内容をSVNチェックアウトする。
そして作業が終わったらSVNコミットするとリポジトリで変更が反映されてバージョン管理される・・・ところまで理解(自信無し)。
154: SGGK ◆6pZCoAtaxk [sage] 2011/02/27(日) 20:58:42.55 ID:wy4sbNmV(2/3) AAS
しかし、このようなツールに即適応出来ないとなると、自分の目標である
オンライン3D対戦サッカーゲームの完成はいつになるのだろうかとふと思った。
バージョン管理ツールはサーバーに関する知識がある程度なければ操作の意味が理解できない感じ。
いまはこういうツールの存在を認識するに留め、出来る範囲で対応するしかなさそう・・・。
でも、ツールの難しさ→サーバーの勉強も早めに始める必要ありそう→急がないと10年頑張っても出来ないかもしれない
という危機感につながったので、とにかく諦めないようにしたい・・・。
155(3): SGGK ◆6pZCoAtaxk [sage] 2011/02/27(日) 22:11:45.89 ID:wy4sbNmV(3/3) AAS
ソースを修正していて思ったが、C++で書いたプログラムは保守性が良くて再利用性にも優れてるような事を
どこかで聞いた記憶があるけど、そうなっている感じがしない。
たぶん自分の書き方に問題があるので、この機会に少しでも変えてみようと思った。
1.クラスのメンバ変数をpublicにして直接読み書きしていた。(変数毎に関数を書くのが大変だし、いちいち関数を使っていたら、その分処理速度が遅くなるのではと思った。)
これを次のようにする。
privateのメンバ変数にして変数毎にget関数、set関数を作ってこの関数を経由してアクセスする方法にする。
そうすれば、例えば、座標系をx,y,zで管理していたのをVECTOR構造体に変更した場合でも
get関数、set関数の修正で済む場合もあるので、修正に有利だし、
get関数、set関数が書かれている場所を見れば、クラスのつながりも見えやすくなりそう。
2.get関数、set関数のような変数の取得、設定しかしない関数は行数が短いので、
定義をヘッダファイルに書いていたが、定義はすべてcppファイルにまとめて見やすくする。
それが出来ない例外もあった記憶があるけど、その場合は仕方ないのでヘッダファイルに書く。
3.変数の命名規則を考え、それに従った変数名を付ける。
但し、最低限の規則にしておき、不完全でもあまり気にしないようにする。
プログラムの修正が今より少しでもやりやすくなればいいのだから。
今考えてるのは、メンバ変数は単語の区切りだけ大文字にして書く。
メンバ関数も同じだけど、最初の文字だけは小文字にする。
そして、メンバ変数の先頭には、m_ を付ける。
メンバ変数で静的変数なら、ms_ を付ける。
メンバ変数でポインタなら、mp_ を付ける。
これでやってみる。
156(1): 名前は開発中のものです。 [sage] 2011/02/28(月) 22:34:38.63 ID:g0je8oOR(1) AAS
メンバ変数をクラス外から頻繁にアクセスしなければいけないというのなら、
クラスの設計自体を見直すべきかもしれないよ。
もちろんケースバイケースだけど。
157: SGGK ◆6pZCoAtaxk [sage] 2011/02/28(月) 22:47:24.76 ID:ard6obcB(1/2) AAS
今回のプログラム修正は前回と違って、warningが出ないようにしたい。(前回あまりにもたくさん出てきたので諦めてしまった。)
warning C4290: C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。
上記のwarningメッセージは、プログラムソースの例えば、void loadFiles()throw(int);と書いた行のような場所で多数出た。
エラー処理の命令でtry{この中でエラー出たら何かをthrowする。}catch(){左の()内とthrowされた値が同じ時に処理する内容をここに書く}というのがあって、
その最初の{}の中には関数を入れる事も出来て、その関数の中からエラー時にthrowすることも出来る。
つまり外に向けてthrow出来る関数を宣言するときにthrow(int);(注:この例ではthrowされる値の型はint型になる)を横に付けるらしい。
でも、VS2008では、この仕様をフォローしてないので、throwされる型は指定できない。
warning C4290: はそういう事を言っているらしい。
このwarningが出ないようにするには、
#pragma warning( disable : 4290 )
を書いてやればよいとの事。
たしかに出なくなった!
158: SGGK ◆6pZCoAtaxk [sage] 2011/02/28(月) 22:54:11.50 ID:ard6obcB(2/2) AAS
>>156
偶然同じ時間帯に書き込みしてた様です。指摘ありがとうございます。
今のプログラムはかなりごちゃごちゃして修正するたびに時間が掛かるようになってきたので、
もう少しクラス分けしてプログラムを見やすくしたいけど、どう分けるかは実はやってみないと分からないという状態ですが頑張ります!
159(1): 名前は開発中のものです。 [sage] 2011/03/01(火) 22:55:52.67 ID:Ux3/NF8u(1) AAS
なんか切磋琢磨な感じがいいね。
影ながら応援してます(`・ω・´)ノ
上下前次1-新書関写板覧索設栞歴
あと 328 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.013s