DXライブラリ3Dでのカメラの向きと進む向き

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#31

投稿記事 by ptolemy » 11年前

キャラクタが動くべき方向ですか?
_______________
キャラクタを回すと変わるangleYをangの代わりに入れてみたら向いた方向の左に動きました。

なのでキャラクタが前を向いた方向の左に動いたということは、動く向きとキャラクタの向きに差があることが分かりました。

angとangleYは、果たす役割が違いますが、別にこの方法でいいですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#32

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:キャラクタが動くべき方向ですか?
_______________
キャラクタを回すと変わるangleYをangの代わりに入れてみたら向いた方向の左に動きました。

なのでキャラクタが前を向いた方向の左に動いたということは、動く向きとキャラクタの向きに差があることが分かりました。

angとangleYは、果たす役割が違いますが、別にこの方法でいいですか?
ソースコードを見せてもらっていないのでangとangleYが違うのかどうかが私には判別できません。
ただ、90度ずれているみたいなので、sin/cosが逆に使われている可能性を考えた方がよいかもです。

つまり
X=speed*sin(angleY);
Y=speed*cos(angleY);
が正しいのかもしれません。

【補足】
確認してないので±符号が逆かもしれません。向いた方向の後ろに進んだら符号が逆って事です。
【補足の補足】
大雑把な説明ですがsinとcosは90度ずれた値を返す関数なので、予定と90度ずれたらsinとcosを入れ替えること考えたほうが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#33

投稿記事 by ptolemy » 11年前

angleYとは、
http://dixq.net/g/3d_04.html
のプログラム中のものです。


sinとcosでずれを直せるんですね。
試してみます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#34

投稿記事 by softya(ソフト屋) » 11年前

softya(ソフト屋) さんが書きました:
ptolemy さんが書きました:書いていませんね。
書いていませんよね。
じゃあ、変化しているのは何でしょうか?
ptolemy さんが書きました: また、rotate関数は、簡単にどういった使い方をするのでしょうか?
サンプルを実行してみたら分かりませんか?
あるいは、変化する値をprintfDXで見ても分かりませんか?
自分で考えてできるだけの事をしないで質問しても本当の理解には繋がりません。
分かった気になるだけなので、ご自身のためになりませんよ。

すごく短いプログラムなので、解読すべき点はそんなに多くないですよ。
そもそも日本語で解説されている気がするんですが。
その解説を見てプログラムを見てわからないのなら、プログラムを全然読めていないことになります。
日本語の解説自体を理解しているか不安なので
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/3d_02.html
ここの日本語解説を要約して、このサンプルのしている事を書いてみてください。
※ ソースコードを読むんじゃなくて日本語解説だけの要約です。
あと重要キーワードを抽出して書き出してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#35

投稿記事 by ptolemy » 11年前

説明とは、
ソースコード中の//の解説ですか?
それともソースコード外の説明ですか?

わかりずらかったので

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#36

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:説明とは、
ソースコード中の//の解説ですか?
それともソースコード外の説明ですか?

わかりずらかったので
ソースコード外の部分だけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#37

投稿記事 by ptolemy » 11年前

angleYに90°のラジアン角を引いたら差がなくなりできました。

______________
要約
[
座標は、回転移動の一時関数の計算式で求められ、それをrotate関数として作る。
モデルをY軸を基準として回転させると平面は、X-Zになる。
左キー、右キーを押されているとrotate関数をコールし、カメラの座標を表す変数を更新する。
]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#38

投稿記事 by softya(ソフト屋) » 11年前

>angleYに90°のラジアン角を引いたら差がなくなりできました。

90がマジックナンバー(魔法数字)ですね。
マジックナンバーは、他の人から分かりづらいし、自分が後から見ても分かりづらいです。
sin/cosの式の方を直しましょう。直し方は書いたつもりなんですが。
要約
[
座標は、回転移動の一時関数の計算式で求められ、それをrotate関数として作る。
モデルをY軸を基準として回転させると平面は、X-Zになる。
左キー、右キーを押されているとrotate関数をコールし、カメラの座標を表す変数を更新する。
]
この要約、このプログラムの機能を説明してませんので、何をするプログラムかわかりません。
大事な点が抜けて、いらない説明が入っています。つまり要点が掴めていない気がします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#39

投稿記事 by ptolemy » 11年前

sinとcosを入れ替えても行かなかったので別に考えました。

[要約2]
Y軸を中心とし、カメラの座標を回転させる。

ですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#40

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:sinとcosを入れ替えても行かなかったので別に考えました。
別の方法を考えるのは良いことです。
ただ、行き当たりばったりな対処になると自分が後で苦労します。
元の方法より良いって方法ならOKです。
ptolemy さんが書きました: [要約2]
Y軸を中心とし、カメラの座標を回転させる。

ですか?
この要約見て、何のことかわかりますか?
あるいは、同じ動作をするプログラムを組めるでしょうか。
要約ポイントがズレている証拠です。

【補足】
要約にチャレンジしてもらっているのは、プログラムを組むときに要約できていないようなら文章を読み取れていないって事ですので、
仕様に基づいたプログラムを組むことも出来ませんし、プログラムの解読も困難です。
プログラミングと言うのは文章を理解したり、文章を組み立てたりに近い部分が有るので、これが苦手だとプログラミングでも苦労します。
と言うことでトレーニングしてもらっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#41

投稿記事 by ptolemy » 11年前

[要約3]
targetYを中心にcameraX,Yを左右キーで回転させる。

ですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#42

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:[要約3]
targetYを中心にcameraX,Yを左右キーで回転させる。

ですか?
それはrotateの要約に近いです。
それだとtargetYは何?とかcameraX,Yが回転するとどんな事が起こるかの説明が抜け落ちます。
targetYだけですか? ってのもあるかな。
※ ちなみにcameraX,Yがただ変化しても、このサンプルのような動きにはなりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#43

投稿記事 by ptolemy » 11年前

[要約4]
プレイヤーの座標、XYZを中心にカメラの座標、XYを360°左右キーで自由に回転させる。

でどうですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#44

投稿記事 by softya(ソフト屋) » 11年前

惜しいです。カメラに関してもう一言欲しいです。
あと、rotate関数の入力と出力の部分だけを別に要約してみてください。

【補足】
例の移動方向ですが、説明した通り90の即値はやめて下さいね。
完成したプログラムコードを張るのもお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#45

投稿記事 by ptolemy » 11年前

[要約]
カメラの視線の先ターゲットの座標、XYZを中心にカメラの座標、XYを360°左右キーで自由に回転させる。

[rotate]
回転移動の1次関数の計算式を入力し、左右キーが押されているとrotate関数を出力する。

[補足について]
以前も書きましたが、sinとcosを入れ替えてもいかなかったのでまだマジックナンバーのままです。

ジルコニア

Re: DXライブラリ3Dでのカメラの向きと進む向き

#46

投稿記事 by ジルコニア » 11年前

>上にも書きましたがイライラするタメにやるもんじゃないです。
>楽しめない時には止めてみる事です。
>何より楽しむことが最重要です。
>そうしないと長く続きません。

>3Dもそうですが、2Dのゲーム開発でも覚えることが多いのでほんとに色々出来るようになるには何年もかかります。
>まず楽しむこと。それが長く続ける秘訣です。

ただやみくもにやったり努力しただけでは目的は達成できません><
なぜなら効率が悪いからです。効率がいい方法を選んでこそ障害や壁が少なくなり目的が達成しやすくなります。
例えばやみくもに絶食ダイエットしても成功しないようなことと同じです。
1:基礎代謝である1500kcal以下までなら食べても太らない。
2:筋肉を付けると基礎代謝の上限が上がる
3:マイナス4200kcalで1kg減る
この3つのことさえ知ってれば効率的にダイエットができるのにその方法を選ばないというのは愚かです。
努力は効率が悪いのでやらなくてもいいです。効率が悪い方法を選ぶとそれだけ
時間の無駄になるし目的が達成しにくくなります。
ちなみにこの考え方ができるには高学歴の人に多いわけです

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#47

投稿記事 by softya(ソフト屋) » 11年前

[要約]
カメラの視線の先ターゲットの座標、XYZを中心にカメラの座標、XYを360°左右キーで自由に回転させる。
そうです。やっと必要な情報が全て盛り込まれました。
[rotate]
回転移動の1次関数の計算式を入力し、左右キーが押されているとrotate関数を出力する。
計算式は入力しません。rotateの引数と関数の中の動作を書いて下さい。
rotate内でキー入力してませんよ。
[補足について]
以前も書きましたが、sinとcosを入れ替えてもいかなかったのでまだマジックナンバーのままです。
どう、うまく行かなかったか説明してもらっていないので回答しようがないですね。マイナス符号を付けてもダメだったんでしょうか。
方向が違うだけなら、それで解決するんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#48

投稿記事 by softya(ソフト屋) » 11年前

ジルコニア さんが書きました:>上にも書きましたがイライラするタメにやるもんじゃないです。
>楽しめない時には止めてみる事です。
>何より楽しむことが最重要です。
>そうしないと長く続きません。

>3Dもそうですが、2Dのゲーム開発でも覚えることが多いのでほんとに色々出来るようになるには何年もかかります。
>まず楽しむこと。それが長く続ける秘訣です。

ただやみくもにやったり努力しただけでは目的は達成できません><
なぜなら効率が悪いからです。効率がいい方法を選んでこそ障害や壁が少なくなり目的が達成しやすくなります。
例えばやみくもに絶食ダイエットしても成功しないようなことと同じです。
1:基礎代謝である1500kcal以下までなら食べても太らない。
2:筋肉を付けると基礎代謝の上限が上がる
3:マイナス4200kcalで1kg減る
この3つのことさえ知ってれば効率的にダイエットができるのにその方法を選ばないというのは愚かです。
努力は効率が悪いのでやらなくてもいいです。効率が悪い方法を選ぶとそれだけ
時間の無駄になるし目的が達成しにくくなります。
ちなみにこの考え方ができるには高学歴の人に多いわけです
プログラミングの掲示板ですので、プログラミング全部を否定されるとこの掲示板の意味がなくなります。
全てを否定したいのであれば、別の掲示板に行かれては如何でしょうか。

それと内容が「円滑なコミュニケーションを心がけない行為」に該当する部分がありますので、やめて頂きたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#49

投稿記事 by ptolemy » 11年前

すみませんrotateは、考え中なので次の返信で書きます。

補足について

90度ずれているので
X=speed*cos(angleY);
Y=speed*sin(angleY);

X=speed*sin(angleY);
Y=speed*cos(angleY);
と書いたんですがどの向きでも右斜めにしか進まなかったです。

とりあえず現状は、

コード:

X=speed*cos(angleY);
Y=speed*sin(angleY);

if(左を押したら){
player_x=player_x+X;
player_y=player_y-Y;
}
f(右を押したら){
player_x=player_x-X;
player_y=player_y+Y;
}
で左右は、完成しております。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#50

投稿記事 by softya(ソフト屋) » 11年前

コード全体を見せてもらえますか。検証してみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#51

投稿記事 by ptolemy » 11年前

テキストにまとめました。

hやcppのままの方が良かったですか?

他に欲しいファイルがありましたらよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#52

投稿記事 by softya(ソフト屋) » 11年前

コピペミスがあるのか、コンパイルが通らないので元のままが良かったですね。

【補足】
ちなみに、ang=angle1Y-90.0/180.0f*3.141592f;は演算順位の関係で思った結果になっていませんよ。
中学の数学?で習うと思いますが足し算・引き算よりも掛け算・割り算は先に計算されます。
【訂正】 あっと、そうか勘違いでした。 出来ればカッコで囲みましょう。 ラジアン角の変換しているだけなのか。

【追記】
X2=speed*sin(angle1Y);
Y2=speed*-cos(angle1Y);
とすれば、-90しなくてもちゃんと動くと思います。
sin/cosを入れ替えて、cos()の側の符号反転しただけです。

【追記】
後々修正しやすいように計算を直してみました。
斜め移動の速度も√2倍にならないようにしてます。 ※見せてもらったコードはナナメに√2倍の速度で移動しています。
これ以外にも移動する方法は幾つか有るので、考えてみてください。ベクトルの正規化も必要のない方法もあります。

コード:

		//	移動ベクトルを合成する。
		VECTOR moveVec = {0,0,0};
		bool bMove = false;
		if(keybord_Get(KEY_INPUT_LEFT)>0){
			ang = angle1Y - (90.0/180.0f*3.141592f);
			moveVec.x -= sin(ang);
			moveVec.z -= cos(ang);
			bMove = true;
		}
		if(keybord_Get(KEY_INPUT_DOWN)>0){
			ang = angle1Y + (180.0/180.0f*3.141592f);
			moveVec.x -= sin(ang);
			moveVec.z -= cos(ang);
			bMove = true;
		}
		if(keybord_Get(KEY_INPUT_UP)>0){
			ang = angle1Y;
			moveVec.x -= sin(ang);
			moveVec.z -= cos(ang);
			bMove = true;
		}
		if(keybord_Get(KEY_INPUT_RIGHT)>0){
			ang = angle1Y + (90.0/180.0f*3.141592f);
			moveVec.x -= sin(ang);
			moveVec.z -= cos(ang);
			bMove = true;
		}
		
		//	移動する
		if( bMove ) {
			//	ベクトル正規化。つまり速度1に補正する。こうしないと斜めは√2倍で移動してしまう。
			moveVec = VNorm(moveVec);
			//	速度を掛ける
			moveVec = VScale(moveVec,speed);
			
			//	移動。
			target2X += moveVec.x;
			target2Z += moveVec.z;
			cameraX += moveVec.x;
			cameraZ += moveVec.z;
		}
		printfDx("angle1Y=%f\nMvX=%f\nMvZ=%f\n",angle1Y,moveVec.x,moveVec.z);
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#53

投稿記事 by ptolemy » 11年前

符号の優先順位に気がつきませんでした。

sinとcosを逆にして、符号を変えたらマジックナンバーを使わずできました。

確かに斜めのspeedが2になってますね。
修正してみます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#54

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:符号の優先順位に気がつきませんでした。

sinとcosを逆にして、符号を変えたらマジックナンバーを使わずできました。

確かに斜めのspeedが2になってますね。
修正してみます。
2Dでも使う方法ですが、8方向別々に処理するって方法があります。if文の工夫が必要です。
あるいは方向をビット演算して方向別に配列のデータを持つという方法もあるのですが、効率では一番よいですがビット演算などビットの理解が必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ジルコニア

Re: DXライブラリ3Dでのカメラの向きと進む向き

#55

投稿記事 by ジルコニア » 11年前

>プログラミングの掲示板ですので、プログラミング全部を否定されるとこの掲示板の意味がなくなります。
>全てを否定したいのであれば、別の掲示板に行かれては如何でしょうか。

soft屋さんの仰るとうりよくよく考えれば荒らし的な行為をしてしまいました。
申し訳ございませんでした。
さんざんこの掲示板にお世話になっておいて手のひらを返すような発言をするなんて
人として最悪ですよね。この事に関して考えが及びませんでした。すいません。
この件に関してはもうここでは一切言及しません。どうかお許し下さい

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#56

投稿記事 by softya(ソフト屋) » 11年前

ジルコニア さんが書きました:>プログラミングの掲示板ですので、プログラミング全部を否定されるとこの掲示板の意味がなくなります。
>全てを否定したいのであれば、別の掲示板に行かれては如何でしょうか。

soft屋さんの仰るとうりよくよく考えれば荒らし的な行為をしてしまいました。
申し訳ございませんでした。
さんざんこの掲示板にお世話になっておいて手のひらを返すような発言をするなんて
人として最悪ですよね。この事に関して考えが及びませんでした。すいません。
この件に関してはもうここでは一切言及しません。どうかお許し下さい
掲示板の存在意図から外れことは気をつけて頂ければと思います。 ジルコニアさんも誰かの作ったゲームエンジンやサンプルや解説や公開スクリプトに助けられている存在だということは忘れないで下さい。
誰も解説やスクリプトを公開してくれなければジルコニアさんの方法論は通用しません。ゲームエンジンやサンプルやスクリプトは誰かが1からプログラミングしています。プログラミング技術に感謝すべき所はあっても否定される理由はないはずです。
ここはptolemy さんのトピックですので、関係ない話題はこれにて終了とさせていただきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#57

投稿記事 by ptolemy » 11年前

斜めのバグは、8方位で考えて制御しました。
___________________
rotateについてですが、
カメラの座標、回転スピード、ターゲットの座標をrotateの変数に入力する。
でいいですか?
______________________
また、
プレイヤーの地点から弾を前に飛ばす
ということについて質問があるんですが、新しくトピックを作った方がいいですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#58

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:斜めのバグは、8方位で考えて制御しました。
コードを公開してくださいね。他の人の参考にするためルール化されております。
ptolemy さんが書きました: ___________________
rotateについてですが、
カメラの座標、回転スピード、ターゲットの座標をrotateの変数に入力する。
でいいですか?
______________________
INPUTはそれで正しいですね。
でも、OUTPUTの説明も欲しいです。
ptolemy さんが書きました: また、
プレイヤーの地点から弾を前に飛ばす
ということについて質問があるんですが、新しくトピックを作った方がいいですか?
長くなってきたので別トピックでお願いします。
3Dの場合、弾の当たり判定とか色々と難しいですけどね。
【補足】 そろそれ関数分けしないとぐちゃぐちゃの修正の困難なソースコードになってきます。特に他の人が見るのが困難なりますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#59

投稿記事 by ptolemy » 11年前

では、また次の機会に質問します。

出力は、どう書けばいいか分からないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#60

投稿記事 by softya(ソフト屋) » 11年前

8方向のソースコードはすぐにおねがいしますね。

> 出力は、どう書けばいいか分からないです。

では、rotateは入力をどのように加工する関数でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#61

投稿記事 by ptolemy » 11年前

入力を定義する関数。
ですか?

8方位は、
斜めが押されたらspeed=1;
と四つ書いてみたら同じ速さになりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#62

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:入力を定義する関数。
ですか?
いえ違いますよ。
今の時点で「入力を定義する」と言う具体的な動作を説明できますか?
ptolemy さんが書きました: 8方位は、
斜めが押されたらspeed=1;
と四つ書いてみたら同じ速さになりました。
第3者にも分かるあいまいな要素のないものを提示して下さい。そのまま動いて、ちゃんと見れるソースコードの掲示がベストです。
http://dixq.net/board/board.html
以下引用
[C言語何でも質問掲示板でのみ適用される事項]
・トピックを立て、解決した場合は「解決しました」とだけ書かず、どうやって解決したか他の人に分かるように書いて  からトピックを終了して下さい。
前に提示されたコードもコンパイルが通らない不完全なものですから、この条件は満たされておりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#63

投稿記事 by ptolemy » 11年前

http://dixq.net/g/3d_04.html
のプログラムと

コード:

int speed=1;//動く速さ

X=speed*cos(angleY);
Y=speed*sin(angleY);
X2=speed*sin(angleY);
Y2=speed*-cos(angleY);

if(上を押したら){
playerX+=X2;
playerZ-=X2;
}
if(下を押したら){
上と逆の符号
}
if(左を押したら){
playerX+=X;
playerZ-=Y;
}
if(右を押したら){
左と逆の符号
}

if(左と上、左と下、右と上、右と下のどれかが押されたら){
speed=1;
}
でどうですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#64

投稿記事 by softya(ソフト屋) » 11年前

何度も書いてますがコンパイルの通るコードでお願いしますし、そのコードでうまくいくとは思えません。
もし、自分が過去ログを検索した場合、その様なコードだと不便だと思ったりしますよね? そう思えないようにしないと意味が無いんです。
あとインデントも綺麗だと嬉しいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#65

投稿記事 by ptolemy » 11年前

rotateは、
値を公式に当てはめるみたいな考えでいいですか?



すみません。
今、PCでコピペをした訳ではなく携帯で投稿したので明日、PCからコピペしてきます。
手書きだと大変なので。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#66

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:rotateは、
値を公式に当てはめるみたいな考えでいいですか?
関数は大抵INPUT/OUTPUTがあります。
関数の中身を理解しなくてもINPUT/OUTPUTが分かれば利用できます。

「3d.02 カメラを回転してみよう」の説明の中心はrotate関数です。
中身を理解していなくてもrotateの機能や使い方ぐらいは文章から類推できると思ったんですが難しいでしょうか。

ptolemy さんが書きました: すみません。
今、PCでコピペをした訳ではなく携帯で投稿したので明日、PCからコピペしてきます。
手書きだと大変なので。
そういう事情でしたら、明日お願いします。
解決しかかっていたので、マズイと思った次第です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ptolemy2

Re: DXライブラリ3Dでのカメラの向きと進む向き

#67

投稿記事 by ptolemy2 » 11年前

コード:

#include"DXLib.h"
#include<math.h>
#include"keybord.h"

static	const	float	ROTATE_SPEED=DX_PI/90;//回転スピード
void	rotate(float	*x,float	*y,const	float	ang,float	mx,float	my){
	const	float	ox=*x-mx,oy=*y-my;
	*x=ox*cos(ang)+oy*sin(ang);
		*y=-ox*sin(ang)+oy*cos(ang);
		*x+=mx;
		*y+=my;

}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
	float	cameraX=20,cameraZ=300,sitenC=230,siten2=150.0f;
	float	target1X=20,target1Z=0,target2X=20,target2Z=200,angle1X=0.0f,angle1Y=0.0f,target2Y=0.0f;
	float	speed=1;
	float	ang;
	float	X,Y,X2,Y2,X3,Y3;

	static	int	Model;//3Dモデルの読み込み

	
	SetMousePoint(300,200);
	Model=MV1LoadModel("パス");


	while(ScreenFlip()==0&&ProcessMessage()==0&&ClearDrawScreen()==0){


keybord_Update();

	int	Mouse=GetMouseInput();
	if(Mouse&MOUSE_INPUT_LEFT){
	rotate(&cameraX,&cameraZ,-ROTATE_SPEED,target2X,target2Z);
		angle1Y-=ROTATE_SPEED;
	}
	if(Mouse&MOUSE_INPUT_RIGHT){
	rotate(&cameraX,&cameraZ,+ROTATE_SPEED,target2X,target2Z);
		angle1Y+=ROTATE_SPEED;

	}
	ang=angle1Y;
	SetCameraNearFar(0.1f,1000.0f);//奥行き0.1~1000までをカメラの描画範囲とする。

	
X=speed*cos(ang);
Y=speed*sin(ang);
X2=speed*sin(ang);
Y2=speed*-cos(ang);

	if(keybord_Get(KEY_INPUT_LEFT)>0){
		target2X=target2X+X;
		target2Z=target2Z-Y;
		cameraZ=cameraZ-Y;
		cameraX=cameraX+X;
	}
	if(keybord_Get(KEY_INPUT_DOWN)>0){
		target2X=target2X+X2;
		target2Z=target2Z-Y2;
		cameraZ=cameraZ-Y2;
		cameraX=cameraX+X2;
	
	}
	if(keybord_Get(KEY_INPUT_UP)>0){
		target2X=target2X-X2;
		target2Z=target2Z+Y2;
		cameraZ=cameraZ+Y2;
		cameraX=cameraX-X2;

	}
		if(keybord_Get(KEY_INPUT_RIGHT)>0){
		target2X=target2X-X;
		target2Z=target2Z+Y;
		cameraZ=cameraZ+Y;
		cameraX=cameraX-X;
	}

		if(keybord_Get(KEY_INPUT_LEFT)>0&&keybord_Get(KEY_INPUT_UP)){
		speed=1;
	}
	if(keybord_Get(KEY_INPUT_LEFT)>0&&keybord_Get(KEY_INPUT_DOWN)){
		speed=1;
	}
		if(keybord_Get(KEY_INPUT_RIGHT)>0&&keybord_Get(KEY_INPUT_UP)){
		speed=1;
	}
	if(keybord_Get(KEY_INPUT_RIGHT)>0&&keybord_Get(KEY_INPUT_DOWN)){
		speed=1;
	}

	//cameraX,sitenC,cameraZの地点からtarget2X,siten2,target2Zのターゲットを見る角度にカメラを設置
	SetCameraPositionAndTarget_UpVecY(VGet(cameraX,sitenC,cameraZ),VGet(target2X,siten2,target2Z));
	MV1SetPosition(Model,VGet(target2X,target2Y,target2Z));
	MV1SetRotationXYZ(Model,VGet(angle1X,angle1Y,0.0f));
}




			//3Dモデルの描画

			MV1DrawModel(Model);
			return	0;
			
}




________________________________________________________________________
keybord.cpp



#include"DXLib.h"

static	int	m_Key[256];


void	keybord_Update(){
	char	tmpKey[256];
	GetHitKeyStateAll(tmpKey);
	for(int	i=0;i<256;i++){
		if(tmpKey[i]!=0){
			m_Key[i]++;
		}else{
			m_Key[i]=0;
		}
	}
}
int	keybord_Get(int	KeyCode){
	return	m_Key[KeyCode];
}



________________________________________________________________________
keybord.h




#ifndef	DEF_KEYBORD_H

#define	DEF_KEYBORD_H

void	keybord_Update();

int	keybord_Get(int	KeyCode);

#endif
コピペミスがあったらすみません。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#68

投稿記事 by ptolemy » 11年前

すみません。
PCからコピペしたので名前が違います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#69

投稿記事 by softya(ソフト屋) » 11年前

ptolemy さんが書きました:すみません。
PCからコピペしたので名前が違います。
モデルを指定しても動かないので動作確認したものをお願いします。
動いているなら、ソースコードをzip圧縮して掲示板に添付してもらったほうが早いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#70

投稿記事 by ptolemy » 11年前

あっそのまま添付しても利用規約は、okなんですか?

また明日添付します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#71

投稿記事 by softya(ソフト屋) » 11年前

元々は、このサイトのコードですからね。
添付するのソースコード(.cppと.h)だけでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#72

投稿記事 by ptolemy » 11年前

すみません。

ソースコード以外のものも添付してしまいました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリ3Dでのカメラの向きと進む向き

#73

投稿記事 by softya(ソフト屋) » 11年前

動くことを確認しました。ご協力ありがとうございます。

で、ここからはちゃんと直したほうが良い所です。
・インデントがちゃんとしていないので読みづらいです。
・変数名が不適当なので、何の変数なのか分かりづらい物があります。
・斜めの時はspeedを1にしていると書いてあリましたが、コードを読むと斜めの移動ベクトルを再設定しているコードに成っています。
・play.h player.cppで名前が不統一です。
・player.cppはplayerの処理なのに背景やら敵やらが処理されています。

あと3Dモデルのライセンスを確認して著作権表示が必要ならreadme.txtに記載して添付するようにして下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#74

投稿記事 by ptolemy » 11年前

指摘された点は、修正しておきます。

斜めについてですが、speed=1にしたと書きましたがその後、再度確認したら微妙に速い気がして再設定しました。

アバター
ptolemy
記事: 258
登録日時: 11年前

Re: DXライブラリ3Dでのカメラの向きと進む向き

#75

投稿記事 by ptolemy » 11年前

これでなんとか成功しました。

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

閉鎖

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