- ベストアンサー
コンピュータグラフィックス(ゲームで)はどういうプログラム?
プレステのソフトは、C++で作られているとか。 ゲームでは、CGがふんだんに使われているものもあり、そういうのはどうやって表現されているのでしょうか? すでに録画されている動画の表示やテレビのアニメなんかは、分かるのですが。 詳しい方は、具体的に説明して頂けると嬉しいです。 特に、クラスがどこで分かれているのとか、何と何が必要なのかとか。 (可能性は無限大だと思いますが。 一応、Perl、PHPはそこそこ、JAVAは初歩の初歩の知識は。 あんま、意味がないかな。ほぼ素人と思って頂いてけっこうです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No.2のAEです。 あくまで判る範囲というか想像の範囲ですけども。 >キャラクターの細かい動きや、当たり判定もif文やループが使われているんですよね?大基本として。 3Dのグラフィックス一般で言えば、空間に点(x,y,z)があるとして、それを平行移動したり回転したりといった、最も基本的な処理は、sin()、cos()など数学ライブラリを使った行列計算の処理になります。一般的には「アフィン変換」と言いますが、3Dで物体を動かす場合はこれが基本になります。 ただ、これはDirectXやOpenGL等いわゆるグラフィクスライブラリ内部に持っていますので、角度を与えるだけでモデルの移動や回転は行われます。 ※DirectX対応とかOpenGL対応と言われているグラフィクスカード(=ビデオカード)では、この処理をハードウェアで行うため非常に高速な3Dの表示が可能になっています。 ゲームのキャラクタも基本的には、この処理をベースにしているはずです。 例えば、キャラクタの骨格(関節)の位置を座標値として保持しておいて、その座標値に「アフィン変換」を行えば3D空間上でキャラクタが動いていくことになります。 本当はもっともっと複雑で、キャラクタの関節同士は繋がっていて親子関係を持っているとか、水中と空中では重力の作用が変わるとか、そういったキャラクタの置かれている環境によって動く量や早さを加減しているんでしょう。 ※どして、そんなに早く動くの?といつも不思議。そういう早く、しかも「それらしく」動かすというところがノウハウ。 長くなってしまいましたが、こういった3Dのモデルを動かすにはやはり定石があって、それらの表現方法は各社のノウハウであって、やはり現場レベルにならないと判らないと思いますね。 ただ言えることは、質問者さんがおっしゃるように、当たり判定には、if分などがあるでしょうし、キャラクタを動かし続けるためにはループが必要だというの はその通りと思います。 キャラクタの細かい動きは、移動量や回転量をパターン化した情報を予め持っているんだと思います。 ドラクエでは、キャラクタの動きを2枚の画像を切り替えることによって表現していたというのは、ご指摘の通りですが、3Dではその画像(=スプライト)の変わりに座標値を沢山持っているんだと想像しています。 長くなりましたが、ご参考になれば幸いです。 PS:私もゲーム作りに挑戦したいなぁ・・。
その他の回答 (5)
- sha-girl
- ベストアンサー率52% (430/816)
ゲームメーカーに勤めています。 >どうやって表現されているのでしょうか? 3Dデータというのはどういう形で持っているかご存知ですか? まず「ポリゴン」というのを聞いたことがあると思います。 これは3Dデータの基本となる三角形で3つの頂点座標(x,y,z)を持っています。 3Dのキャラクタというのはこのポリゴンを多数使って表現されます。 データは3次元ですが、実際のディスプレイは2次元なわけですから この座標を2Dの座標(x,y)に変換する必要があります。 その辺りの計算式については、DirectXや3D演算の入門書等に書いてあるので 興味があるなら購入してみると良いでしょう。 ただこの変換計算は膨大な量になるので、現在は専用のハードが行います。 >特に、クラスがどこで分かれているのとか、何と何が必要なのかとか。 PS2やDirectXのライブラリはC++のクラスで提供されているわけではありません。 PS2の場合はCのライブラリとして提供されています。(DirectXの場合はcom) 今でもC++は使わずCとアセンブラのみで作られる場合も結構あります。 その辺は設計や好みの問題です。
お礼
うわぁ、ライブラリ(の正確な意味)も分からない素人だという事に気がつきました。(w いや、私の中で、クラス、サブルーチン、ライブラリーの区別があまりなくって。 いや、何となく、違うのは分かるんですが。(w それはさておき、DirectXや3D演算、ポリゴンのキーワードで調べてみようかと思います。感謝。
- PG_RankB
- ベストアンサー率40% (12/30)
ゲームソフトの大半は、CかC++、またはその混合(ハイブリッドなんて呼ばれたりする)で作られています。 プログラム言語で、"3Dモデルなり絵が、動いているように見えるよう、プログラムしている"に過ぎないので、まずクラスがどう分かれる。等と言った事は、極端な話、関係ありません。 組む人によって、違った設計になりますから。 凄い極論を言ってしまえば、別にmainの中に全てをダラダラと書いて、変数も全てグローバルで、一切クラスや関数、構造体やポインタを使わなくても、理論上はある程度までは作れてしまう。と言う事です。 実際そんな事したら、頭が混乱&とてつもなく非効率的で、到底組めないからこそ、整然と素早く組めるように、それら言語の機能があるわけで。 言語を理解した上で、ゲームを組む時には、ゲームを組む為の考え方を理解する必要があります。 ゲームの基本は、パラパラ漫画だと思って下さい。 簡単な2D(シューティングとでもしましょう)で説明すると、自キャラがいて、弾があって、敵がいます。 これ等は、全てが、基本的にウィンドウの左上座標を(0,0)として、各々座標を保持しています。 ※ちなみに、ゲームは基本的に、y座標は下方向が正 自キャラは、(100,300)にいて、弾は(50,20)にいて・・・ と言う具合です。 これ等座標の値を保持するのは、変数でも、配列でも、構造体のメンバでも、型さえ合ってれば構わない訳です。分かり易さや微細な速度差を考慮しなければ、ですが。 この座標の値に合わせて、DirectX等の、描画系関数で、指定した絵を表示します。 この流れをループさせ、1ループ毎に画面をクリアし、座標の値を更新し、もう一度描画。と言う流れを繰り返す事で、人間の目には、キャラ等のオブジェクトが動いているように見えます。 ゲームはおよそ、1/60秒に一度、画面が更新されますので。 3Dに関しても、基本的な部分は同じですが、座標がx,yでは無く、x,y,zの3つ必要になります。 2Dの場合、1キャラに対し、1枚の長方形の絵を貼り付ければ良いので、変数は左上のx,yと、そのサイズが分かれば足りますが、3Dは違います。 立方体のモデルを表すのにも、全頂点で8個分の保持領域が必要になりますね。(実際、少ない頂点で判別出来る工夫が施されていますが、ここでは割愛します。) この頂点に対して、テクスチャなりマテリアルで面を作る事で、立方体が出来上がります。 この立方体を動かそうと思ったら、8個全ての頂点を同時に動かさなければいけません。 頂点の位置を元に、絵などを貼り付けたテクスチャを面にしているのですから、頂点が1つだけ動いてしまっては、立方体の形が崩れるだけに終わってしまいます。 これを人間をモデルにする場合、曲線を表現するために、大量の頂点情報が必要になるのは分かると思います。 実際、色んな技術で、なるべく少ない頂点量で済むようにされてはいますが、それでも、毎回数百、数千の頂点情報を更新しなければいけません。 これで、腕の場所や足の場所等を、プログラムの機能(例えばクラスや構造体等)で上手く分類分けして、必要な時に必要な箇所の頂点座標のみを適切に更新し、画面をクリアして、更新した頂点座標をもとに、もう一度描画をする訳です。 時々挿入される、物凄くキレイなCG映像等は、それこそ、動画ファイルとしてグラフィッカの方が製作した物を、再生させているだけですが、ゲーム中で3Dモデル等が動いている時には、上記の様な方法で動いています。 その上で、どうやってより美しい曲線を見せるか。ポリゴンを減らすか。効率良くレンダリングするのか。自然に近い形でスキンするのか。等を、各企業が研究し、それぞれのノウハウを持ってやっています。
お礼
クラスの話しはすこし的はずれでしたね。 操作、グラフィック、ポリゴン、陰、データ等のクラスを予想したのですが、それこそ作った人のかってですね。 定石のようなものがあるのかな?と思ったのですが、それが公開されている訳もなく。 また、メーカーによってノウハウがあるのですね。 昔のファミコン時代の2Dのロールプレイングやシューティングは、想像しやすいのですが、3D・ポリゴンとなると敷居が高くなってしまって。 やはり、ただ歩くだけでもすごい数のクラスが展開されてるんですねー。参考になりました。
- parapara777
- ベストアンサー率16% (39/239)
2Dに関してあまり書かれていないので追加して 昔からスプライトと言う技術が使われています。
お礼
スプライトですかー。 グラフィックソフトのレイヤーみたいなものかなー。 ギャルゲーとかでよく使われているヤツかな。(w アニメーションの作成しやすくするソフトウェアもあるんですねー。 なるほど、感謝。
- Ancient_ENG
- ベストアンサー率61% (11/18)
こんにちは、AEと申します。 CGは基本的に2Dと3Dの2種類に分かれますよね。 ファイナルファンタジーやキングダムハーツなどは3D系、Tales系は2D系でしょうか。 3Dの場合は、基本的に細かい平面板=ポリゴン(三角板)でキャラクタの形状を作成して、そこに人間からモーションキャプチャによって取り込んだ動きのデータを当てはめることによって、モデルを動かしているものと思います。 3Dのモデルの動きにおいては、数学の知識が必要になります。また、仮想現実に近い動き(重力や光など)を表現するためには結構難しい処理が必要でしょう。 2Dは、アニメのように画像を切り替えることによって、動きを見せているというのが基本でしょう。 多分メーカ各社にノウハウがあって、自分たちで作ったライブラリや専用に提供されているツールを使ってソフトウェアを開発していると想像しています。 C++やDirectXなど、ローレベルな言語&グラフィックスライブラリからゲームのレベルまでソフトを作るのは、「できる」「できない」でいえば「できます」が、それはそれはとてつもないことだと思いますね。 私は仕事がら3Dに関しては理解可能なのですが、ゲームのキャラクタの細かい動きや当たり判定など、具体的なレベルに関しては残念ながら判りません。 ただ、ゲーム終了時に流れるスタッフロールをみていただければ判りますように、現在、コンシューマ向けに販売されているゲームソフトは、見た目以上に巨大なプロジェクトとして動いているなぁ、と理解しています。 参考URLをご覧ください。 こちらで基本的な3Dグラフィックスとゲームの考え方が紹介されています。 ほんとに参考程度ですが、がんばってくださいね!
お礼
2Dと3Dの違いよりは、私は操作できるか、そうでないかの方が興味あります。 特に、操作できる方。 オープニングムービーはどんなにきれいなCGでも、Mpegと素人では違いが分からなくって。 ファミコンのドラクエなんかは、移動は2コマくらいしか使ってなくて、まぁ、移動のたびに画像を交互させているのは、素人でも分かるのですが、最近のCGはどういう原理で動かしているのかが気になってしまって。 キャラクターの細かい動きや、当たり判定もif文やループが使われているんですよね?大基本として。 参考になりそうなHP、感謝です。
3DCG作成ソフトで作ったファイルをプログラムで動かすだけではないでしょうか? 一度DirectXプログラミングしてみるとよいと思いますよ
お礼
ビジュアル的なソフトを作りたいと思った事はないので、そちらの知識は皆無です。 本屋か図書館でパラパラめくってみようかと思います。 欲を言えば、3Dで作ったデータをどう動かしているのかが知りたかったのですが。感謝。
お礼
>DirectXやOpenGL等いわゆるグラフィクスライブラリ内部に持っていますので、角度を与えるだけでモデルの移動や回転は行われます。 何となく、疑問がとけた気がします。 とてつもなくすごい事をしているイメージだったのですが、グラフィックライブラリを使えば、角度を与えるだけで移動や回転はできるんですねー。 それでポリゴン化して、うまく動いているようにみせると。 さらにパターン化した情報をまとめて読み込めば、処理がスムーズに行えると。 なるほど、感謝です。 でも、私は3Dゲームまでは、作りたくはないです。 どちらかというと、データーベースの方が好き。(w