2つ質問です。
2つ質問です。
お世話になります。dicです。
いろいろ3Dに関するプログラムもできだしました。
そこで、さらに上をいきたいので、質問させてください。
2D空間で、プレイヤーの自由移動はできるのですが、
3D空間での、プレイヤーの自由移動ができません。わかりません。
3D物体の回転方法はわかりました。
しかし、3D空間内にてプレイヤー目線にして、右をむくとか、上をむくとかが
わかりません。
おそらく、カメラの位置をかえたりするのだろうとは思うのですが、
いまもっている参考書には、そこまでかいてありませんでした。
そこで、3D空間でプレイヤーを自由移動させるのに必要なことが書かれた
書籍を紹介してほしいです。
そして、2点目。
現在C/C++で開発をしていますが、Lua言語も視野にいれいたとおもっています。
そこで、実践的なLua言語を使っていててサンプルソースなどが載っているサイトなど
ありましたら、教えていただけると助かります。
サンプルのレベルとしては、C言語から、Luaのスクリプトを呼んで、
シューティングが動く程度のものがちょうどいいかと思っています。
こちらも、書籍、ホームページどちらでも構いません。
以上2点ほど、よろしくお願いします。
いろいろ3Dに関するプログラムもできだしました。
そこで、さらに上をいきたいので、質問させてください。
2D空間で、プレイヤーの自由移動はできるのですが、
3D空間での、プレイヤーの自由移動ができません。わかりません。
3D物体の回転方法はわかりました。
しかし、3D空間内にてプレイヤー目線にして、右をむくとか、上をむくとかが
わかりません。
おそらく、カメラの位置をかえたりするのだろうとは思うのですが、
いまもっている参考書には、そこまでかいてありませんでした。
そこで、3D空間でプレイヤーを自由移動させるのに必要なことが書かれた
書籍を紹介してほしいです。
そして、2点目。
現在C/C++で開発をしていますが、Lua言語も視野にいれいたとおもっています。
そこで、実践的なLua言語を使っていててサンプルソースなどが載っているサイトなど
ありましたら、教えていただけると助かります。
サンプルのレベルとしては、C言語から、Luaのスクリプトを呼んで、
シューティングが動く程度のものがちょうどいいかと思っています。
こちらも、書籍、ホームページどちらでも構いません。
以上2点ほど、よろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2つ質問です。
定番だと、これでしょうか。
「O'Reilly Japan - 実例で学ぶゲーム3D数学」
http://www.oreilly.co.jp/books/9784873113777/
Luaだとこんなのでしょうか。
「Amazon.co.jp: スクリプト言語による効率的ゲーム開発 新訂版 (LuaとC/C++連携プログラミング): 浜中 誠: 本」
ただ、こんなの無くても作れると思うのです。
「Lua組み込み編」 基本的なトコはこの程度ですし、自分で応用方法を考えれないならLua使う意味がないですよ。
http://marupeke296.com/LUA_main.html
【補足】
3D自体も、本を買わなくてもサンプルや簡単な解説から理解していくだけなんですが。
3D空間を数学的に捉えられる必要はあるかと思います。
DXライブラリなら、下記の2つで大体出来るのでは?
「わくわくプログラミング自習室 Blogs - 3D Archive」 下の方から古い記事です。つまり、最初は下の方の記事から読んで下さい。
http://i-libro.net/wpmu/blog/archives/c ... /3d/page/2
「DXライブラリ置き場 サンプルプログラム3D編」 本家のサンプルたちです。
http://homepage2.nifty.com/natupaji/DxL ... am_3D.html
「O'Reilly Japan - 実例で学ぶゲーム3D数学」
http://www.oreilly.co.jp/books/9784873113777/
Luaだとこんなのでしょうか。
「Amazon.co.jp: スクリプト言語による効率的ゲーム開発 新訂版 (LuaとC/C++連携プログラミング): 浜中 誠: 本」
ただ、こんなの無くても作れると思うのです。
「Lua組み込み編」 基本的なトコはこの程度ですし、自分で応用方法を考えれないならLua使う意味がないですよ。
http://marupeke296.com/LUA_main.html
【補足】
3D自体も、本を買わなくてもサンプルや簡単な解説から理解していくだけなんですが。
3D空間を数学的に捉えられる必要はあるかと思います。
DXライブラリなら、下記の2つで大体出来るのでは?
「わくわくプログラミング自習室 Blogs - 3D Archive」 下の方から古い記事です。つまり、最初は下の方の記事から読んで下さい。
http://i-libro.net/wpmu/blog/archives/c ... /3d/page/2
「DXライブラリ置き場 サンプルプログラム3D編」 本家のサンプルたちです。
http://homepage2.nifty.com/natupaji/DxL ... am_3D.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2つ質問です。
2Dで自由に動かせるならば、例えば、真上から見た画面で、戦車が左右キーで転回し上下キーで前進後退するプログラムを作れますか?
それができれば3Dで方向を変えるのも難しくないと思うのですが。
それができれば3Dで方向を変えるのも難しくないと思うのですが。
Re: 2つ質問です。
>>softyaさん
やはり定番はオイラリーですね
なるほど、財布と相談して決めようと思います。
Luaは、使い方次第ですか。
たしかにC/C++言語も使い方次第ですが、やっぱりスクリプトであるので
VC++を止めずにできるってのが魅力でした。
やはり、Luaの使い方をいろいろ検索したのですが、なかなかでてこないですね^^;
おもにLinuxを使ってる方のサンプルが多かったです。
たしかに、ゲームのスクリプトを公開している方は・・・攻略できてしまいますね。
DXライブラリを使って3D空間での自由移動をしたかったので
わくわくプログラミング自習室 Blogs - 3D Archive がとても参考になりました。
じっくり、読んでいきます。
>>ISLeさん
画面を固定した状態だったら、2Dで自由移動できる ということです。
2D画面でも、プレイヤーを中心に背景やまわりの物体を回転させればいいのでしょうけど、
なかなかわかりません。
行列を使って、プレイヤーの座標を中心にして回転させればいいのでしょうけど、
まだ、時間がとれなくてできていません。
まずは、2Dでの回転をできるようにしたいと思います。
回答ありがとうございました。
やはり定番はオイラリーですね
なるほど、財布と相談して決めようと思います。
Luaは、使い方次第ですか。
たしかにC/C++言語も使い方次第ですが、やっぱりスクリプトであるので
VC++を止めずにできるってのが魅力でした。
やはり、Luaの使い方をいろいろ検索したのですが、なかなかでてこないですね^^;
おもにLinuxを使ってる方のサンプルが多かったです。
たしかに、ゲームのスクリプトを公開している方は・・・攻略できてしまいますね。
DXライブラリを使って3D空間での自由移動をしたかったので
わくわくプログラミング自習室 Blogs - 3D Archive がとても参考になりました。
じっくり、読んでいきます。
>>ISLeさん
画面を固定した状態だったら、2Dで自由移動できる ということです。
2D画面でも、プレイヤーを中心に背景やまわりの物体を回転させればいいのでしょうけど、
なかなかわかりません。
行列を使って、プレイヤーの座標を中心にして回転させればいいのでしょうけど、
まだ、時間がとれなくてできていません。
まずは、2Dでの回転をできるようにしたいと思います。
回答ありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2つ質問です。
Luaの例がLinuxであるとかは特に関係ないと思うんですけどね。
DXライブラリとの結合の例は検索で探せます。あと過去ログにも幾度かLuaは出てきます。
わからないのは結合の仕方であって、応用例では無いですよね(応用は自分で考えるものだと思うので)?
DXライブラリとの結合の例は検索で探せます。あと過去ログにも幾度かLuaは出てきます。
わからないのは結合の仕方であって、応用例では無いですよね(応用は自分で考えるものだと思うので)?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2つ質問です。
繰り返しになりますが、画面を固定した状態で自由移動できるプログラムを改造してプレイヤー視点にするのは難しくないのですよ。dic さんが書きました:>>ISLeさん
画面を固定した状態だったら、2Dで自由移動できる ということです。
2D画面でも、プレイヤーを中心に背景やまわりの物体を回転させればいいのでしょうけど、
なかなかわかりません。
行列を使って、プレイヤーの座標を中心にして回転させればいいのでしょうけど、
まだ、時間がとれなくてできていません。
まずは、2Dでの回転をできるようにしたいと思います。
ですから、画面を固定した状態で自由移動できるプログラムを作って投稿してくだされば変更点を教えて差し上げることができます。
回答者に一からコードを書いて見せろとおっしゃる?
Re: 2つ質問です。
>>softyaさん
はい、結合の仕方がわからなかったので、書籍を購入し、いま読んでいます。
バインドというもので解決できるみたいでした。
結構おもしろいです。
>>ISLeさん
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
上のサイトが検索ででました。
任意の点でを中心とする回転が、今回の質問になるのですが、
私には理解できないので、わかりやすく解説していただけると、それをもとにつくってみたいと思います。
近くの書店にて、行列で回転について調べたのですが、原点を中心とする回転についてしか
見つかりませんでした。
現在、頼れるものはネットの情報しかない状態です。
画面を固定した状態のものは、できますが、今日はまだできていません。
はい、結合の仕方がわからなかったので、書籍を購入し、いま読んでいます。
バインドというもので解決できるみたいでした。
結構おもしろいです。
>>ISLeさん
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
上のサイトが検索ででました。
任意の点でを中心とする回転が、今回の質問になるのですが、
私には理解できないので、わかりやすく解説していただけると、それをもとにつくってみたいと思います。
近くの書店にて、行列で回転について調べたのですが、原点を中心とする回転についてしか
見つかりませんでした。
現在、頼れるものはネットの情報しかない状態です。
画面を固定した状態のものは、できますが、今日はまだできていません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2つ質問です。
> 近くの書店にて、行列で回転について調べたのですが、原点を中心とする回転についてしか
> 見つかりませんでした。
その場でのローカル座標系の回転ですよね?原点を中心とする回転で考えれば良いんです。
その後に表示座標に並行移動すれば目的の座標に表示座標に表示できます。
> 見つかりませんでした。
その場でのローカル座標系の回転ですよね?原点を中心とする回転で考えれば良いんです。
その後に表示座標に並行移動すれば目的の座標に表示座標に表示できます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2つ質問です。
>>softyaさん
はい。原点を中心に回転はできるのですが、
任意の点を中心とした場合が、できないのです。
たとえば、右に45度傾いた状態で、上方向にすすむと、y = y -5; じゃなくて
y = y - ( 5 * cos45 ) というような(推測)計算がなかなか思いつきません。
ワールド座標と、ローカル座標や、カメラの位置などいろいろあって
頭が混乱してしまいます。
いちおう、座標(320,240)を中心として回転するものをつくりましたので、アップロードしておきます。
いじるところと、ポイントなどを教えていただけると助かります。
環境は、Visual C++ 2010 Express + Dxライブラリです。
はい。原点を中心に回転はできるのですが、
任意の点を中心とした場合が、できないのです。
たとえば、右に45度傾いた状態で、上方向にすすむと、y = y -5; じゃなくて
y = y - ( 5 * cos45 ) というような(推測)計算がなかなか思いつきません。
ワールド座標と、ローカル座標や、カメラの位置などいろいろあって
頭が混乱してしまいます。
いちおう、座標(320,240)を中心として回転するものをつくりましたので、アップロードしておきます。
いじるところと、ポイントなどを教えていただけると助かります。
環境は、Visual C++ 2010 Express + Dxライブラリです。
- 添付ファイル
-
- 回転.zip
- (22.59 KiB) ダウンロード数: 191 回
Re: 2つ質問です。
ISLeさんがNo:3で書いた「真上から見た画面で、戦車が左右キーで転回し、上下キーで前進後退するプログラム」を書いたほうがよいと思います。No:6で「画面を固定した状態で自由移動できるプログラムを作って投稿してくだされば変更点を教えて差し上げることができます。」と書いてくれているのですから。
前進について と書けばplayerがplayer.angleの方向に5だけ移動することになります。
わからなければ新・ゲームプログラミングの館の3.7章「特定の角度で弾を飛ばす」などを見てください。
前進について と書けばplayerがplayer.angleの方向に5だけ移動することになります。
わからなければ新・ゲームプログラミングの館の3.7章「特定の角度で弾を飛ばす」などを見てください。
Re: 2つ質問です。
>>Tatuさん
なるほど、では、
>>ISLeさん
「画面を固定した状態で自由移動できるプログラム」
「真上から見た画面で、戦車が左右キーで転回し、上下キーで前進後退するプログラム」を
書きますのでしばらく待ってください。
なるほど、では、
>>ISLeさん
「画面を固定した状態で自由移動できるプログラム」
「真上から見た画面で、戦車が左右キーで転回し、上下キーで前進後退するプログラム」を
書きますのでしばらく待ってください。
Re: 2つ質問です。
Game関数を以下のようにするとプレイヤーを中心にスクロールします。
気になるところがたくさんありますが、書き換えは最低限にしました。
Param_t構造体に前回のカメラのメンバを復活してください。
更新処理と描画処理が混在していたり、型が揃っていないなどの理由で、見通しの悪いコードになっています。
気になるところがたくさんありますが、書き換えは最低限にしました。
Param_t構造体に前回のカメラのメンバを復活してください。
- 基準点(プレイヤー座標)を元にカメラ座標を決めます。
この場合のカメラ座標とは、プレイヤーが中心となる位置に、画面と同じ大きさの矩形を置いたとき、その矩形の左上座標で、この矩形から覗いた空間が画面に表示されるというイメージです。 - 描画する際、すべての座標をカメラ座標の分同じ方向にズラします。
今回は覗き穴のほうを動かすイメージなのでカメラ座標をオフセットとして引いています。
int Game()
{
// 描画
UINT i;
for( i=0; i<g_tParam.vCircle.size(); i++ )
{
// 座標を書き換えるので円をコピー
円 circle = g_tParam.vCircle.at(i);
// ワールド座標からビュー座標に変換
VECTOR pos = circle.GetPos();
pos.x -= g_tParam.camera.x;
pos.y -= g_tParam.camera.y;
circle.SetPos(pos.x, pos.y, pos.z);
circle.Draw( );
}
double speed = 3.0;
if( 1 == CheckHitKey(KEY_INPUT_UP) )
{
g_tParam.player_x += speed * cos( (3.141592/180.0) * g_tParam.angle );
g_tParam.player_y += speed * sin( (3.141592/180.0) * g_tParam.angle );
}
if( 1 == CheckHitKey(KEY_INPUT_DOWN) )
{
g_tParam.player_x -= speed * cos( (3.141592/180.0) * g_tParam.angle );
g_tParam.player_y -= speed * sin( (3.141592/180.0) * g_tParam.angle );
}
// カメラを動かす とりあえずで常にプレイヤーを画面中央に
g_tParam.camera.x = int(g_tParam.player_x) - 640/2;
g_tParam.camera.y = int(g_tParam.player_y) - 480/2;
// ワールド座標からビュー座標に変換
int player_dispx = int(g_tParam.player_x) - g_tParam.camera.x;
int player_dispy = int(g_tParam.player_y) - g_tParam.camera.y;
// デバック用
// 前向きに線を引く
double vec_x, vec_y;
vec_x = g_tParam.player_x + 5 * speed * cos((3.141592/180.0) * g_tParam.angle );
vec_y = g_tParam.player_y + 5 * speed * sin((3.141592/180.0) * g_tParam.angle );
DrawLine( int(player_dispx), int(player_dispy), int(vec_x-g_tParam.camera.x), int(vec_y-g_tParam.camera.y), GetColor(255,0,0) );
DrawFormatString( 0, 40, GetColor(255,0,0), "%f,%f", g_tParam.player_x, g_tParam.player_y );
DrawFormatString( 0, 60, GetColor(255,0,0), "%f,%f", vec_x, vec_y );
if( 1 == CheckHitKey(KEY_INPUT_LEFT) )
g_tParam.angle -= 2;
if( 1 == CheckHitKey(KEY_INPUT_RIGHT) )
g_tParam.angle += 2;
// デバック用
// プレイヤーの位置を描画(黄色の円)
DrawCircle( int(player_dispx), int(player_dispy), 8, GetColor(128,128,0), true );
DrawFormatString( 0, 20, GetColor(255,0,0), "angle:%f", g_tParam.angle );
return 1;
}
Re: 2つ質問です。
さらに周囲が回転するようにするには、Game関数を以下のようにします。
変更箇所に注目してください。
回転の中心やカメラの座標は独立しています。
個々にオフセットを持たせれば、視点を前方に置いたりカメラが追従したりといったことが可能です。
変更箇所に注目してください。
回転の中心やカメラの座標は独立しています。
個々にオフセットを持たせれば、視点を前方に置いたりカメラが追従したりといったことが可能です。
int Game()
{
// 回転の中心座標
float center_x = float(g_tParam.player_x);
float center_y = float(g_tParam.player_y);
// 描画
UINT i;
for( i=0; i<g_tParam.vCircle.size(); i++ )
{
// 座標を書き換えるので円をコピー
円 circle = g_tParam.vCircle.at(i);
VECTOR pos = circle.GetPos();
// ワールド座標系で回転
MATRIX mat = MGetRotZ(DX_PI_F * float(-g_tParam.angle) / 180.0f); // プレイヤーに対して逆回転
pos.x -= center_x;
pos.y -= center_y;
pos = VTransform(pos, mat);
pos.x += center_x;
pos.y += center_y;
// ワールド座標からビュー座標に変換
pos.x -= g_tParam.camera.x;
pos.y -= g_tParam.camera.y;
circle.SetPos(pos.x, pos.y, pos.z);
circle.Draw( );
}
double speed = 3.0;
if( 1 == CheckHitKey(KEY_INPUT_UP) )
{
g_tParam.player_x += speed * cos( (3.141592/180.0) * g_tParam.angle );
g_tParam.player_y += speed * sin( (3.141592/180.0) * g_tParam.angle );
}
if( 1 == CheckHitKey(KEY_INPUT_DOWN) )
{
g_tParam.player_x -= speed * cos( (3.141592/180.0) * g_tParam.angle );
g_tParam.player_y -= speed * sin( (3.141592/180.0) * g_tParam.angle );
}
// カメラを動かす とりあえずで常にプレイヤーを画面中央に
g_tParam.camera.x = int(g_tParam.player_x) - 640/2;
g_tParam.camera.y = int(g_tParam.player_y) - 480/2;
// ワールド座標からビュー座標に変換
int player_dispx = int(g_tParam.player_x) - g_tParam.camera.x;
int player_dispy = int(g_tParam.player_y) - g_tParam.camera.y;
// デバック用
// 前向きに線を引く
double vec_x, vec_y;
vec_x = g_tParam.player_x + 5 * speed * cos((3.141592/180.0) * 0.0 ); // 周囲が回転するので常に0度の方向
vec_y = g_tParam.player_y + 5 * speed * sin((3.141592/180.0) * 0.0 ); // 同上
DrawLine( int(player_dispx), int(player_dispy), int(vec_x-g_tParam.camera.x), int(vec_y-g_tParam.camera.y), GetColor(255,0,0) );
DrawFormatString( 0, 40, GetColor(255,0,0), "%f,%f", g_tParam.player_x, g_tParam.player_y );
DrawFormatString( 0, 60, GetColor(255,0,0), "%f,%f", vec_x, vec_y );
if( 1 == CheckHitKey(KEY_INPUT_LEFT) )
g_tParam.angle -= 2;
if( 1 == CheckHitKey(KEY_INPUT_RIGHT) )
g_tParam.angle += 2;
// デバック用
// プレイヤーの位置を描画(黄色の円)
DrawCircle( int(player_dispx), int(player_dispy), 8, GetColor(128,128,0), true );
DrawFormatString( 0, 20, GetColor(255,0,0), "angle:%f", g_tParam.angle );
return 1;
}
Re: 2つ質問です。
>>ISLeさん
No.13 のソースコードはうまくいき、理解できました。
しかし、やはり No.14 の周りが回転と、カメラが独立
というのが理解できません。
No.14で提示していただいたソースコードのうち、
22、23行目の ワールド座標からビュー座標に変換
というところをコメントアウトして実行すると、
たしかに、自由移動できます。
しかし、私の持っている本には、ワールド座標から
ビュー座標に変換する必要があるように書いていますので、
22,23行目は、必要なのかわかりません。
22、23行目をコメントアウトしないと、
角度を変えて、たとえば90度方向に移動すると
ななめに移動してしまいます。
しかし、座標変換は必要とかいてあるし・・・
お手数ですが、どこか間違っている箇所、修正する箇所が
あれば、ご指摘いただきたいのですがいかがでしょうか?
背景の円は、方向が変わってもわかりやすいように
カラーにしました。
コメントアウトしたもの、そうでないものを用意しました。
No.13 のソースコードはうまくいき、理解できました。
しかし、やはり No.14 の周りが回転と、カメラが独立
というのが理解できません。
No.14で提示していただいたソースコードのうち、
22、23行目の ワールド座標からビュー座標に変換
というところをコメントアウトして実行すると、
たしかに、自由移動できます。
しかし、私の持っている本には、ワールド座標から
ビュー座標に変換する必要があるように書いていますので、
22,23行目は、必要なのかわかりません。
22、23行目をコメントアウトしないと、
角度を変えて、たとえば90度方向に移動すると
ななめに移動してしまいます。
しかし、座標変換は必要とかいてあるし・・・
お手数ですが、どこか間違っている箇所、修正する箇所が
あれば、ご指摘いただきたいのですがいかがでしょうか?
背景の円は、方向が変わってもわかりやすいように
カラーにしました。
コメントアウトしたもの、そうでないものを用意しました。
- 添付ファイル
-
- 回転.zip
- (48.39 KiB) ダウンロード数: 175 回
Re: 2つ質問です。
3Dゲームはコードの手打ちじゃなくて
ゲームエンジンを使うのが普通ですよ
→http://ja.wikipedia.org/wiki/%E3%82%B2% ... 8%E3%83%B3
最も多くの人に使われてるゲームエンジンUnityならサンプルが豊富なのでそれを改造して学んで行くのが良いとおもいます
ゲームエンジンを使うのが普通ですよ
→http://ja.wikipedia.org/wiki/%E3%82%B2% ... 8%E3%83%B3
最も多くの人に使われてるゲームエンジンUnityならサンプルが豊富なのでそれを改造して学んで行くのが良いとおもいます
Re: 2つ質問です。
22、23行目をコメントアウトしないとうまく動かないというのは
と
でカメラの座標を2回引いているためですね。
円::Draw()ではカメラの座標を引かないようにしてはどうでしょうか。
void 円::Draw( )
{
float x = m_pos.x - g_tParam.camera.x;
float y = m_pos.y - g_tParam.camera.y;
float z = 0;
DrawCircle( (int)x, (int)y, 8, GetColor(color_r,color_g,color_b), true );
}
円::Draw()ではカメラの座標を引かないようにしてはどうでしょうか。
Re: 2つ質問です。
正しく座標変換すれば、回転の中心座標や覗き窓の座標を適当にズラしても配置がおかしくなることはありません。
提示したコードはプレイヤー中心前提で、プレイヤーの座標を正しく変換していません。
提示したコードはプレイヤー中心前提で、プレイヤーの座標を正しく変換していません。
Re: 2つ質問です。
dicさんは3Dの座標変換が分からないというのでサンプルコードで段階を追いつつ細かく説明しているところなのですが。ジルコニア さんが書きました:3Dゲームはコードの手打ちじゃなくて
ゲームエンジンを使うのが普通ですよ
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2つ質問です。
Unityは結局3D空間の計算が分からなくて行き詰まっている質問をよく見かけます。ジルコニア さんが書きました:3Dゲームはコードの手打ちじゃなくて
ゲームエンジンを使うのが普通ですよ
→http://ja.wikipedia.org/wiki/%E3%82%B2% ... 8%E3%83%B3
最も多くの人に使われてるゲームエンジンUnityならサンプルが豊富なのでそれを改造して学んで行くのが良いとおもいます
コードの問題ではなく、どちらにしても座標変換系は理解しなくては行けないことなのではないでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2つ質問です。
2つ目の質問の開発環境について答えてるだけなので
ゲームエンジンを使ったほうがいいんじゃないですかとアドバイスしただけです
3D空間の計算についての質問には全く触れてませんしお構いなくどうぞ
まあ自分ならカメラの動き等は気にせずさっさと完成させますけど。
ゲームエンジンを使ったほうがいいんじゃないですかとアドバイスしただけです
3D空間の計算についての質問には全く触れてませんしお構いなくどうぞ
まあ自分ならカメラの動き等は気にせずさっさと完成させますけど。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2つ質問です。
唐突だと思ったら2番めの質問への回答だったんですね。今度からそう書いてくださいね。ジルコニア さんが書きました:2つ目の質問の開発環境について答えてるだけなので
ゲームエンジンを使ったほうがいいんじゃないですかとアドバイスしただけです
3D空間の計算についての質問には全く触れてませんしお構いなくどうぞ
まあ自分ならカメラの動き等は気にせずさっさと完成させますけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2つ質問です。
プログラムでカメラを動かさないとあさっての方向しか画面に映らなくてデバッグもまともにできないということにはならないのですね。ジルコニア さんが書きました:まあ自分ならカメラの動き等は気にせずさっさと完成させますけど。
だったらゲームエンジンを使えばプログラムでカメラを動かさずともプレイヤー視点のゲームが作れるということですよね。
わたしがいちいち細かく説明する必要なんてありませんでしたね。
計算なんて知らなくても良いわけですからね。
失礼しました。
Re: 2つ質問です。
以下のようにすれば簡単にプレイヤー視点のゲームが作れますよ
http://www.atmarkit.co.jp/ait/articles/ ... 112_3.html
http://www.atmarkit.co.jp/ait/articles/ ... 112_3.html
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2つ質問です。
dicさんの望まれている話題かどうか分からないので、これ以上はdicさんの続きを聞きたいという書き込みを待って続けて頂ければと思います。ジルコニア さんが書きました:以下のようにすれば簡単にプレイヤー視点のゲームが作れますよ
http://www.atmarkit.co.jp/ait/articles/ ... 112_3.html
オフトピック
結局ソースコードを書いているのでクォータニオンとかの座標系の理解がないと自分の思うとおりに視線移動するゲームは出来ないと思うのは私だけだろうか・・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2つ質問です。
dicさんの1つめの質問は、2つの問題に分けられると思います。
第1の問題は、視線に対して右や左を向くというのがどういうことなのか分からないということ。
第2の問題は、カメラの概念を理解していないということ。
ゲームエンジンで簡単にカメラを配置できたとしても、プレイヤーを追いかけるなどの移動するキャラを追加しようとすれば変換行列に触れることになるため、すぐ同じ問題に行き当たります。
dicさんが最初に提示したコードは周りの景色を回転させていましたから、dicさんは画面に映る像を基準に考えていると想像します。
2Dでは特に扱われないモデル変換の概念が行き場を失っている状態で、単にカメラだけの問題ではなく、モデル変換とカメラ変換の区別を付けることが問題の解決になると考えます。
そのためにまず2Dの概念を整理する必要があると考えます。
例えゲームエンジンを使っても3D座標変換の概念を超えることはできないと思います。
第1の問題は、視線に対して右や左を向くというのがどういうことなのか分からないということ。
第2の問題は、カメラの概念を理解していないということ。
ゲームエンジンで簡単にカメラを配置できたとしても、プレイヤーを追いかけるなどの移動するキャラを追加しようとすれば変換行列に触れることになるため、すぐ同じ問題に行き当たります。
dicさんが最初に提示したコードは周りの景色を回転させていましたから、dicさんは画面に映る像を基準に考えていると想像します。
2Dでは特に扱われないモデル変換の概念が行き場を失っている状態で、単にカメラだけの問題ではなく、モデル変換とカメラ変換の区別を付けることが問題の解決になると考えます。
そのためにまず2Dの概念を整理する必要があると考えます。
例えゲームエンジンを使っても3D座標変換の概念を超えることはできないと思います。
Re: 2つ質問です。
自キャラを追いかけるカメラ実装しました↓
http://www1.axfc.net/u/3073832
やり方:assets→importpackage→scripts→Camerascripts→smoothfollow.jsをインポートする。
そのインポートしたファイルをカメラにしたいオブジェクトにドラックアンドドロップする
次にinspector画面のTargetという項目でカメラ追跡したいオブジェクトを選ぶ。(cube1)
次に自キャラとして操作したいオブジェクトを決める(cube1)
自キャラとして操作したいオブジェクトを選んだ状態でcompornent→script→thirdpersoncontroller
をえらんで自キャラを選んだ状態にする。
以上。
行列変換や空間座標の計算等はまったくやらずに実装できました。
確かに凝ったカメラワークにすればコードを与えて書きかる必要がありますけど
サンプルを見てもらえれば分かるとうり十分カメラとして機能してコードを書く必要がありません
お二方の言ってることが全く見当違いなことを証明できてよかったです。
ありがとうございました。
http://www1.axfc.net/u/3073832
やり方:assets→importpackage→scripts→Camerascripts→smoothfollow.jsをインポートする。
そのインポートしたファイルをカメラにしたいオブジェクトにドラックアンドドロップする
次にinspector画面のTargetという項目でカメラ追跡したいオブジェクトを選ぶ。(cube1)
次に自キャラとして操作したいオブジェクトを決める(cube1)
自キャラとして操作したいオブジェクトを選んだ状態でcompornent→script→thirdpersoncontroller
をえらんで自キャラを選んだ状態にする。
以上。
行列変換や空間座標の計算等はまったくやらずに実装できました。
確かに凝ったカメラワークにすればコードを与えて書きかる必要がありますけど
サンプルを見てもらえれば分かるとうり十分カメラとして機能してコードを書く必要がありません
お二方の言ってることが全く見当違いなことを証明できてよかったです。
ありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 2つ質問です。
すいません。dicさんの意向に沿った内容かわからないのでこれ以上続けるのは避けていただけますか。ジルコニア さんが書きました:自キャラを追いかけるカメラ実装しました↓
http://www1.axfc.net/u/3073832
やり方:assets→importpackage→scripts→Camerascripts→smoothfollow.jsをインポートする。
そのインポートしたファイルをカメラにしたいオブジェクトにドラックアンドドロップする
次にinspector画面のTargetという項目でカメラ追跡したいオブジェクトを選ぶ。(cube1)
次に自キャラとして操作したいオブジェクトを決める(cube1)
自キャラとして操作したいオブジェクトを選んだ状態でcompornent→script→thirdpersoncontroller
をえらんで自キャラを選んだ状態にする。
以上。
行列変換や空間座標の計算等はまったくやらずに実装できました。
確かに凝ったカメラワークにすればコードを与えて書きかる必要がありますけど
サンプルを見てもらえれば分かるとうり十分カメラとして機能してコードを書く必要がありません
お二方の言ってることが全く見当違いなことを証明できてよかったです。
ありがとうございました。
【補足】dicさんが知りたい!ってことであればここで続けて下さい。違うのであればトピックの分離をお願いします。[失礼しました敬称が抜けておりました]
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 2つ質問です。
そもそもdicさんはカメラを動かす方法なんて質問してませんよね。
プレイヤー目線にすることもカメラを動かすことも手段としては知っていることが質問文に書いてありますし。
問題の本質はカメラとはまったく関係ないと思います。
ただしカメラの存在が誤解の元になっているので区別する必要があります。
プレイヤー目線にすることもカメラを動かすことも手段としては知っていることが質問文に書いてありますし。
問題の本質はカメラとはまったく関係ないと思います。
ただしカメラの存在が誤解の元になっているので区別する必要があります。
Re: 2つ質問です。
まず、最初に、Takuさん
丁寧なご指摘ありがとうございました。
2回、カメラの座標をひいていたので、表示がおかしくなっていたのはわかりました。
>>ISLeさん
おっしゃるとおり、カメラの概念が正しい理解の邪魔をしているのかな?と思ってました。
行列を使った変換で3D座標のみの、参考書をもっており、これには、行列だけでの計算方法がのっていたので
2Dに変換するとわからなくなりました。
z座標を全部ゼロにして、計算すればいいのかもしれないのですが、まだ、カメラの計算方法や、視点の変更などが
今もっている本では、わかっていません。理解できていません。
この本を参考にしています。(よく似た本がたくさんあるので、違っていたらすいません)
ワールド座標 x モデル座標 x カメラ座標 x 射影座標 x スクリーン座標
と書いています(いま手にもってないので、間違っていたらすいません)
あまりわからない概念は、カメラ座標と、射影座標です。
softyaさんが教えてくれた本を読んで勉強しようかと思います。
>>シルコニアさん
サンプルを見せていただきありがとうございます。
ただ、上にあるように、座標変換がわかっていないため、シルコニアさんが持っているツールを
使いこなすことは困難だと思います。
もちろん、そういったことをカバーする開発環境かもしれませんが、いずれは、用語の問題に
つきあたると思いますので、今は、じっくり3Dの基礎固めをしたいです。
>>ISLeさん
この文章を書いてて思ったのですが、うえにある計算式の射影座標変換がなかったから、
カメラ座標だけではうまくいかなかったのでしょうか?
3Dの基礎ができていないため、質問の内容があまりよいものではないと思います。すいません。
今は、luaで、手いっぱいなので、3Dはなかなか手がつけれない状態です。
ISLeさんが教えてくれた、プレイヤー中心の回転はできました。
ありがとうございました。
また、勉強して、わからなかったら質問させてください。
丁寧なご指摘ありがとうございました。
2回、カメラの座標をひいていたので、表示がおかしくなっていたのはわかりました。
>>ISLeさん
おっしゃるとおり、カメラの概念が正しい理解の邪魔をしているのかな?と思ってました。
行列を使った変換で3D座標のみの、参考書をもっており、これには、行列だけでの計算方法がのっていたので
2Dに変換するとわからなくなりました。
z座標を全部ゼロにして、計算すればいいのかもしれないのですが、まだ、カメラの計算方法や、視点の変更などが
今もっている本では、わかっていません。理解できていません。
この本を参考にしています。(よく似た本がたくさんあるので、違っていたらすいません)
ワールド座標 x モデル座標 x カメラ座標 x 射影座標 x スクリーン座標
と書いています(いま手にもってないので、間違っていたらすいません)
あまりわからない概念は、カメラ座標と、射影座標です。
softyaさんが教えてくれた本を読んで勉強しようかと思います。
>>シルコニアさん
サンプルを見せていただきありがとうございます。
ただ、上にあるように、座標変換がわかっていないため、シルコニアさんが持っているツールを
使いこなすことは困難だと思います。
もちろん、そういったことをカバーする開発環境かもしれませんが、いずれは、用語の問題に
つきあたると思いますので、今は、じっくり3Dの基礎固めをしたいです。
>>ISLeさん
この文章を書いてて思ったのですが、うえにある計算式の射影座標変換がなかったから、
カメラ座標だけではうまくいかなかったのでしょうか?
3Dの基礎ができていないため、質問の内容があまりよいものではないと思います。すいません。
今は、luaで、手いっぱいなので、3Dはなかなか手がつけれない状態です。
ISLeさんが教えてくれた、プレイヤー中心の回転はできました。
ありがとうございました。
また、勉強して、わからなかったら質問させてください。
Re: 2つ質問です。
3Dモデルはモデルごとにローカル座標系を持っています。
それをワールド座標系の空間に配置するのがモデル変換です。
2Dでは、セットした座標をそのまま描画命令に使いますしそのまま使い回します。
そのため3Dで描画のたびに行うモデル変換に違和感を持つことがあるかもしれません。
ワールド座標系に配置されたモデルをカメラのパラメータによって、いっせいに処理するのがカメラ変換です。
#パラメータが共通というだけで、実際の処理はいっせいにという表現では語弊がありますが。
モデル変換で作ったステージをどこから見たふうにするかというものです。
カメラ変換が対象にするのもワールド座標系です。
モデル変換とカメラ変換はどちらもワールド座標系を使うので、見た目を基準に世界そのものを変えてしまう手段も取れます。
そちらのほうが都合が良い場合もあるのですが、そこは区別をすることが重要です。
最後に、カメラから見える風景のどの範囲をどんな塩梅で画面に表示するかを決めるのが射影変換です。
ワールド座標系をスクリーン座標系に変換します。
奥に行くほど視点に寄せて立体的に見せるのが透視射影、立体感を出さないのが正射影です。
3Dシステムで2D表示をしたいときは正射影を使います。
先の2Dサンプルでは用語にズレがあります。
2Dだと違和感ないのでこれも3Dとイメージがズレる要因かもしれませんが。
カメラ座標としていましたが、覗き窓の位置を決めているところは、射影変換に当たります。
円を描画する座標を計算しているところがカメラ変換に当たります。
最初にランダムに座標を決めたのがモデル変換に当たります。
それをワールド座標系の空間に配置するのがモデル変換です。
2Dでは、セットした座標をそのまま描画命令に使いますしそのまま使い回します。
そのため3Dで描画のたびに行うモデル変換に違和感を持つことがあるかもしれません。
ワールド座標系に配置されたモデルをカメラのパラメータによって、いっせいに処理するのがカメラ変換です。
#パラメータが共通というだけで、実際の処理はいっせいにという表現では語弊がありますが。
モデル変換で作ったステージをどこから見たふうにするかというものです。
カメラ変換が対象にするのもワールド座標系です。
モデル変換とカメラ変換はどちらもワールド座標系を使うので、見た目を基準に世界そのものを変えてしまう手段も取れます。
そちらのほうが都合が良い場合もあるのですが、そこは区別をすることが重要です。
最後に、カメラから見える風景のどの範囲をどんな塩梅で画面に表示するかを決めるのが射影変換です。
ワールド座標系をスクリーン座標系に変換します。
奥に行くほど視点に寄せて立体的に見せるのが透視射影、立体感を出さないのが正射影です。
3Dシステムで2D表示をしたいときは正射影を使います。
先の2Dサンプルでは用語にズレがあります。
2Dだと違和感ないのでこれも3Dとイメージがズレる要因かもしれませんが。
カメラ座標としていましたが、覗き窓の位置を決めているところは、射影変換に当たります。
円を描画する座標を計算しているところがカメラ変換に当たります。
最初にランダムに座標を決めたのがモデル変換に当たります。
Re: 2つ質問です。
>>ISLeさん
申し訳ございません。今現在の私の力では、ISLe様のおっしゃることが理解できません。
つきましては、私が、もう一度3Dの勉強をしたのち、それでもわからなかったら
おうかがいしてもよろしいでしょうか?
申し訳ございません。今現在の私の力では、ISLe様のおっしゃることが理解できません。
つきましては、私が、もう一度3Dの勉強をしたのち、それでもわからなかったら
おうかがいしてもよろしいでしょうか?