ページ 11

2つ質問です。

Posted: 2013年10月02日(水) 11:51
by dic2
お世話になります。dicです。
いろいろ3Dに関するプログラムもできだしました。

そこで、さらに上をいきたいので、質問させてください。

2D空間で、プレイヤーの自由移動はできるのですが、
3D空間での、プレイヤーの自由移動ができません。わかりません。
3D物体の回転方法はわかりました。
しかし、3D空間内にてプレイヤー目線にして、右をむくとか、上をむくとかが
わかりません。
おそらく、カメラの位置をかえたりするのだろうとは思うのですが、
いまもっている参考書には、そこまでかいてありませんでした。

そこで、3D空間でプレイヤーを自由移動させるのに必要なことが書かれた
書籍を紹介してほしいです。



そして、2点目。
現在C/C++で開発をしていますが、Lua言語も視野にいれいたとおもっています。
そこで、実践的なLua言語を使っていててサンプルソースなどが載っているサイトなど
ありましたら、教えていただけると助かります。
サンプルのレベルとしては、C言語から、Luaのスクリプトを呼んで、
シューティングが動く程度のものがちょうどいいかと思っています。
こちらも、書籍、ホームページどちらでも構いません。


以上2点ほど、よろしくお願いします。

Re: 2つ質問です。

Posted: 2013年10月02日(水) 14:21
by softya(ソフト屋)
定番だと、これでしょうか。
「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

Re: 2つ質問です。

Posted: 2013年10月02日(水) 15:58
by ISLe
2Dで自由に動かせるならば、例えば、真上から見た画面で、戦車が左右キーで転回し上下キーで前進後退するプログラムを作れますか?
それができれば3Dで方向を変えるのも難しくないと思うのですが。

Re: 2つ質問です。

Posted: 2013年10月04日(金) 11:11
by dic
>>softyaさん
やはり定番はオイラリーですね
なるほど、財布と相談して決めようと思います。

Luaは、使い方次第ですか。
たしかにC/C++言語も使い方次第ですが、やっぱりスクリプトであるので
VC++を止めずにできるってのが魅力でした。
やはり、Luaの使い方をいろいろ検索したのですが、なかなかでてこないですね^^;
おもにLinuxを使ってる方のサンプルが多かったです。
たしかに、ゲームのスクリプトを公開している方は・・・攻略できてしまいますね。

DXライブラリを使って3D空間での自由移動をしたかったので
わくわくプログラミング自習室 Blogs - 3D Archive がとても参考になりました。

じっくり、読んでいきます。


>>ISLeさん
画面を固定した状態だったら、2Dで自由移動できる ということです。
2D画面でも、プレイヤーを中心に背景やまわりの物体を回転させればいいのでしょうけど、
なかなかわかりません。
行列を使って、プレイヤーの座標を中心にして回転させればいいのでしょうけど、
まだ、時間がとれなくてできていません。
まずは、2Dでの回転をできるようにしたいと思います。



回答ありがとうございました。

Re: 2つ質問です。

Posted: 2013年10月04日(金) 11:25
by softya(ソフト屋)
Luaの例がLinuxであるとかは特に関係ないと思うんですけどね。
DXライブラリとの結合の例は検索で探せます。あと過去ログにも幾度かLuaは出てきます。
わからないのは結合の仕方であって、応用例では無いですよね(応用は自分で考えるものだと思うので)?

Re: 2つ質問です。

Posted: 2013年10月04日(金) 16:48
by ISLe
dic さんが書きました:>>ISLeさん
画面を固定した状態だったら、2Dで自由移動できる ということです。
2D画面でも、プレイヤーを中心に背景やまわりの物体を回転させればいいのでしょうけど、
なかなかわかりません。
行列を使って、プレイヤーの座標を中心にして回転させればいいのでしょうけど、
まだ、時間がとれなくてできていません。
まずは、2Dでの回転をできるようにしたいと思います。
繰り返しになりますが、画面を固定した状態で自由移動できるプログラムを改造してプレイヤー視点にするのは難しくないのですよ。
ですから、画面を固定した状態で自由移動できるプログラムを作って投稿してくだされば変更点を教えて差し上げることができます。
回答者に一からコードを書いて見せろとおっしゃる?

Re: 2つ質問です。

Posted: 2013年10月09日(水) 15:58
by dic
>>softyaさん
はい、結合の仕方がわからなかったので、書籍を購入し、いま読んでいます。
バインドというもので解決できるみたいでした。
結構おもしろいです。

>>ISLeさん
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
上のサイトが検索ででました。
任意の点でを中心とする回転が、今回の質問になるのですが、
私には理解できないので、わかりやすく解説していただけると、それをもとにつくってみたいと思います。
近くの書店にて、行列で回転について調べたのですが、原点を中心とする回転についてしか
見つかりませんでした。
現在、頼れるものはネットの情報しかない状態です。
画面を固定した状態のものは、できますが、今日はまだできていません。

Re: 2つ質問です。

Posted: 2013年10月09日(水) 21:02
by softya(ソフト屋)
> 近くの書店にて、行列で回転について調べたのですが、原点を中心とする回転についてしか
> 見つかりませんでした。

その場でのローカル座標系の回転ですよね?原点を中心とする回転で考えれば良いんです。
その後に表示座標に並行移動すれば目的の座標に表示座標に表示できます。

Re: 2つ質問です。

Posted: 2013年10月10日(木) 10:40
by dic
>>softyaさん
はい。原点を中心に回転はできるのですが、
任意の点を中心とした場合が、できないのです。

たとえば、右に45度傾いた状態で、上方向にすすむと、y = y -5; じゃなくて
y = y - ( 5 * cos45 ) というような(推測)計算がなかなか思いつきません。

ワールド座標と、ローカル座標や、カメラの位置などいろいろあって
頭が混乱してしまいます。

いちおう、座標(320,240)を中心として回転するものをつくりましたので、アップロードしておきます。
いじるところと、ポイントなどを教えていただけると助かります。

環境は、Visual C++ 2010 Express + Dxライブラリです。

Re: 2つ質問です。

Posted: 2013年10月11日(金) 21:50
by Tatu
ISLeさんがNo:3で書いた「真上から見た画面で、戦車が左右キーで転回し、上下キーで前進後退するプログラム」を書いたほうがよいと思います。No:6で「画面を固定した状態で自由移動できるプログラムを作って投稿してくだされば変更点を教えて差し上げることができます。」と書いてくれているのですから。

前進について

コード:

player.x=player.x+5*cos(player.angle);
player.y=player.y+5*sin(player.angle);
と書けばplayerがplayer.angleの方向に5だけ移動することになります。

わからなければ新・ゲームプログラミングの館の3.7章「特定の角度で弾を飛ばす」などを見てください。

Re: 2つ質問です。

Posted: 2013年10月13日(日) 11:41
by dic
>>Tatuさん
なるほど、では、

>>ISLeさん
「画面を固定した状態で自由移動できるプログラム」
「真上から見た画面で、戦車が左右キーで転回し、上下キーで前進後退するプログラム」を
書きますのでしばらく待ってください。

Re: 2つ質問です。

Posted: 2013年10月15日(火) 16:11
by dic
「画面を固定した状態で自由移動できるプログラム」
「真上から見た画面で、戦車が左右キーで転回し、上下キーで前進後退するプログラム」が
できたので、アップロードしておきます。

Re: 2つ質問です。

Posted: 2013年10月15日(火) 17:51
by ISLe
Game関数を以下のようにするとプレイヤーを中心にスクロールします。
気になるところがたくさんありますが、書き換えは最低限にしました。
Param_t構造体に前回のカメラのメンバを復活してください。
  1. 基準点(プレイヤー座標)を元にカメラ座標を決めます。
    この場合のカメラ座標とは、プレイヤーが中心となる位置に、画面と同じ大きさの矩形を置いたとき、その矩形の左上座標で、この矩形から覗いた空間が画面に表示されるというイメージです。
  2. 描画する際、すべての座標をカメラ座標の分同じ方向にズラします。
    今回は覗き穴のほうを動かすイメージなのでカメラ座標をオフセットとして引いています。

コード:

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つ質問です。

Posted: 2013年10月15日(火) 22:45
by ISLe
さらに周囲が回転するようにするには、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つ質問です。

Posted: 2013年10月23日(水) 18:30
by dic
>>ISLeさん

No.13 のソースコードはうまくいき、理解できました。

しかし、やはり No.14 の周りが回転と、カメラが独立
というのが理解できません。

No.14で提示していただいたソースコードのうち、
22、23行目の ワールド座標からビュー座標に変換
というところをコメントアウトして実行すると、
たしかに、自由移動できます。

しかし、私の持っている本には、ワールド座標から
ビュー座標に変換する必要があるように書いていますので、
22,23行目は、必要なのかわかりません。

22、23行目をコメントアウトしないと、
角度を変えて、たとえば90度方向に移動すると
ななめに移動してしまいます。

しかし、座標変換は必要とかいてあるし・・・
お手数ですが、どこか間違っている箇所、修正する箇所が
あれば、ご指摘いただきたいのですがいかがでしょうか?

背景の円は、方向が変わってもわかりやすいように
カラーにしました。

コメントアウトしたもの、そうでないものを用意しました。

Re: 2つ質問です。

Posted: 2013年10月24日(木) 01:46
by ジルコニア
3Dゲームはコードの手打ちじゃなくて
ゲームエンジンを使うのが普通ですよ
http://ja.wikipedia.org/wiki/%E3%82%B2% ... 8%E3%83%B3
最も多くの人に使われてるゲームエンジンUnityならサンプルが豊富なのでそれを改造して学んで行くのが良いとおもいます

Re: 2つ質問です。

Posted: 2013年10月24日(木) 09:38
by Tatu
22、23行目をコメントアウトしないとうまく動かないというのは

コード:

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 );
}

コード:

        pos.x -= g_tParam.camera.x;
        pos.y -= g_tParam.camera.y;
でカメラの座標を2回引いているためですね。

円::Draw()ではカメラの座標を引かないようにしてはどうでしょうか。

Re: 2つ質問です。

Posted: 2013年10月24日(木) 17:10
by ISLe
正しく座標変換すれば、回転の中心座標や覗き窓の座標を適当にズラしても配置がおかしくなることはありません。

提示したコードはプレイヤー中心前提で、プレイヤーの座標を正しく変換していません。

Re: 2つ質問です。

Posted: 2013年10月24日(木) 17:12
by ISLe
ジルコニア さんが書きました:3Dゲームはコードの手打ちじゃなくて
ゲームエンジンを使うのが普通ですよ
dicさんは3Dの座標変換が分からないというのでサンプルコードで段階を追いつつ細かく説明しているところなのですが。

Re: 2つ質問です。

Posted: 2013年10月24日(木) 17:16
by softya(ソフト屋)
ジルコニア さんが書きました:3Dゲームはコードの手打ちじゃなくて
ゲームエンジンを使うのが普通ですよ
http://ja.wikipedia.org/wiki/%E3%82%B2% ... 8%E3%83%B3
最も多くの人に使われてるゲームエンジンUnityならサンプルが豊富なのでそれを改造して学んで行くのが良いとおもいます
Unityは結局3D空間の計算が分からなくて行き詰まっている質問をよく見かけます。
コードの問題ではなく、どちらにしても座標変換系は理解しなくては行けないことなのではないでしょうか。

Re: 2つ質問です。

Posted: 2013年10月24日(木) 22:43
by ジルコニア
2つ目の質問の開発環境について答えてるだけなので
ゲームエンジンを使ったほうがいいんじゃないですかとアドバイスしただけです
3D空間の計算についての質問には全く触れてませんしお構いなくどうぞ
まあ自分ならカメラの動き等は気にせずさっさと完成させますけど。

Re: 2つ質問です。

Posted: 2013年10月24日(木) 22:47
by softya(ソフト屋)
ジルコニア さんが書きました:2つ目の質問の開発環境について答えてるだけなので
ゲームエンジンを使ったほうがいいんじゃないですかとアドバイスしただけです
3D空間の計算についての質問には全く触れてませんしお構いなくどうぞ
まあ自分ならカメラの動き等は気にせずさっさと完成させますけど。
唐突だと思ったら2番めの質問への回答だったんですね。今度からそう書いてくださいね。

Re: 2つ質問です。

Posted: 2013年10月24日(木) 23:20
by ISLe
ジルコニア さんが書きました:まあ自分ならカメラの動き等は気にせずさっさと完成させますけど。
プログラムでカメラを動かさないとあさっての方向しか画面に映らなくてデバッグもまともにできないということにはならないのですね。
だったらゲームエンジンを使えばプログラムでカメラを動かさずともプレイヤー視点のゲームが作れるということですよね。

わたしがいちいち細かく説明する必要なんてありませんでしたね。
計算なんて知らなくても良いわけですからね。
失礼しました。

Re: 2つ質問です。

Posted: 2013年10月27日(日) 02:30
by ジルコニア
以下のようにすれば簡単にプレイヤー視点のゲームが作れますよ
http://www.atmarkit.co.jp/ait/articles/ ... 112_3.html

Re: 2つ質問です。

Posted: 2013年10月27日(日) 11:01
by softya(ソフト屋)
ジルコニア さんが書きました:以下のようにすれば簡単にプレイヤー視点のゲームが作れますよ
http://www.atmarkit.co.jp/ait/articles/ ... 112_3.html
dicさんの望まれている話題かどうか分からないので、これ以上はdicさんの続きを聞きたいという書き込みを待って続けて頂ければと思います。
オフトピック
結局ソースコードを書いているのでクォータニオンとかの座標系の理解がないと自分の思うとおりに視線移動するゲームは出来ないと思うのは私だけだろうか・・・。

Re: 2つ質問です。

Posted: 2013年10月27日(日) 16:20
by ISLe
dicさんの1つめの質問は、2つの問題に分けられると思います。
第1の問題は、視線に対して右や左を向くというのがどういうことなのか分からないということ。
第2の問題は、カメラの概念を理解していないということ。

ゲームエンジンで簡単にカメラを配置できたとしても、プレイヤーを追いかけるなどの移動するキャラを追加しようとすれば変換行列に触れることになるため、すぐ同じ問題に行き当たります。

dicさんが最初に提示したコードは周りの景色を回転させていましたから、dicさんは画面に映る像を基準に考えていると想像します。
2Dでは特に扱われないモデル変換の概念が行き場を失っている状態で、単にカメラだけの問題ではなく、モデル変換とカメラ変換の区別を付けることが問題の解決になると考えます。
そのためにまず2Dの概念を整理する必要があると考えます。
例えゲームエンジンを使っても3D座標変換の概念を超えることはできないと思います。

Re: 2つ質問です。

Posted: 2013年10月30日(水) 22:22
by ジルコニア
自キャラを追いかけるカメラ実装しました↓
http://www1.axfc.net/u/3073832
やり方:assets→importpackage→scripts→Camerascripts→smoothfollow.jsをインポートする。
そのインポートしたファイルをカメラにしたいオブジェクトにドラックアンドドロップする
次にinspector画面のTargetという項目でカメラ追跡したいオブジェクトを選ぶ。(cube1)
次に自キャラとして操作したいオブジェクトを決める(cube1)
自キャラとして操作したいオブジェクトを選んだ状態でcompornent→script→thirdpersoncontroller
をえらんで自キャラを選んだ状態にする。

以上。
行列変換や空間座標の計算等はまったくやらずに実装できました。
確かに凝ったカメラワークにすればコードを与えて書きかる必要がありますけど
サンプルを見てもらえれば分かるとうり十分カメラとして機能してコードを書く必要がありません
お二方の言ってることが全く見当違いなことを証明できてよかったです。
ありがとうございました。

Re: 2つ質問です。

Posted: 2013年10月30日(水) 22:26
by softya(ソフト屋)
ジルコニア さんが書きました:自キャラを追いかけるカメラ実装しました↓
http://www1.axfc.net/u/3073832
やり方:assets→importpackage→scripts→Camerascripts→smoothfollow.jsをインポートする。
そのインポートしたファイルをカメラにしたいオブジェクトにドラックアンドドロップする
次にinspector画面のTargetという項目でカメラ追跡したいオブジェクトを選ぶ。(cube1)
次に自キャラとして操作したいオブジェクトを決める(cube1)
自キャラとして操作したいオブジェクトを選んだ状態でcompornent→script→thirdpersoncontroller
をえらんで自キャラを選んだ状態にする。

以上。
行列変換や空間座標の計算等はまったくやらずに実装できました。
確かに凝ったカメラワークにすればコードを与えて書きかる必要がありますけど
サンプルを見てもらえれば分かるとうり十分カメラとして機能してコードを書く必要がありません
お二方の言ってることが全く見当違いなことを証明できてよかったです。
ありがとうございました。
すいません。dicさんの意向に沿った内容かわからないのでこれ以上続けるのは避けていただけますか。
【補足】dicさんが知りたい!ってことであればここで続けて下さい。違うのであればトピックの分離をお願いします。[失礼しました敬称が抜けておりました]

Re: 2つ質問です。

Posted: 2013年10月31日(木) 01:51
by ISLe
そもそもdicさんはカメラを動かす方法なんて質問してませんよね。
プレイヤー目線にすることもカメラを動かすことも手段としては知っていることが質問文に書いてありますし。

問題の本質はカメラとはまったく関係ないと思います。
ただしカメラの存在が誤解の元になっているので区別する必要があります。

Re: 2つ質問です。

Posted: 2013年10月31日(木) 10:19
by dic
まず、最初に、Takuさん
丁寧なご指摘ありがとうございました。
2回、カメラの座標をひいていたので、表示がおかしくなっていたのはわかりました。

>>ISLeさん
おっしゃるとおり、カメラの概念が正しい理解の邪魔をしているのかな?と思ってました。
行列を使った変換で3D座標のみの、参考書をもっており、これには、行列だけでの計算方法がのっていたので
2Dに変換するとわからなくなりました。
z座標を全部ゼロにして、計算すればいいのかもしれないのですが、まだ、カメラの計算方法や、視点の変更などが
今もっている本では、わかっていません。理解できていません。

この本を参考にしています。(よく似た本がたくさんあるので、違っていたらすいません)

ワールド座標 x モデル座標 x カメラ座標 x 射影座標 x スクリーン座標
と書いています(いま手にもってないので、間違っていたらすいません)
あまりわからない概念は、カメラ座標と、射影座標です。
softyaさんが教えてくれた本を読んで勉強しようかと思います。


>>シルコニアさん
サンプルを見せていただきありがとうございます。
ただ、上にあるように、座標変換がわかっていないため、シルコニアさんが持っているツールを
使いこなすことは困難だと思います。
もちろん、そういったことをカバーする開発環境かもしれませんが、いずれは、用語の問題に
つきあたると思いますので、今は、じっくり3Dの基礎固めをしたいです。


>>ISLeさん
この文章を書いてて思ったのですが、うえにある計算式の射影座標変換がなかったから、
カメラ座標だけではうまくいかなかったのでしょうか?
3Dの基礎ができていないため、質問の内容があまりよいものではないと思います。すいません。
今は、luaで、手いっぱいなので、3Dはなかなか手がつけれない状態です。

ISLeさんが教えてくれた、プレイヤー中心の回転はできました。
ありがとうございました。

また、勉強して、わからなかったら質問させてください。

Re: 2つ質問です。

Posted: 2013年10月31日(木) 17:32
by ISLe
3Dモデルはモデルごとにローカル座標系を持っています。
それをワールド座標系の空間に配置するのがモデル変換です。
2Dでは、セットした座標をそのまま描画命令に使いますしそのまま使い回します。
そのため3Dで描画のたびに行うモデル変換に違和感を持つことがあるかもしれません。

ワールド座標系に配置されたモデルをカメラのパラメータによって、いっせいに処理するのがカメラ変換です。
#パラメータが共通というだけで、実際の処理はいっせいにという表現では語弊がありますが。
モデル変換で作ったステージをどこから見たふうにするかというものです。
カメラ変換が対象にするのもワールド座標系です。

モデル変換とカメラ変換はどちらもワールド座標系を使うので、見た目を基準に世界そのものを変えてしまう手段も取れます。
そちらのほうが都合が良い場合もあるのですが、そこは区別をすることが重要です。

最後に、カメラから見える風景のどの範囲をどんな塩梅で画面に表示するかを決めるのが射影変換です。
ワールド座標系をスクリーン座標系に変換します。
奥に行くほど視点に寄せて立体的に見せるのが透視射影、立体感を出さないのが正射影です。
3Dシステムで2D表示をしたいときは正射影を使います。


先の2Dサンプルでは用語にズレがあります。
2Dだと違和感ないのでこれも3Dとイメージがズレる要因かもしれませんが。

カメラ座標としていましたが、覗き窓の位置を決めているところは、射影変換に当たります。
円を描画する座標を計算しているところがカメラ変換に当たります。
最初にランダムに座標を決めたのがモデル変換に当たります。

Re: 2つ質問です。

Posted: 2013年11月07日(木) 12:05
by dic
>>ISLeさん
申し訳ございません。今現在の私の力では、ISLe様のおっしゃることが理解できません。
つきましては、私が、もう一度3Dの勉強をしたのち、それでもわからなかったら
おうかがいしてもよろしいでしょうか?