3Dでの処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kms

3Dでの処理について

#1

投稿記事 by kms » 15年前

質問させて頂きます。

現在、2DでRPGを作成しているのですが(DXライブラリ)、
キャラクターと背景に3D的な奥行きを持たせることは可能ですか?

x,y座標の他に、z座標を持たせたいのですが。。
平面上に見える画像データを、立体的に見せたいのです。

初めは、「キャラクターを4方向に歩かせる」をじっくり読んでいたのですが、
3Dで処理する場合、ピクセル単位で歩かせるのでしょうか?
(3Dの最小の単位が解らないので、、)

或いは、z座標で奥行きを作った場合でも、今度はキャラクターの向きを処理するのが、
難しくなりそうですが。。

ご意見をお伺いしたいです。

softya

Re:3Dでの処理について

#2

投稿記事 by softya » 15年前

結局のところSFC程度で良いのか、FF10などの本格的な3Dを望んでいるのかで話が変わります。
カメラアングルが固定なら2Dでも3D風に見せることも出来ます。
少なくともRPGは、2Dでも完成させるのが難しいものなので、高望みをすると挫折する可能性が高くなりますね。3Dのアクションの経験が無いと難しいかもです。

※3Dのピクセルと言う単位はありません。
3Dはメーターとか距離の単位しかありませんので、メーター数とピクセル数を一致させることは出来ます。
10cm毎に1ピクセルとにして、歩く単位を10cm基準すれば良いだけです。
ただ、3Dマップデータを作るのは大変難易度が高いので、2Dの安易さで考えていると痛い目を見ます。

kms

Re:3Dでの処理について

#3

投稿記事 by kms » 15年前

お返事ありがとうございます。

一度、「龍神録プログラミングの館」で3D背景の技法を見、
ソースを拝見したのですが、これは難しいですね。
ただ、これをRPG風に作成したなら、面白いのではないか、と思ったのです。
カメラアングルは固定で、キャラクターがx,z座標を動き回る、というものです。

FF10のようなRPGは望んではいません。
一昔前のポリゴンで描かれたような、簡易なサンプルプログラムを作れたらな、
という願望ですね。

「龍神録プログラミングの館」の3Dの項目の背景を、
キャラクターに置き換えた感じです。

softya

Re:3Dでの処理について

#4

投稿記事 by softya » 15年前

>カメラアングルは固定で、キャラクターがx,z座標を動き回る、というものです。
これはウィザードリィやダンジョンマスター風のイメージでしょうか?
※ 古いのでゲームの名前が分からないかも知れませんので動画サイトを紹介します。

古典タイプ
http://www.youtube.com/watch?v=0yPI9LMK ... re=related
http://www.youtube.com/watch?v=g3UdUWU4j1Y

完全3Dタイプ
http://www.youtube.com/watch?v=LI93iXQTAc4
http://www.youtube.com/watch?v=W5qo7yhfXkk

古典タイプは難易度はさほどでもありませんが、完全3Dだと難易度は高いです。
どちらでしょうか?

PS1の「クライムクラッカーズ」ですが、この程度でも難易度は高いですよ。
http://www.youtube.com/watch?v=dLrvfJmKu4w

kms

Re:3Dでの処理について

#5

投稿記事 by kms » 15年前

>これはウィザードリィやダンジョンマスター風のイメージでしょうか?

いえ、主観視点ではなく、客観的視点(俯瞰視点)です。
シューティングゲームで例えるならば、
FPSではなく、
TPS(サードパーソン・シューティングゲーム Third Person Shooting Game)
ですね。

まず、3Dの背景があり、そのなかをキャラクターが歩き回る感じなのですが。。
カメラは、キャラクターや背景を俯瞰しています。

簡潔にいえば、ただの3DRPGになってしまうのでしょうか。

例えば、一昔前に発売したRPG。
http://www.youtube.com/watch?v=fjLcrWCi ... re=related

これほどの完成度、とはいかなくても、
ドット絵で描かれたキャラクターが、3Dのダンジョンを探索する、
そんなイメージなのですが。。。

伺ったところ、ウィザードリィでも難易度が高いということなので、
上記のようなRPGは、技術的には不可能なのでしょうか?

softya

Re:3Dでの処理について

#6

投稿記事 by softya » 15年前

俯瞰視点ですね。
>上記のようなRPGは、技術的には不可能なのでしょうか?

龍神録の背景3Dの仕組みが理解出来るのなら作成可能そうですね。
キャラクタは2Dのまま(板ポリゴン)で出来るでしょう。
なんにしても、3Dの基本的な仕組みの理解が必須ですよ。

それとマップエディタは既存のものが使えないので、自前で作る必要ありです。
ちなみに、XZ平面を歩く必要が無くてXY平面を歩かせた方がイメージ的に後々楽になります。

kms

Re:3Dでの処理について

#7

投稿記事 by kms » 15年前

お返事、ありがとうございます。

>3Dの基本的な仕組みの理解が必須ですよ。

3Dの知識に関しては、「龍神録プログラミングの館」を熟読し、
自分でソースを書いていったほうが近道でしょうか?

一時、なんでも良いので、ドット絵のキャラクターが、
X,Y,Z座標を行き来するようなプログラムを書こうと思い、
龍神録のサンプルプログラムにキャラクターの画像と、X,Y,Z座標を加えた、
簡易なソースを追加したのですが、
キャラクターが画面内で拡大、縮小するだけでした(-Z,+Z等)。

やはり歩行に応じてキャラクターの向きを変えたり、
3Dの背景を俯瞰するカメラ視点を設置する方法などは、
書籍等を買うか、2Dから発展させた形で学ぶ方が良いのでしょうか?

何分、3Dの基本的な仕組み、というのがまだ馴染んでいませんので。。

softya

Re:3Dでの処理について

#8

投稿記事 by softya » 15年前

>3Dの知識に関しては、「龍神録プログラミングの館」を熟読し、
>自分でソースを書いていったほうが近道でしょうか?

何らかの本で3Dの勉強をした方が良いでしょうね。
行列、逆行列など使いこなせないと3D空間にスプライト平面キャラクタを違和感なく立たせる事自体が出来ませんしね。

例えばこんな本。「実例で学ぶゲーム3D数学」
http://www.amazon.co.jp/dp/4873113776/
あたりを読む必要があるかと。

>キャラクターが画面内で拡大、縮小するだけでした(-Z,+Z等)。
3Dのカメラと空間座標の概念が分かっていないとそうなると思います。
概念は、こんな感じです。↓
http://sorceryforce.com/xna/tips_abouttransform3d.html

>やはり歩行に応じてキャラクターの向きを変えたり、
>3Dの背景を俯瞰するカメラ視点を設置する方法などは、
>書籍等を買うか、2Dから発展させた形で学ぶ方が良いのでしょうか?

プログラムして色々試すのは良いことだと思います。

幾つか質問があるのですが、
(1)2D空間でマップ背景にスプライトを使ったものは作れますか?
(2)2D空間でマップ背景を回転させることは出来ますか?
※ 自キャラは画面の真ん中で上を向いたままとします。左右のキーでマップ自体を回転させます。
※ 回転しつつも、移動の当たり判定はちゃんとすること。
最低限これを作れないと3Dは無理だと思います。

kms

Re:3Dでの処理について

#9

投稿記事 by kms » 15年前

お返事ありがとうございます。

紹介して下さった書籍やホームページ、拝見しました。
「座標変換」という単語すら知りませんでした。。

3Dのサンプルソースを最近、意識して書いたり、見たりしているのですが、
一番解らないのは、3Dの、最低限記述するソースコードです。
どこから、どこまで2Dを応用し、どこからどこまでが3Dなのか。
或いは、座標変換をどこで行っているのか? です。

>幾つか質問があるのですが、
>(1)2D空間でマップ背景にスプライトを使ったものは作れますか?
>(2)2D空間でマップ背景を回転させることは出来ますか?

正直、難しいです。やはり3Dを作るのは無理なのでしょうか。
とりあえず、2Dと並行して、ちょっとしたサンプルから手を出そうと思っていたのですが。。

softya

Re:3Dでの処理について

#10

投稿記事 by softya » 15年前

>3Dのサンプルソースを最近、意識して書いたり、見たりしているのですが、
>一番解らないのは、3Dの、最低限記述するソースコードです。

DXライブラリのは、かなり簡単に記述出来ますよ。
3D背景を作ってみようなんて、かなり簡単に記述できています。

>どこから、どこまで2Dを応用し、どこからどこまでが3Dなのか。

DrawPolygon3Dを使っている限り3D空間ですよ。
カメラ関数とライト関数の使い方は覚えましょう。
これが出来ないとPS1レベルのポリゴン表示もおぼつきません。

>或いは、座標変換をどこで行っているのか? です。

DrawPolygon3Dで登録すれば自動的に行なってくれます。
何処でどうなっているかは知識が増えてからで良いでしょう。

>正直、難しいです。やはり3Dを作るのは無理なのでしょうか。
>とりあえず、2Dと並行して、ちょっとしたサンプルから手を出そうと思っていたのですが。。

座標変換の概念は理解して欲しいですね。
基礎技術力のレベルを上げないと3Dでは混乱するだけです。
一歩づつ基礎を固めて下さいね。

kms

Re:3Dでの処理について

#11

投稿記事 by kms » 15年前

ありがとうございます。

softya様の助言通り、精進します。

現在は、3Dに関する数学、物理学の勉強をしています。

僕は応用が苦手なのですが、
3DRPGに於いて、よく用いられる数学や物理学(公式や概念)は何なのでしょうか?
また、どういった場合に、どういった式や概念を必要とするのでしょうか?
そこが少し気になっています。 画像

softya

Re:3Dでの処理について

#12

投稿記事 by softya » 15年前

>3DRPGに於いて、よく用いられる数学や物理学(公式や概念)は何なのでしょうか?

格闘・アクションゲームで無い限り物理学は特にないですね。
光学的な知識が必要ですけどね。
http://ja.wikipedia.org/wiki/%E5%85%89%E5%AD%A6

数学は、「実例で学ぶゲーム3D数学」に出てくる物は基本的に必要だと思って下さい。
格闘・アクションゲームになると当たり判定で更に別の数学が必要になりますが、RPGなら必要ないでしょう。

>また、どういった場合に、どういった式や概念を必要とするのでしょうか?

移動データはベクトルで持ち、座標変換には行列です。
ワールド座標系、ローカル座標系、回転移動、平行移動、カメラの透視変換(カメラの画角)全てが行列演算で求められますので、理解出来ていないと思うように動かせません。

>僕は応用が苦手なのですが、
2Dの座標の回転変換の方法も分からないみたいですが、これは高校の数学の教科書にも出てくるレベルです。
まず、自在に2Dマップを回転させてみてはどうでしょうか?

kms

Re:3Dでの処理について

#13

投稿記事 by kms » 15年前

お返事、大変遅くなり申し訳ありません。。

>まず、自在に2Dマップを回転させてみてはどうでしょうか?

はい。二次元の回転ということで、下記の行列を用意しました。
X'    cos, -sin, 0,  X
Y' =  sin,  cos, 0,  Y
1     0,    0,   1,  1
(見にくくてすみません)。
これを二次元の回転ということで、
元の座標から90度回転させたいのですが、
下記の構造体からどう反映させていけば良いか悩んでいます。
typedef struct Matrix{
    float temp;
    float result;
}Matrix;
Matrix index[3][3];

    index[0][0].temp = cos;
    index[1][1].temp = cos;
    index[2][2].temp = 1;

    index[0][1].temp = -1 * sin;
    index[1][0].temp = sin;

    return result;
回転させたい2Dマップは、添付したサンプルプログラムです。
不適切な質問でしたら、削除お願い致します。 画像

softya

Re:3Dでの処理について

#14

投稿記事 by softya » 15年前

とりあえず見て思ったのは、マトリックス構造体で配列にした方がすっきりしますね。
typedef struct Matrix2D{
 float m[3][3];
}
Matrix2D temp;
あとはプログラムに成っていませんので、何処が分からないんでしょうか?
私としては座標と角度を引数として持つ座標変換関数で良いと思うのですが。
戻り値も構造体で、座標を返します。

kms

Re:3Dでの処理について

#15

投稿記事 by kms » 15年前

お返事ありがとうございます。

>あとはプログラムに成っていませんので、何処が分からないんでしょうか?

・どのように計算式を記述したら良いのかがわからない、故にプログラムになっていない感じです。。
上記の行列に従って、配列に数値やcos,sinを代入したものの、
その後の記述がなんとも漠然としており、
どうしたら良いのかが解りません。

自分としては、2Dマップを90°回転させたいのですが、
後に続く関数?計算式?が解らないのです。。

例えば、元の座標を計算式に代入し、結果、90°マップを回転させたいのです。
簡潔に述べますと、2次元の行列による、
マップの回転のソースコードの記述の仕方が解りません。。

>座標変換関数

座標変換関数とは、具体的にどういったものなのでしょうか? 画像

softya

Re:3Dでの処理について

#16

投稿記事 by softya » 15年前

>座標変換関数とは、具体的にどういったものなのでしょうか?
言葉足らずでしたね。
座標変換関数を作れば良いって意味です。

>上記の行列に従って、配列に数値やcos,sinを代入したものの、
角度の無いsinやcosはありませんよ。
sin,cos関数の使い方は理解されていますか?

>その後の記述がなんとも漠然としており、
>どうしたら良いのかが解りません。

行列の計算方法は分かりますか?
まず、そこが分からないと話になりません。
X'と Y'を求める式を書いてみて下さい。

kms

Re:3Dでの処理について

#17

投稿記事 by kms » 15年前

>sin,cos関数の使い方は理解されていますか?

僕が読んだ限りなのですが、

[度で表した角 × (π/180) = ラジアンで表した角]

なので、sinの90°のラジアンを求める場合、

sin(90*π(3.14159)/180)でしょうか?

同様に、cosは、

cos(90*π(3.14159)/180)でしょうか?

>X'と Y'を求める式を書いてみて下さい。

[x', y'] = [x , y] + [dx , dy]、でしょうか?

softya

Re:3Dでの処理について

#18

投稿記事 by softya » 15年前

sinとcosは大丈夫ですね。

でも、
>[x', y'] = [x , y] + [dx , dy]、でしょうか?
は行列の演算では無いですよ。
dx,dyなんて突然出現してますよ。
自分で書かれた行列式の計算ですよ?

kms

Re:3Dでの処理について

#19

投稿記事 by kms » 15年前

>自分で書かれた行列式の計算ですよ?
X'    cos, -sin, 0,  X
Y' =  sin,  cos, 0,  Y
1     0,    0,   1,  1
を前提とした場合、
90°回転させるのであるから、
X'    cos90, -sin90, 0,  X     0, -1, 0,  X
Y' =  sin90,  cos90, 0,  Y  =  1,  0, 0,  Y
1         0,      0, 1,  1     0,  0, 1,  1
すみません。。ここまでしか理解できていません。
後は、二次元の物体を90°回転させる為、頂点を上記の式に代入し、
新しい位置の座標を求めることぐらいしか。。

なのでこれをどうC言語のソースに置換したらいいのか、わからないのです。。
何故、90°が1になるのかも。。
申し訳ないです。。 画像

softya

Re:3Dでの処理について

#20

投稿記事 by softya » 15年前

>なのでこれをどうC言語のソースに置換したらいいのか、わからないのです。。
>申し訳ないです。。

いえ、ソースプログラム以前に数学として行列式を理解出来ている必要があります。
数学として理解して始めてプログラムに出来るわけで、ソースコードはまだ早いです。

行列式がまったく分かりませんか?
これとか回答できます?
http://www.geisya.or.jp/~mwm48961/kou2/matrix2.html
高校の教科書を見直してみて下さい。
※ 年齢が分からないので、まだだったら、ごめんなさい。

kms

Re:3Dでの処理について

#21

投稿記事 by kms » 15年前

>行列式がまったく分かりませんか?

まったく、ではないのですが、
行列の足し算と引き算なら出来ますね。。
掛け算はちょっと法則性を見いだすのに時間がかかります。

2×2型の行列の掛け算は、
a00 a01
行列A=  a10 a11


          b00 b01
行列B= b10 b11

          (a00 b00 + a01 b10)  (a00 b01 + a01 b11)
A+B= (a10 b00 + a11 b10)  (a10 b01 + a11 b11)

という公式を覚えているところです。

高校時代は、諸事情あり勉学にあまり触れていなかったですね。。

softya

Re:3Dでの処理について

#22

投稿記事 by softya » 15年前

こっちを見逃していましね。
>何故、90°が1になるのかも。。

ここらへんを読んで貰うと分かるかな。
http://www8.plala.or.jp/ap2/suugaku/san ... shoho.html

2×2型の積が分かるなら2x2と2x1の積もわかりますよね。
a00 a01
行列A=  a10 a11

          b0
行列B= b1
これが分かるなら
3x3と3x1の積に発展させるだけです。

kms

Re:3Dでの処理について

#23

投稿記事 by kms » 15年前

>2×2型の積が分かるなら2x2と2x1の積もわかりますよね。
A+B= (a00 + b0)  (a01 + b1)
          (a10 + b0)  (a11 + b1)
でしょうか?

>3x3と3x1の積に発展させるだけです。

しかし、これら行列の計算を、どうゲームに応用するのでしょうか?

softya

Re:3Dでの処理について

#24

投稿記事 by softya » 15年前

A+B= (a00 + b0)  (a01 + b1)
          (a10 + b0)  (a11 + b1)
ちがいます。積と和の関係が逆になっています。

>しかし、これら行列の計算を、どうゲームに応用するのでしょうか?
例えば四角形があったとして、4つの頂点の座標をこの行列式で回転移動させれば回転後の頂点位置が分かりすよね?
その頂点を結んだ線を書けば回転する四角形が書けることになります。マップも四角形の集まりですので、四角形の回転がうまく操つれれば、マップ全体をぐるぐる回転する事も出来るわけなんです。
ただし、今の行列式を単純に使っただけではマップの回転は色々と問題が出てきます。
そこを自分で苦労しもらうことで座標変換の概念を理解して欲しいですね。

kms

Re:3Dでの処理について

#25

投稿記事 by kms » 15年前

>積と和の関係が逆になっています。

すみません。まだ理解していないようです。
この問題だけ、正しい解答を教えては頂けませんか?

>ただし、今の行列式を単純に使っただけではマップの回転は色々と問題が出てきます。
>そこを自分で苦労しもらうことで座標変換の概念を理解して欲しいですね。

ありがとうございます。
明日、書籍を購入して勉強します。
座標変換にここまで悩むとは正直思ってもみませんでしたので、
なんとか自力で理解してみようと思います。

softya

Re:3Dでの処理について

#26

投稿記事 by softya » 15年前

>すみません。まだ理解していないようです。
>この問題だけ、正しい解答を教えては頂けませんか?

まず、2x2と2x1の積は2x1の行列になります。
それとこの問題は積ですので
A*B= a00*b0 + a01*b1
         a10*b0 + a11*b1
となります。

こちらも参考にして下さい。1x2の行列との積ですので混乱する可能性もありますが。
http://www.c3.club.kyutech.ac.jp/gamewi ... A%D1%B4%B9

conio

Re:3Dでの処理について

#27

投稿記事 by conio » 15年前

>>>何故、90°が1になるのかも。。
「90°が1になる」のではなく、「sin90°が1」になります。

公式もあるのですが、丸暗記せずに

---------------------------------------------------------
【1】単位円を書く (半径1の円)
【2】任意の角度に点を打つ
【3】cosは、その点のX座標を、sinは、その点のY座標を見る
---------------------------------------------------------
このようにやれば分かると思います。

例えば90°だと、単位円の真上の部分になります。
ここはY座標 = 1、X座標 = 0 となるので、
---------
cos = 0
sin = 1
---------
となります。

同じように0°の場合は、
---------
cos = 1
sin = 0
---------
となります。


あと45°、60°、30°の場合は、任意の角度の点から
円の中心に向かう線とX軸に直交する線を引き、直角三角形を描いて
---------------------
sin は 側辺/斜辺
cos は 底辺/斜辺
---------------------
を計算すればOKです。 画像

kms

Re:3Dでの処理について

#28

投稿記事 by kms » 15年前

softya様、conio様、お返事ありがとうございます。

>こちらも参考にして下さい。1x2の行列との積ですので混乱する可能性もありますが。

このようなサイト様があったのですね。
非常にわかりやすく解説されていて、読んでいて唸ってしまいました。
一読ではまだ頭に入りきらないので、何度も読んでみますね。
問題は、行列の計算ですね。。
行列に特化した計算書等、あれば良いのですが。。

>公式もあるのですが、丸暗記せずに
>---------------------------------------------------------
>【1】単位円を書く (半径1の円)
>【2】任意の角度に点を打つ
>【3】cosは、その点のX座標を、sinは、その点のY座標を見る
>---------------------------------------------------------
>このようにやれば分かると思います。

ありがとうございます。
これは判りやすいですね。
なるほど、sin90°が1になる理由が解りました。
やっと、回転行列に記述されている1と0の意味が理解できました。
ご丁寧な解説、本当に助かります。。

とりあえず、行列式、ですね。。

Ma

Re:3Dでの処理について

#29

投稿記事 by Ma » 15年前

DXライブラリの最新版を使用すると仮定します。

現在、3DでRPG系のゲームを作っている方を知っていますが、彼はソースを公開しています。

私が思うには楽しむ程度で3Dゲームを作るというならば、皆さんが言っているような行列の計算などの学力は
ほぼ必要ありません。
ただ、本格的に3Dを作る場合は別ですが。。。

最近のDXライブラリはかなり簡単に3Dゲームを作れます。
三角関数と内積、外積、ベクトルを使えれば(高校生レベル)安易にできちゃいます。

[nico]http://www.nicovideo.jp/watch/sm9115910[/nico]
こちらが例のゲーム(ニコニコ動画)。

あまり、ソースに細かい説明がないので、何をやっているのか考える必要はありますが、先ほど言った事を応用したレベルまでの数学(または物理)で理解可能です。

リンクは、「その4」ですので、ソースを見始めるなら「その1」からをお勧めします。

参考までに。


ちなみに、内積と外積を使って3D空間での音を表現(遮蔽物なし/反響なし)とか先日やりました。

kms

Re:3Dでの処理について

#30

投稿記事 by kms » 15年前

Ma様、ご紹介ありがとうございます。

動画を拝見しました。

これは凄いですね。DXライブラリでここまで出来るとは驚きました。

>私が思うには楽しむ程度で3Dゲームを作るというならば、
>皆さんが言っているような行列の計算などの学力は
>ほぼ必要ありません。
>ただ、本格的に3Dを作る場合は別ですが。。。

自分の場合は、変なところで完璧主義者なので、
楽しむ程度の3Dゲームでも、それに関する知識は、
どうしても本格的に得ようとしてしまうんですね。
そもそも、自分は、3Dを理解するには、それに関する、あらゆる数学、物理学の知識を
知りたい、という欲求が根本にありますので、
自分の場合、あくまで自分の場合はですが、
楽しむ程度でも、本格的でも、
こういった知識は身につけておこうという思いが強いですね。
ただ、高校時代に得られなかった知識を、
どこかで補完しようという願望が強いだけなのかもしれませんが。。

>リンクは、「その4」ですので、ソースを見始めるなら「その1」からをお勧めします。
>参考までに。

全部拝見したのですが、グラフィックはここまで出来るのですか?
純粋に驚いたのですが、自分は高校数学レベルも覚束ないので、びっくりです。
ちょっと勇気が沸きました。

くどいようで申し訳ないのですが、3Dの初歩としては、
DXライブラリのどの関数(サンプルプログラム)から入ったほうが
勉強になりますでしょうか?
例えば、カメラの視点、注視点、上方向を設定する関数から、や、
DrawLine3D関数、DrawPolygon3D関数など。 画像

softya

Re:3Dでの処理について

#31

投稿記事 by softya » 15年前

>くどいようで申し訳ないのですが、x,yを回転させる為のsin,cos関数の他に、
>z座標(奥行き)をぐるぐると回る関数の記述の仕方は、
>どういったものなのでしょうか?

Z方向の回転もsin,cosですよ。
2次元だと行列が3x3ですが、3次元だと4x4になるだけです。
http://www.ceres.dti.ne.jp/~ykuroda/oya ... sic3d.html

Ma

Re:3Dでの処理について

#32

投稿記事 by Ma » 15年前

>全部拝見したのですが、グラフィックはここまで出来るのですか?
3D系のグラフィックのことでしょうか?

ミクなど踊っているデータは、例の動画の作者さんが作ったものではなくMMDで使われているデータの流用かと思われます。
(3Dアニメや人間の3Dモデルの作成は、私も含めた未経験者にはかなり時間がかかると思います。)

アニメや人間の3Dモデルは流用でも、地形や遠地の風景のグラフィックスは自作だと思います。
これらは学力関係なく作ることができますが、3Dモデリング用のソフトの操作方法に慣れる必要があります。
(平地を作るぐらいなら慣れてなくてもすぐできるでしょうが。)
フリーなら、3Dモデル(地形もこれ)を作成できるメタセコイアをお勧めします。


>3Dの初歩としては、
>DXライブラリのどの関数(サンプルプログラム)から入ったほうが
>勉強になりますでしょうか?

ひとつやふたつの関数だけに注目するよりもサンプルプログラムを理解するように努めたほうが、
関数の意味がより分かりやすいと思います。

DXライブラリ公式にある3Dサンプルプログラムがふたつあります。(30 と 31)
http://homepage2.nifty.com/natupaji/DxL ... meiro.html

これらのサンプルから理解する、というのはどうでしょうか?
分からない関数がでてきたらDXライブラリのリファレンスを見て理解できると思います。

これが終わったらリファレンスに乗っている関数で興味がある関数からよんでいけばいいとおもいます。

kms

Re:3Dでの処理について

#33

投稿記事 by kms » 15年前

>softya様

例えば、添付した画像の原点(0,0,0)を中心に、
ぐるぐると回転させる事は可能でしょうか?
うまく説明できず歯がゆいのですが、
原点の座標は変えずに、x,y軸を回転させる感じです。
z軸は動きません。
(ああ、なんと云ったら良いのでしょう。。
正確には、横軸を回転させ、縦軸は動かさないといった感じなのですが。。)
これも行列による演算でしょうか?

>Ma様

ご丁寧なお返事、ありがとうございます。

>DXライブラリ公式にある3Dサンプルプログラムがふたつあります。(30 と 31)
>これらのサンプルから理解する、というのはどうでしょうか?
>分からない関数がでてきたらDXライブラリのリファレンスを見て理解できると思います。

ありがとうございます。
一応、自分でもサンプルプログラムを組んでいますので、
それと照らし合わせながら勉強したいと思います。 画像

softya

Re:3Dでの処理について

#34

投稿記事 by softya » 15年前

>私が思うには楽しむ程度で3Dゲームを作るというならば、
>皆さんが言っているような行列の計算などの学力は
>ほぼ必要ありません。

私は最低限は必要だと思うのですが。
行列が分からないとDXライブラリの3D系の算術演算関数の意味が分からないので、思うことが出来ないことに成りかねません。
例えばビルボード表示しようと思ったら、カメラ回転系の逆行列が必要じゃないですか。
http://www.c3.club.kyutech.ac.jp/gamewi ... 9#w8cf1d9a
kmsさんは、キャラはスプライトで表現しようと思っているはずなので(違っていたらすいません)
ビルボードする為の知識は必要だと思いますが。

>例えば、添付した画像の原点(0,0,0)を中心に、
>ぐるぐると回転させる事は可能でしょうか?
>うまく説明できず歯がゆいのですが、
>原点の座標は変えずに、x,y軸を回転させる感じです。
>z軸は動きません。
>これも行列による演算でしょうか?

それは、Z軸回りの回転ですね。
当然行列演算します。
参考リンク先には「Z軸に関する回転」の行列が書かれていますよね。それです。
http://www.ceres.dti.ne.jp/~ykuroda/oya ... sic3d.html

kms

Re:3Dでの処理について

#35

投稿記事 by kms » 15年前

softya様、参考リンク、ありがとうございます。

とりあえず、3D空間に、モデルと線を描画したのですが、
キー入力によって、モデルを動かす場合は、行列演算ですよね?

DXライブラリの本家サイト様の関数リファレンスを拝見したのですが、
確かに行列変換の関数はあるのですが、
キー入力によって移動させる方法がわからないのですが。。 画像

softya

Re:3Dでの処理について

#36

投稿記事 by softya » 15年前

プログラムを見ましたが、この場合は行列を使わなくても移動出来ますよ。
それとメインループ中に「3Dモデルの読み込み」があるのは良くないです。
これで移動プログラムが組めないのは、C言語の基礎力不足かと思います。
もしかして、2Dでも自力で組めないのではないですか?

conio

Re:3Dでの処理について

#37

投稿記事 by conio » 15年前

>>キー入力によって、モデルを動かす場合は、行列演算ですよね?
キー入力と行列演算は何の関係もありません。

別にキー入力が無くても 行列演算でモデルを動かせますし、
キー入力判定をする際には必ず行列演算、といった決まりは無いです。


>>キー入力によって移動させる方法がわからないのですが。。
基本的にプログラミングは、様々な処理を組み合わせて 任意の動作をする処理を作り出します。

------------------------------------------
【1】キー入力でモデルを動かす関数
【2】マウスクリックでモデルを動かす関数
------------------------------------------
みたいなものはありません。

【1】ならば、
------------------------
・キー入力を判定する処理
・モデルを動かす処理
------------------------
をif文か何かで組み合わせて実装したりしますし、


【2】も同様に、
------------------------
・マウスの状態を判定する処理
・モデルを動かす処理
------------------------
をif文か何かで組み合わせて実装します。


何でもかんでも「特定の1つの関数が存在し、それを呼び出せば終わり」という考え方は誤りです。
パーツ(関数など)を組み合わせ、自分で作ってください。 画像

kms

Re:3Dでの処理について

#38

投稿記事 by kms » 15年前

conio様へ

僕は、
「何でもかんでも「特定の1つの関数が存在し、それを呼び出せば終わり」という」
考え方は持ってはいませんよ。

>基本的にプログラミングは、様々な処理を組み合わせて 任意の動作をする処理を作り出します。

これも心得ているつもりですし、
僕が質問したかったのは、
------------------------
・キー入力を判定する処理
・モデルを動かす処理
------------------------
における、キー入力とモデルを動かす処理の関係性です。
具体的に書かなかった僕が悪いのは認めます。ごめんなさい。
しかし、
「何でもかんでも「特定の1つの関数が存在し、それを呼び出せば終わり」という」
考え方、を僕が持っている、という何の根拠もない事実を前提としたその言い方は、
心外ですね。
確かに僕は馬鹿ですが、馬鹿だから、純粋に質問しているつもりです。
何を以て、そういった考え方を持っていると思ったのですか?

>これで移動プログラムが組めないのは、C言語の基礎力不足かと思います。
>もしかして、2Dでも自力で組めないのではないですか?

2Dは、自力で組んだ覚えもあるのですが、
結局、ゲームプログラミングの館をお手本にしてしまった感もありますし、
質問に頼ってしまった感もあります。
本当に解らなかったのも事実です。

解らなかった箇所は、C言語の文法というよりも、数学的な箇所でした。

3Dに関しては、softya様のアドバイス以外は、正直、殆ど解りません。

キー入力をif文に分け、ベクトルの演算を組み込んだものの、
やはりsoftya様のいう「C言語の基礎力不足」の所為か、
キャラクターのようにうまくは動いてくれませんでした。

例えば、下記のように組み込んでも、
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
        {
            MV1SetPosition( ModelHandle, VGet( 0.0f, 0.0f, 200.0f ) ) ;
        }
当たり前ですが、一瞬で移動するだけですよね。

それと、僕の記事を読んで、不快な気持ちになる方もいらっしゃると思いますので、
そのときは、記事を削除したいと思います。 画像

softya

Re:3Dでの処理について

#39

投稿記事 by softya » 15年前

動くようにしてみました。
pc_test1.mqoは持っていないのでkabe.mqoを代用に使っています。
そのため、カメラが引きすぎかもしれません。
ソースをご自分のと見比べて直してもらえればと思います。

>確かに僕は馬鹿ですが、馬鹿だから、純粋に質問しているつもりです。
>何を以て、そういった考え方を持っていると思ったのですか?

そう思って質問してくる人がここでは多いからですね。
conioさんにも悪意があったとは思えませんので、気分を害さずに受け止めていただければと思います。
あと、世の中には何でもサンプルコードあると思っている困った人もいます。そんな人達に慣れていると先読みして一言添えちゃう事が多々あります。

>やはりsoftya様のいう「C言語の基礎力不足」の所為か、
>キャラクターのようにうまくは動いてくれませんでした。

ソースを見てもらうと分かるのですが、2Dの時の処理と特段変わるものではありません。
何処で分からなくなったか、言ってもらえると疑問にお答えしますよ。

kms

Re:3Dでの処理について

#40

投稿記事 by kms » 15年前

>conioさんにも悪意があったとは思えませんので、気分を害さずに受け止めていただければと思います。
>世の中には何でもサンプルコードあると思っている困った人もいます。そんな人達に慣れていると先読みして>一言添えちゃう事が多々あります。

申し訳ありません。そういう事だったのですか。。
僕が、わからない、わからない、と質問の連続だったので、
本当に申し訳ないと思います。ごめんなさい。。
ただ、解らないまま、解決をチェックするのも失礼だと思ったのです。

>ソースを見てもらうと分かるのですが、2Dの時の処理と特段変わるものではありません。
>何処で分からなくなったか、言ってもらえると疑問にお答えしますよ。

数式云々に捕らわれていて、難しく考えすぎていたようなのです。
解らなくなったのは、やはり2Dから3Dへ移行する際に、関数が色々と変わりますので、
それで混乱していたのだと思います。
softya様の書いて下さったソースを見て納得しました。
本当に2Dの頃と、特段変わった点は見受けられないです。
pos変数をMV1SetPosition関数の引数に渡せたのですね。。
おそらく、3D関数の使い方が頭に入っていないのでしょうね。僕は。

本当に申し訳ありませんでした。。 画像

conio

Re:3Dでの処理について

#41

投稿記事 by conio » 15年前

>>確かに僕は馬鹿ですが、馬鹿だから、純粋に質問しているつもりです。
>>何を以て、そういった考え方を持っていると思ったのですか?


------------------------------------------------------------
>>キー入力によって、モデルを動かす場合は、行列演算ですよね?
------------------------------------------------------------
それは上記のコメントから判断しました。


このコメントから、
--------------------------------------------------------
「特に因果関係の無い処理を、1つのものとして考えている」
「一連の処理を、細かい処理単位に分割しきれていない」
--------------------------------------------------------
もしかすると 上記のように考えて詰まっているのかもしれない、と思ったのです。
違っていたのであれば失礼しました。 画像

Ma

Re:3Dでの処理について

#42

投稿記事 by Ma » 15年前

返事が遅れました。失礼><

>>私が思うには楽しむ程度で3Dゲームを作るというならば、
>>皆さんが言っているような行列の計算などの学力は
>>ほぼ必要ありません。

>私は最低限は必要だと思うのですが。
>行列が分からないとDXライブラリの3D系の算術演算関数の意味が分からないので、思うことが出来ないことに成りかねません。
>例えばビルボード表示しようと思ったら、カメラ回転系の逆行列が必要じゃないですか。

経験浅はかな身ですが自身の勉強のためにも自分のやり方を書いてみます。

おそらくビルボード表示に行列は有効というか高効率だと思いますが、(実はプログラムで行列やったことがない…)
行列を使わないでもビルボードできると思います。
カメラのx-y平面における角度、x-z平面における角度を元に、ビルボードする平面の角度を求めて、適度な距離に描画することで私はビルボードを実現しました。

そのために、行列の知識が無くても例の動画レベルの3Dゲームは作れるはず と書思いました。
無論、行列をうまく使う方法を知っておくことに越したことはないのでしょうがw(自分に言ってます。)
正直自分も行列を学ぶべき身です。


ちなみに、行列なしで私が(DXライブラリで)3Dゲームを作る場合で、カメラを更新するためには
プレイヤーの情報(構造体かクラス)に
 x,y,z (位置座標)
 カメラのx-y平面における角度、x-z平面における角度(水平な角度と縦の角度)
の計5つの要素を最低限持たせています。

閉鎖

“C言語何でも質問掲示板” へ戻る