DXライブラリ3Dでのカメラの向きと進む向き
DXライブラリ3Dでのカメラの向きと進む向き
DXライブラリで3Dの勉強をしています。
簡単に作ったんですが、キャラの向きと進む向きを同じにしたいです。
プログラムには、上を押したらZ--、下を押したらZ++
などと書きました。
例は、
キャラの向きを左に向けるとキーボードの左を押なければ前に進みません。
キャラが向いている方向に常に
進むときは↑後ろは↓
左右は←→
と決めたいです。
すごく伝えにくいんですが、ご回答お願いします。
操作は、
マウスクリック..方向
D..視点を下げる
U..視点を上げる
J..ジャンプ
矢印..移動
です。
簡単に作ったんですが、キャラの向きと進む向きを同じにしたいです。
プログラムには、上を押したらZ--、下を押したらZ++
などと書きました。
例は、
キャラの向きを左に向けるとキーボードの左を押なければ前に進みません。
キャラが向いている方向に常に
進むときは↑後ろは↓
左右は←→
と決めたいです。
すごく伝えにくいんですが、ご回答お願いします。
操作は、
マウスクリック..方向
D..視点を下げる
U..視点を上げる
J..ジャンプ
矢印..移動
です。
Re: DXライブラリ3Dでのカメラの向きと進む向き
キャラクタが「現在向いている方向(前方)」が3次元空間上でどっち向きなのか を管理し,
上を押したら,「その方向へ」キャラクタを進ませればよいのではないでしょうか.
上を押したら,「その方向へ」キャラクタを進ませればよいのではないでしょうか.
Re: DXライブラリ3Dでのカメラの向きと進む向き
フラグみたいな書き方をすればいいんですね。
しかし、向いている方向は、どう表せばいいんでしょうか?
しかし、向いている方向は、どう表せばいいんでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
方向ベクトルですね。ptolemy さんが書きました:フラグみたいな書き方をすればいいんですね。
しかし、向いている方向は、どう表せばいいんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
2次元で考えると,(3次元でも左右の旋回だけであれば2次元的)
例えば,方向は X-Y平面でのX軸からの角度θ で表すことを考えれば,
左右旋回操作のときには,このθの値を増減させればよいですよね.
この場合,
キャラクタの向いている方向(方角) を表す単位方向ベクトルが欲しいときは u=[ cos(θ), sin(θ) ]^T として得れば良いわけです.
上方向を押されてキャラクタが前進する際には,1回の前進距離がvであれば,
キャラクタのXY座標に,(v * u)を足せば良いということになります.
X,Y成分で別に書けば,
Character_X += v * cos(θ)
Character_Y += v * sin(θ)
ですね.
例えば,方向は X-Y平面でのX軸からの角度θ で表すことを考えれば,
左右旋回操作のときには,このθの値を増減させればよいですよね.
この場合,
キャラクタの向いている方向(方角) を表す単位方向ベクトルが欲しいときは u=[ cos(θ), sin(θ) ]^T として得れば良いわけです.
上方向を押されてキャラクタが前進する際には,1回の前進距離がvであれば,
キャラクタのXY座標に,(v * u)を足せば良いということになります.
X,Y成分で別に書けば,
Character_X += v * cos(θ)
Character_Y += v * sin(θ)
ですね.
Re: DXライブラリ3Dでのカメラの向きと進む向き
すみません。中学生の知識では、理解できなかったです。
かなり混乱中です。
やはり、3Dは、高校まで中断したほうがいいのですか?
ジャンプの考え方のように違うものは、ありませんか?
かなり混乱中です。
やはり、3Dは、高校まで中断したほうがいいのですか?
ジャンプの考え方のように違うものは、ありませんか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
基本的にないと思ってもらったほうが。
それと理系=進学組の選択をしないと高校でも習わないことがありえます(成績が悪いと選ばせても貰えない学校も多数)。
つまり、いつか自分でやるしかないって可能性も有るので、今やっても同じでしょうって事です。
全部を知る必要はないですし、使い方さえ飲み込めば良いんです。
「Flashゲーム講座&ASサンプル集【ベクトルを使ってみよう】」
http://hakuhin.jp/as/vector.html
Flash関係の記事ですが分かりやすい説明だと思います。
考え方の基本はそんなに難しいものではないですよ。
あとサインとコサインは中学で習いませんか?
ここのコンテンツのゲームプログラミングの館にも解説があります。
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/s.13.a.html
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/s.13.b.html
3次元空間を数学的にイメージできるというのは、こういう概念を理解するということです。
【追記】
わくわくシリーズの書籍関連サイトより。
DXライブラリの書籍を出されている方の3Dに関する解説です。下のほうが古いので下のほうから読んでみてください。
「わくわくプログラミング自習室 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
それと理系=進学組の選択をしないと高校でも習わないことがありえます(成績が悪いと選ばせても貰えない学校も多数)。
つまり、いつか自分でやるしかないって可能性も有るので、今やっても同じでしょうって事です。
全部を知る必要はないですし、使い方さえ飲み込めば良いんです。
「Flashゲーム講座&ASサンプル集【ベクトルを使ってみよう】」
http://hakuhin.jp/as/vector.html
Flash関係の記事ですが分かりやすい説明だと思います。
考え方の基本はそんなに難しいものではないですよ。
あとサインとコサインは中学で習いませんか?
ここのコンテンツのゲームプログラミングの館にも解説があります。
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/s.13.a.html
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/s.13.b.html
3次元空間を数学的にイメージできるというのは、こういう概念を理解するということです。
【追記】
わくわくシリーズの書籍関連サイトより。
DXライブラリの書籍を出されている方の3Dに関する解説です。下のほうが古いので下のほうから読んでみてください。
「わくわくプログラミング自習室 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: DXライブラリ3Dでのカメラの向きと進む向き
今中学ではまだ習ってないです。
フラッシュの解説でかなりイメージが持てましたが、全然うまくいきません。
もう3Dを諦めかけていてプログラミングをしてもイライラしかしません。
全然理解できないです。
フラッシュの解説でかなりイメージが持てましたが、全然うまくいきません。
もう3Dを諦めかけていてプログラミングをしてもイライラしかしません。
全然理解できないです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
無理して3Dをやる必要はありませんよ。楽しんでやるべきです。
やる気が起きたら、またチャレンジしてみてださい。
ただ、この壁を超えないとプログラミングで3DをやることやUnity3Dなどのゲームエンジンでも自分で自由自在に3Dを操れるようにはなりません。
2Dのゲームでも極めるにはsin/cosやベクトルは避けて通れません(特にSTGやアクション)。と言うことは理解しておいて下さい。
※ 2日や3日程度で、自由に操れると思うのは急ぎすぎている気もしますけどね。
【補足】
3Dやるなら、やはり数年がかりで悩みながら吸収していくってのは難しんでしょうかね。すぐ出来ないとダメですか?
積み重ねていくしか無いってものもあると思うんですよ。
やる気が起きたら、またチャレンジしてみてださい。
ただ、この壁を超えないとプログラミングで3DをやることやUnity3Dなどのゲームエンジンでも自分で自由自在に3Dを操れるようにはなりません。
2Dのゲームでも極めるにはsin/cosやベクトルは避けて通れません(特にSTGやアクション)。と言うことは理解しておいて下さい。
※ 2日や3日程度で、自由に操れると思うのは急ぎすぎている気もしますけどね。
【補足】
3Dやるなら、やはり数年がかりで悩みながら吸収していくってのは難しんでしょうかね。すぐ出来ないとダメですか?
積み重ねていくしか無いってものもあると思うんですよ。
オフトピック
ギターを買ったら明日には凄いの演奏したい!って言われている感じですかね。
積み重ねの練習しかないですよ。って私は答えるしか無いですが。
積み重ねの練習しかないですよ。って私は答えるしか無いですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
たとえば方角を
{北 北東 東 南東 南 南西 西 北西}の8パターンだけ考えるとして,それをプログラム上で
{0,1,2,3,4,5,6,7}の数字で表すことを考える.
現在の方角を表す値を変数 CurrDir に持つとしたら,
とか書ける.原理はコレ.この理屈がイメージできたならOK.
あとは,
・でもこんな 8方向=45度刻み だと荒すぎて自分のゲームには使えない
→ なら1度刻みの360パターンにすればどうか?
・上のコードのswitch文の分岐は8パターンの時点で既になんだかなぁという感じだし,
この方法で360個にするコードなんて書いてらんない…
→ ではどうやれば楽ができるのか?
…みたいなことを考えて工夫していけばよいです.
で.sinとかcosとかいうのは,こういうときに便利な関数なので,検索などして調べてみるとよいでしょう.
{北 北東 東 南東 南 南西 西 北西}の8パターンだけ考えるとして,それをプログラム上で
{0,1,2,3,4,5,6,7}の数字で表すことを考える.
現在の方角を表す値を変数 CurrDir に持つとしたら,
double X=0,Y=0; //キャラクタの位置
int CurrDir = 0; //キャラクタの向き.(今は0だから北向き)
...
//方向転換
if( 右ボタンが押された )
{
CurrDir++;
if( CurrDir>=8 )CurrDir = 0;
}
//前進
if( 上ボタンが押された )
{
switch( CurrDir ) //現在の向きにあわせてキャラクタ座標を移動させる
{
case 0: Y-=1.0; break; //北
case 1: X+=0.71; Y-=0.71; break; //北東
case 2: X+=1.0; break; //東
...
}
}
あとは,
・でもこんな 8方向=45度刻み だと荒すぎて自分のゲームには使えない
→ なら1度刻みの360パターンにすればどうか?
・上のコードのswitch文の分岐は8パターンの時点で既になんだかなぁという感じだし,
この方法で360個にするコードなんて書いてらんない…
→ ではどうやれば楽ができるのか?
…みたいなことを考えて工夫していけばよいです.
で.sinとかcosとかいうのは,こういうときに便利な関数なので,検索などして調べてみるとよいでしょう.
Re: DXライブラリ3Dでのカメラの向きと進む向き
ありがとうございます。
私が理解したことは、
cos(θ)=x/z
sin(θ)=y/z
x=z*cos(ang)
y=z*sin(ang)
です。
x,yは、プレイヤーx,yが前進した後の点で、zは、点(x,y)と(player_x,player_y)を結んだ線です。
そしてプレイヤーを動かすには、
xとyをプレイヤーの座標に足せばいいということが分かりました。
しかし、これをプログラムで書く書き方が分からないです。
館さんの3D回転のvoid rotate()が理解できないです。
私が理解したことは、
cos(θ)=x/z
sin(θ)=y/z
x=z*cos(ang)
y=z*sin(ang)
です。
x,yは、プレイヤーx,yが前進した後の点で、zは、点(x,y)と(player_x,player_y)を結んだ線です。
そしてプレイヤーを動かすには、
xとyをプレイヤーの座標に足せばいいということが分かりました。
しかし、これをプログラムで書く書き方が分からないです。
館さんの3D回転のvoid rotate()が理解できないです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
これのことでしょうか?
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/3d_02.html
rotateはどちらかと言うと応用編ですね。
まず、思う方に動かすから始めたほうが良いでしょう。
あとrotateを理解するにも色々と方法がありますよ。
printDX()とかで値を表示させてみましたか?
それとポインタを理解してないくて意味不明のところとか大丈夫ですか?
理解の重要点のxについてだけ
(1)ox = *x-mxの意味はなんでしょう?
(2) ox * cos(ang) + oy * sin(ang);で何が求まるでしょう?
(3)*x += mx;は何のために必要でしょう。
【補足】
プログラムを部分部分に分解しながら理解する。printfDX()などで値を確認。紙に数式と値を書いて計算してみる。実際に図に書いて理解する。
などなどを試すことが重要と思います。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/3d_02.html
rotateはどちらかと言うと応用編ですね。
まず、思う方に動かすから始めたほうが良いでしょう。
あとrotateを理解するにも色々と方法がありますよ。
printDX()とかで値を表示させてみましたか?
それとポインタを理解してないくて意味不明のところとか大丈夫ですか?
理解の重要点のxについてだけ
(1)ox = *x-mxの意味はなんでしょう?
(2) ox * cos(ang) + oy * sin(ang);で何が求まるでしょう?
(3)*x += mx;は何のために必要でしょう。
【補足】
プログラムを部分部分に分解しながら理解する。printfDX()などで値を確認。紙に数式と値を書いて計算してみる。実際に図に書いて理解する。
などなどを試すことが重要と思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
どちらかと言うと理解の仕方を学んだほうが良いように思います。ptolemy さんが書きました:全然分からないです。
基本を少し理解しただけなので応用は、さっぱりです。
自分で理解するための方法を考えるんです。
例えばですが2Dで良いので位置ベクトル線をDrawLineで描画して、それに方向ベクトルを加算するのをDrawLineで表示。更にそれを回転させるとか、イメージを自分の身につける方法をかんがえてはどうでしょうか?
回転が難しかったら、usaoさんの方法でも良いですよ。
2Dでもプログラムを組むこと自体が難しかったら、それ以前の勉強をした方が良いかと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
分かりました。
それ以前の勉強をします。
2Dを書いていると混乱してしまい、またイライラします。
プログラミング自体をやめたくなるほどイライラします。
ポインタも理解してないのでいっきにやることが増えてしまって心理的にヤバいです。
それ以前の勉強をします。
2Dを書いていると混乱してしまい、またイライラします。
プログラミング自体をやめたくなるほどイライラします。
ポインタも理解してないのでいっきにやることが増えてしまって心理的にヤバいです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
上にも書きましたがイライラするタメにやるもんじゃないです。ptolemy さんが書きました:分かりました。
それ以前の勉強をします。
2Dを書いていると混乱してしまい、またイライラします。
プログラミング自体をやめたくなるほどイライラします。
ポインタも理解してないのでいっきにやることが増えてしまって心理的にヤバいです。
楽しめない時には止めてみる事です。
何より楽しむことが最重要です。
そうしないと長く続きません。
3Dもそうですが、2Dのゲーム開発でも覚えることが多いのでほんとに色々出来るようになるには何年もかかります。
まず楽しむこと。それが長く続ける秘訣です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
こちらのrotateと比べての事でしょうか?
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/3d_02.html
こちらのrotate()は、任意の座標に有るモデルの周りをカメラがグルグル回るために作られている関数です。
なので、カメラの座標と、回転角とターゲットなるモデルの座標が引数として使われています。
目的と機能が違うので、ゲームプログラミングの館も正解でptolemyさんの物もangの方向に進むと意味で正解です。
ちょっと付け加えるならZと書くよりspeedと書いたほうがより良いかも知れません。
【補足】
1つ前のに回答しておくと、2Dも真上から見た3Dと考えれば同じものです。
x-y平面でしか物事が進行せずzが常に0であると考えれば同じですよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
ありがとうございます。
__________
これを書いたら
angが定義されていません。
と表示されました。
floatで定義すればいいんですか?
_______
ということは2Dが出来たら3Dもできたということですね。
__________
これを書いたら
angが定義されていません。
と表示されました。
floatで定義すればいいんですか?
_______
ということは2Dが出来たら3Dもできたということですね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
> floatで定義すればいいんですか?
こういう事は聞くより試したほうが早いですよ。
ダメならあらためて聞けばよいだけです。
失敗して、あーでもないこーでもないと試行錯誤した時により強く記憶でき、より経験が得られるんですから。
>ということは2Dが出来たら3Dもできたということですね。
出来たとまでは言いませんが、2Dで回転などを自在に操れるなら3Dで迷う部分ははるかに少ないです。
一次元少ないだけで、同じことをやるわけですから。
こういう事は聞くより試したほうが早いですよ。
ダメならあらためて聞けばよいだけです。
失敗して、あーでもないこーでもないと試行錯誤した時により強く記憶でき、より経験が得られるんですから。
>ということは2Dが出来たら3Dもできたということですね。
出来たとまでは言いませんが、2Dで回転などを自在に操れるなら3Dで迷う部分ははるかに少ないです。
一次元少ないだけで、同じことをやるわけですから。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
試してみたところキャラクタが左に動き、定義したangに2を入れて見たら
北西の方向へ動いたので、angにθの値が入ってないことが分かりました。
rotateの中の変数を外で使うには、どうすればいいですか?
北西の方向へ動いたので、angにθの値が入ってないことが分かりました。
rotateの中の変数を外で使うには、どうすればいいですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
> 試してみたところキャラクタが左に動き、定義したangに2を入れて見たら北西の方向へ動いたので、angにθの値が入ってないことが分かりました。
扱うのは国際規格のラジアン角ですので90度とか一般的な学校で習う度数法の角度とは違いますよ。これは普通高校でも習いません。
変換は、ラジアン角 = 角度 / 180.0f * 3.141592f (円周率)となります。
> rotateの中の変数を外で使うには、どうすればいいですか?
そもそもrotateの中の変数を使う必要があるんでしょうか?
値の保つ意味が違えば、それは別の変数ですね。別に定義すればよいものです。
あとrotateは引数でangを受け取っているので、そもそも外部の変数か定数なのでは?
扱うのは国際規格のラジアン角ですので90度とか一般的な学校で習う度数法の角度とは違いますよ。これは普通高校でも習いません。
変換は、ラジアン角 = 角度 / 180.0f * 3.141592f (円周率)となります。
> rotateの中の変数を外で使うには、どうすればいいですか?
そもそもrotateの中の変数を使う必要があるんでしょうか?
値の保つ意味が違えば、それは別の変数ですね。別に定義すればよいものです。
あとrotateは引数でangを受け取っているので、そもそも外部の変数か定数なのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
また自分でangを示せばいいんですね。
前の三つの質問を考えてみたんですがあってますか?
(1)三角形(mx,my)(x,y)(ox,oy)のoxの座標を示している。
(2)ox,oyの位置が分かる。
(3)分からないです。
(2)も自信がないです。
前の三つの質問を考えてみたんですがあってますか?
(1)三角形(mx,my)(x,y)(ox,oy)のoxの座標を示している。
(2)ox,oyの位置が分かる。
(3)分からないです。
(2)も自信がないです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
(1)をまず考えてみましょう。
oxは不明として、*xあるいはxは何を表しますか? じゃあmxってなんでしょうか?
そもそも、ここまで分解して考えてみました? 要素一つ一つを理解しないと全体は見えてきませんよ。
oxは不明として、*xあるいはxは何を表しますか? じゃあmxってなんでしょうか?
そもそも、ここまで分解して考えてみました? 要素一つ一つを理解しないと全体は見えてきませんよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
mxを中心としてxを動かすと書いていたので、mxがプレイヤーでxがその周りの点だと思います。
_______
いろいろ試しましたが最終的にangを示すことに突き当たりました。
angは、
cos(ang)=X/speed
sin(ang)=Y/speed
で示せばいいんですよね?
_______
いろいろ試しましたが最終的にangを示すことに突き当たりました。
angは、
cos(ang)=X/speed
sin(ang)=Y/speed
で示せばいいんですよね?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
元のコード自身が解説になっているんですよ。ptolemy さんが書きました:mxを中心としてxを動かすと書いていたので、mxがプレイヤーでxがその周りの点だと思います。
その周りの点とはなんでしょうか? 具体的なものを書いてくださいね。
その点って何に使うものですか?
mxがプレイヤーというのも言葉的にはチョット意味が違います。
プレーヤーとは自分が操作できるキャラクタを指しますよね。
この場合はデモでゲームじゃないのでプレーヤーと呼んでいるモデルは動かせません。
なので、プレーヤーという表現に違和感を感じます。
えーと、何を求めたいのでしょうか?ptolemy さんが書きました: いろいろ試しましたが最終的にangを示すことに突き当たりました。
angは、
cos(ang)=X/speed
sin(ang)=Y/speed
で示せばいいんですよね?
angは既にあって、angの方向に移動したんじゃないでしょうか。
やるべきことが整理されていない印象です。
とりあえず色々変える前に元々やりたかった事を再確認して下さい。
プログラミングにおいて目的を見失わないために非常に重要です。
最初の質問に立ち返って、キャラが向いている方向がangなのではないですか?
X=speed*cos(ang);
Y=speed*sin(ang);
から変える必要性があったのは何故ですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
周りの点とは、向いている方向だと思います。
X=speed*cos(ang);
Y=speed*sin(ang);
は変えてないです。
X=speed*cos(ang);
Y=speed*sin(ang);
と
Player_x =Player_x +X;
Player_y =Player_y +Y;
を書いても決まった方向にしか動かったので何か足りないのかと思って質問しました。
X=speed*cos(ang);
Y=speed*sin(ang);
は変えてないです。
X=speed*cos(ang);
Y=speed*sin(ang);
と
Player_x =Player_x +X;
Player_y =Player_y +Y;
を書いても決まった方向にしか動かったので何か足りないのかと思って質問しました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
> 周りの点とは、向いている方向だと思います。
そこの理解が、そもそも違っています。ソースコードを見なおしてみてください。
モデルの向きが変化するコードが書かれていますか?
>を書いても決まった方向にしか動かったので何か足りないのかと思って質問しました。
angの方向にしか進みません。つまりangとキャラの向きは一致していないといけません。
そこの理解が、そもそも違っています。ソースコードを見なおしてみてください。
モデルの向きが変化するコードが書かれていますか?
>を書いても決まった方向にしか動かったので何か足りないのかと思って質問しました。
angの方向にしか進みません。つまりangとキャラの向きは一致していないといけません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
書いていませんね。
_______________
angを定義するのは、
float ang;
だけだと駄目ですよね?
また、rotate関数は、簡単にどういった使い方をするのでしょうか?
_______________
angを定義するのは、
float ang;
だけだと駄目ですよね?
また、rotate関数は、簡単にどういった使い方をするのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
書いていませんよね。ptolemy さんが書きました:書いていませんね。
じゃあ、変化しているのは何でしょうか?
値は何時入れるんでしょうか。勝手に値は入りません。ptolemy さんが書きました: angを定義するのは、
float ang;
だけだと駄目ですよね?
例えるなら、コップを置いておいても勝手には水は入ってくれません。
サンプルを実行してみたら分かりませんか?ptolemy さんが書きました: また、rotate関数は、簡単にどういった使い方をするのでしょうか?
あるいは、変化する値をprintfDXで見ても分かりませんか?
自分で考えてできるだけの事をしないで質問しても本当の理解には繋がりません。
分かった気になるだけなので、ご自身のためになりませんよ。
すごく短いプログラムなので、解読すべき点はそんなに多くないですよ。
そもそも日本語で解説されている気がするんですが。
その解説を見てプログラムを見てわからないのなら、プログラムを全然読めていないことになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
キャラクタが動くべき方向ですか?
_______________
キャラクタを回すと変わるangleYをangの代わりに入れてみたら向いた方向の左に動きました。
なのでキャラクタが前を向いた方向の左に動いたということは、動く向きとキャラクタの向きに差があることが分かりました。
angとangleYは、果たす役割が違いますが、別にこの方法でいいですか?
_______________
キャラクタを回すと変わるangleYをangの代わりに入れてみたら向いた方向の左に動きました。
なのでキャラクタが前を向いた方向の左に動いたということは、動く向きとキャラクタの向きに差があることが分かりました。
angとangleYは、果たす役割が違いますが、別にこの方法でいいですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
ソースコードを見せてもらっていないのでangとangleYが違うのかどうかが私には判別できません。ptolemy さんが書きました:キャラクタが動くべき方向ですか?
_______________
キャラクタを回すと変わるangleYをangの代わりに入れてみたら向いた方向の左に動きました。
なのでキャラクタが前を向いた方向の左に動いたということは、動く向きとキャラクタの向きに差があることが分かりました。
angとangleYは、果たす役割が違いますが、別にこの方法でいいですか?
ただ、90度ずれているみたいなので、sin/cosが逆に使われている可能性を考えた方がよいかもです。
つまり
X=speed*sin(angleY);
Y=speed*cos(angleY);
が正しいのかもしれません。
【補足】
確認してないので±符号が逆かもしれません。向いた方向の後ろに進んだら符号が逆って事です。
【補足の補足】
大雑把な説明ですがsinとcosは90度ずれた値を返す関数なので、予定と90度ずれたらsinとcosを入れ替えること考えたほうが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
日本語の解説自体を理解しているか不安なのでsoftya(ソフト屋) さんが書きました:書いていませんよね。ptolemy さんが書きました:書いていませんね。
じゃあ、変化しているのは何でしょうか?
サンプルを実行してみたら分かりませんか?ptolemy さんが書きました: また、rotate関数は、簡単にどういった使い方をするのでしょうか?
あるいは、変化する値をprintfDXで見ても分かりませんか?
自分で考えてできるだけの事をしないで質問しても本当の理解には繋がりません。
分かった気になるだけなので、ご自身のためになりませんよ。
すごく短いプログラムなので、解読すべき点はそんなに多くないですよ。
そもそも日本語で解説されている気がするんですが。
その解説を見てプログラムを見てわからないのなら、プログラムを全然読めていないことになります。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/3d_02.html
ここの日本語解説を要約して、このサンプルのしている事を書いてみてください。
※ ソースコードを読むんじゃなくて日本語解説だけの要約です。
あと重要キーワードを抽出して書き出してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
説明とは、
ソースコード中の//の解説ですか?
それともソースコード外の説明ですか?
わかりずらかったので
ソースコード中の//の解説ですか?
それともソースコード外の説明ですか?
わかりずらかったので
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
ソースコード外の部分だけです。ptolemy さんが書きました:説明とは、
ソースコード中の//の解説ですか?
それともソースコード外の説明ですか?
わかりずらかったので
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
angleYに90°のラジアン角を引いたら差がなくなりできました。
______________
要約
[
座標は、回転移動の一時関数の計算式で求められ、それをrotate関数として作る。
モデルをY軸を基準として回転させると平面は、X-Zになる。
左キー、右キーを押されているとrotate関数をコールし、カメラの座標を表す変数を更新する。
]
______________
要約
[
座標は、回転移動の一時関数の計算式で求められ、それをrotate関数として作る。
モデルをY軸を基準として回転させると平面は、X-Zになる。
左キー、右キーを押されているとrotate関数をコールし、カメラの座標を表す変数を更新する。
]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
>angleYに90°のラジアン角を引いたら差がなくなりできました。
90がマジックナンバー(魔法数字)ですね。
マジックナンバーは、他の人から分かりづらいし、自分が後から見ても分かりづらいです。
sin/cosの式の方を直しましょう。直し方は書いたつもりなんですが。
大事な点が抜けて、いらない説明が入っています。つまり要点が掴めていない気がします。
90がマジックナンバー(魔法数字)ですね。
マジックナンバーは、他の人から分かりづらいし、自分が後から見ても分かりづらいです。
sin/cosの式の方を直しましょう。直し方は書いたつもりなんですが。
この要約、このプログラムの機能を説明してませんので、何をするプログラムかわかりません。要約
[
座標は、回転移動の一時関数の計算式で求められ、それをrotate関数として作る。
モデルをY軸を基準として回転させると平面は、X-Zになる。
左キー、右キーを押されているとrotate関数をコールし、カメラの座標を表す変数を更新する。
]
大事な点が抜けて、いらない説明が入っています。つまり要点が掴めていない気がします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
sinとcosを入れ替えても行かなかったので別に考えました。
[要約2]
Y軸を中心とし、カメラの座標を回転させる。
ですか?
[要約2]
Y軸を中心とし、カメラの座標を回転させる。
ですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
別の方法を考えるのは良いことです。ptolemy さんが書きました:sinとcosを入れ替えても行かなかったので別に考えました。
ただ、行き当たりばったりな対処になると自分が後で苦労します。
元の方法より良いって方法ならOKです。
この要約見て、何のことかわかりますか?ptolemy さんが書きました: [要約2]
Y軸を中心とし、カメラの座標を回転させる。
ですか?
あるいは、同じ動作をするプログラムを組めるでしょうか。
要約ポイントがズレている証拠です。
【補足】
要約にチャレンジしてもらっているのは、プログラムを組むときに要約できていないようなら文章を読み取れていないって事ですので、
仕様に基づいたプログラムを組むことも出来ませんし、プログラムの解読も困難です。
プログラミングと言うのは文章を理解したり、文章を組み立てたりに近い部分が有るので、これが苦手だとプログラミングでも苦労します。
と言うことでトレーニングしてもらっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
[要約3]
targetYを中心にcameraX,Yを左右キーで回転させる。
ですか?
targetYを中心にcameraX,Yを左右キーで回転させる。
ですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
それはrotateの要約に近いです。ptolemy さんが書きました:[要約3]
targetYを中心にcameraX,Yを左右キーで回転させる。
ですか?
それだとtargetYは何?とかcameraX,Yが回転するとどんな事が起こるかの説明が抜け落ちます。
targetYだけですか? ってのもあるかな。
※ ちなみにcameraX,Yがただ変化しても、このサンプルのような動きにはなりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
[要約4]
プレイヤーの座標、XYZを中心にカメラの座標、XYを360°左右キーで自由に回転させる。
でどうですか?
プレイヤーの座標、XYZを中心にカメラの座標、XYを360°左右キーで自由に回転させる。
でどうですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
惜しいです。カメラに関してもう一言欲しいです。
あと、rotate関数の入力と出力の部分だけを別に要約してみてください。
【補足】
例の移動方向ですが、説明した通り90の即値はやめて下さいね。
完成したプログラムコードを張るのもお願いします。
あと、rotate関数の入力と出力の部分だけを別に要約してみてください。
【補足】
例の移動方向ですが、説明した通り90の即値はやめて下さいね。
完成したプログラムコードを張るのもお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
[要約]
カメラの視線の先ターゲットの座標、XYZを中心にカメラの座標、XYを360°左右キーで自由に回転させる。
[rotate]
回転移動の1次関数の計算式を入力し、左右キーが押されているとrotate関数を出力する。
[補足について]
以前も書きましたが、sinとcosを入れ替えてもいかなかったのでまだマジックナンバーのままです。
カメラの視線の先ターゲットの座標、XYZを中心にカメラの座標、XYを360°左右キーで自由に回転させる。
[rotate]
回転移動の1次関数の計算式を入力し、左右キーが押されているとrotate関数を出力する。
[補足について]
以前も書きましたが、sinとcosを入れ替えてもいかなかったのでまだマジックナンバーのままです。
Re: DXライブラリ3Dでのカメラの向きと進む向き
>上にも書きましたがイライラするタメにやるもんじゃないです。
>楽しめない時には止めてみる事です。
>何より楽しむことが最重要です。
>そうしないと長く続きません。
>3Dもそうですが、2Dのゲーム開発でも覚えることが多いのでほんとに色々出来るようになるには何年もかかります。
>まず楽しむこと。それが長く続ける秘訣です。
ただやみくもにやったり努力しただけでは目的は達成できません><
なぜなら効率が悪いからです。効率がいい方法を選んでこそ障害や壁が少なくなり目的が達成しやすくなります。
例えばやみくもに絶食ダイエットしても成功しないようなことと同じです。
1:基礎代謝である1500kcal以下までなら食べても太らない。
2:筋肉を付けると基礎代謝の上限が上がる
3:マイナス4200kcalで1kg減る
この3つのことさえ知ってれば効率的にダイエットができるのにその方法を選ばないというのは愚かです。
努力は効率が悪いのでやらなくてもいいです。効率が悪い方法を選ぶとそれだけ
時間の無駄になるし目的が達成しにくくなります。
ちなみにこの考え方ができるには高学歴の人に多いわけです
>楽しめない時には止めてみる事です。
>何より楽しむことが最重要です。
>そうしないと長く続きません。
>3Dもそうですが、2Dのゲーム開発でも覚えることが多いのでほんとに色々出来るようになるには何年もかかります。
>まず楽しむこと。それが長く続ける秘訣です。
ただやみくもにやったり努力しただけでは目的は達成できません><
なぜなら効率が悪いからです。効率がいい方法を選んでこそ障害や壁が少なくなり目的が達成しやすくなります。
例えばやみくもに絶食ダイエットしても成功しないようなことと同じです。
1:基礎代謝である1500kcal以下までなら食べても太らない。
2:筋肉を付けると基礎代謝の上限が上がる
3:マイナス4200kcalで1kg減る
この3つのことさえ知ってれば効率的にダイエットができるのにその方法を選ばないというのは愚かです。
努力は効率が悪いのでやらなくてもいいです。効率が悪い方法を選ぶとそれだけ
時間の無駄になるし目的が達成しにくくなります。
ちなみにこの考え方ができるには高学歴の人に多いわけです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
そうです。やっと必要な情報が全て盛り込まれました。[要約]
カメラの視線の先ターゲットの座標、XYZを中心にカメラの座標、XYを360°左右キーで自由に回転させる。
計算式は入力しません。rotateの引数と関数の中の動作を書いて下さい。[rotate]
回転移動の1次関数の計算式を入力し、左右キーが押されているとrotate関数を出力する。
rotate内でキー入力してませんよ。
どう、うまく行かなかったか説明してもらっていないので回答しようがないですね。マイナス符号を付けてもダメだったんでしょうか。[補足について]
以前も書きましたが、sinとcosを入れ替えてもいかなかったのでまだマジックナンバーのままです。
方向が違うだけなら、それで解決するんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
プログラミングの掲示板ですので、プログラミング全部を否定されるとこの掲示板の意味がなくなります。ジルコニア さんが書きました:>上にも書きましたがイライラするタメにやるもんじゃないです。
>楽しめない時には止めてみる事です。
>何より楽しむことが最重要です。
>そうしないと長く続きません。
>3Dもそうですが、2Dのゲーム開発でも覚えることが多いのでほんとに色々出来るようになるには何年もかかります。
>まず楽しむこと。それが長く続ける秘訣です。
ただやみくもにやったり努力しただけでは目的は達成できません><
なぜなら効率が悪いからです。効率がいい方法を選んでこそ障害や壁が少なくなり目的が達成しやすくなります。
例えばやみくもに絶食ダイエットしても成功しないようなことと同じです。
1:基礎代謝である1500kcal以下までなら食べても太らない。
2:筋肉を付けると基礎代謝の上限が上がる
3:マイナス4200kcalで1kg減る
この3つのことさえ知ってれば効率的にダイエットができるのにその方法を選ばないというのは愚かです。
努力は効率が悪いのでやらなくてもいいです。効率が悪い方法を選ぶとそれだけ
時間の無駄になるし目的が達成しにくくなります。
ちなみにこの考え方ができるには高学歴の人に多いわけです
全てを否定したいのであれば、別の掲示板に行かれては如何でしょうか。
それと内容が「円滑なコミュニケーションを心がけない行為」に該当する部分がありますので、やめて頂きたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
すみませんrotateは、考え中なので次の返信で書きます。
補足について
90度ずれているので
X=speed*cos(angleY);
Y=speed*sin(angleY);
を
X=speed*sin(angleY);
Y=speed*cos(angleY);
と書いたんですがどの向きでも右斜めにしか進まなかったです。
とりあえず現状は、 で左右は、完成しております。
補足について
90度ずれているので
X=speed*cos(angleY);
Y=speed*sin(angleY);
を
X=speed*sin(angleY);
Y=speed*cos(angleY);
と書いたんですがどの向きでも右斜めにしか進まなかったです。
とりあえず現状は、 で左右は、完成しております。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
コード全体を見せてもらえますか。検証してみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
テキストにまとめました。
hやcppのままの方が良かったですか?
他に欲しいファイルがありましたらよろしくお願いします。
hやcppのままの方が良かったですか?
他に欲しいファイルがありましたらよろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
コピペミスがあるのか、コンパイルが通らないので元のままが良かったですね。
【補足】
ちなみに、ang=angle1Y-90.0/180.0f*3.141592f;は演算順位の関係で思った結果になっていませんよ。
中学の数学?で習うと思いますが足し算・引き算よりも掛け算・割り算は先に計算されます。
【訂正】 あっと、そうか勘違いでした。 出来ればカッコで囲みましょう。 ラジアン角の変換しているだけなのか。
【追記】
X2=speed*sin(angle1Y);
Y2=speed*-cos(angle1Y);
とすれば、-90しなくてもちゃんと動くと思います。
sin/cosを入れ替えて、cos()の側の符号反転しただけです。
【追記】
後々修正しやすいように計算を直してみました。
斜め移動の速度も√2倍にならないようにしてます。 ※見せてもらったコードはナナメに√2倍の速度で移動しています。
これ以外にも移動する方法は幾つか有るので、考えてみてください。ベクトルの正規化も必要のない方法もあります。
【補足】
ちなみに、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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
符号の優先順位に気がつきませんでした。
sinとcosを逆にして、符号を変えたらマジックナンバーを使わずできました。
確かに斜めのspeedが2になってますね。
修正してみます。
sinとcosを逆にして、符号を変えたらマジックナンバーを使わずできました。
確かに斜めのspeedが2になってますね。
修正してみます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
2Dでも使う方法ですが、8方向別々に処理するって方法があります。if文の工夫が必要です。ptolemy さんが書きました:符号の優先順位に気がつきませんでした。
sinとcosを逆にして、符号を変えたらマジックナンバーを使わずできました。
確かに斜めのspeedが2になってますね。
修正してみます。
あるいは方向をビット演算して方向別に配列のデータを持つという方法もあるのですが、効率では一番よいですがビット演算などビットの理解が必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
>プログラミングの掲示板ですので、プログラミング全部を否定されるとこの掲示板の意味がなくなります。
>全てを否定したいのであれば、別の掲示板に行かれては如何でしょうか。
soft屋さんの仰るとうりよくよく考えれば荒らし的な行為をしてしまいました。
申し訳ございませんでした。
さんざんこの掲示板にお世話になっておいて手のひらを返すような発言をするなんて
人として最悪ですよね。この事に関して考えが及びませんでした。すいません。
この件に関してはもうここでは一切言及しません。どうかお許し下さい
>全てを否定したいのであれば、別の掲示板に行かれては如何でしょうか。
soft屋さんの仰るとうりよくよく考えれば荒らし的な行為をしてしまいました。
申し訳ございませんでした。
さんざんこの掲示板にお世話になっておいて手のひらを返すような発言をするなんて
人として最悪ですよね。この事に関して考えが及びませんでした。すいません。
この件に関してはもうここでは一切言及しません。どうかお許し下さい
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
掲示板の存在意図から外れことは気をつけて頂ければと思います。 ジルコニアさんも誰かの作ったゲームエンジンやサンプルや解説や公開スクリプトに助けられている存在だということは忘れないで下さい。ジルコニア さんが書きました:>プログラミングの掲示板ですので、プログラミング全部を否定されるとこの掲示板の意味がなくなります。
>全てを否定したいのであれば、別の掲示板に行かれては如何でしょうか。
soft屋さんの仰るとうりよくよく考えれば荒らし的な行為をしてしまいました。
申し訳ございませんでした。
さんざんこの掲示板にお世話になっておいて手のひらを返すような発言をするなんて
人として最悪ですよね。この事に関して考えが及びませんでした。すいません。
この件に関してはもうここでは一切言及しません。どうかお許し下さい
誰も解説やスクリプトを公開してくれなければジルコニアさんの方法論は通用しません。ゲームエンジンやサンプルやスクリプトは誰かが1からプログラミングしています。プログラミング技術に感謝すべき所はあっても否定される理由はないはずです。
ここはptolemy さんのトピックですので、関係ない話題はこれにて終了とさせていただきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
斜めのバグは、8方位で考えて制御しました。
___________________
rotateについてですが、
カメラの座標、回転スピード、ターゲットの座標をrotateの変数に入力する。
でいいですか?
______________________
また、
プレイヤーの地点から弾を前に飛ばす
ということについて質問があるんですが、新しくトピックを作った方がいいですか?
___________________
rotateについてですが、
カメラの座標、回転スピード、ターゲットの座標をrotateの変数に入力する。
でいいですか?
______________________
また、
プレイヤーの地点から弾を前に飛ばす
ということについて質問があるんですが、新しくトピックを作った方がいいですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
コードを公開してくださいね。他の人の参考にするためルール化されております。ptolemy さんが書きました:斜めのバグは、8方位で考えて制御しました。
INPUTはそれで正しいですね。ptolemy さんが書きました: ___________________
rotateについてですが、
カメラの座標、回転スピード、ターゲットの座標をrotateの変数に入力する。
でいいですか?
______________________
でも、OUTPUTの説明も欲しいです。
長くなってきたので別トピックでお願いします。ptolemy さんが書きました: また、
プレイヤーの地点から弾を前に飛ばす
ということについて質問があるんですが、新しくトピックを作った方がいいですか?
3Dの場合、弾の当たり判定とか色々と難しいですけどね。
【補足】 そろそれ関数分けしないとぐちゃぐちゃの修正の困難なソースコードになってきます。特に他の人が見るのが困難なりますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
8方向のソースコードはすぐにおねがいしますね。
> 出力は、どう書けばいいか分からないです。
では、rotateは入力をどのように加工する関数でしょうか?
> 出力は、どう書けばいいか分からないです。
では、rotateは入力をどのように加工する関数でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
入力を定義する関数。
ですか?
8方位は、
斜めが押されたらspeed=1;
と四つ書いてみたら同じ速さになりました。
ですか?
8方位は、
斜めが押されたらspeed=1;
と四つ書いてみたら同じ速さになりました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
いえ違いますよ。ptolemy さんが書きました:入力を定義する関数。
ですか?
今の時点で「入力を定義する」と言う具体的な動作を説明できますか?
第3者にも分かるあいまいな要素のないものを提示して下さい。そのまま動いて、ちゃんと見れるソースコードの掲示がベストです。ptolemy さんが書きました: 8方位は、
斜めが押されたらspeed=1;
と四つ書いてみたら同じ速さになりました。
http://dixq.net/board/board.html
以下引用
前に提示されたコードもコンパイルが通らない不完全なものですから、この条件は満たされておりません。[C言語何でも質問掲示板でのみ適用される事項]
・トピックを立て、解決した場合は「解決しました」とだけ書かず、どうやって解決したか他の人に分かるように書いて からトピックを終了して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
http://dixq.net/g/3d_04.html
のプログラムと でどうですか?
のプログラムと でどうですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
何度も書いてますがコンパイルの通るコードでお願いしますし、そのコードでうまくいくとは思えません。
もし、自分が過去ログを検索した場合、その様なコードだと不便だと思ったりしますよね? そう思えないようにしないと意味が無いんです。
あとインデントも綺麗だと嬉しいです。
もし、自分が過去ログを検索した場合、その様なコードだと不便だと思ったりしますよね? そう思えないようにしないと意味が無いんです。
あとインデントも綺麗だと嬉しいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
rotateは、
値を公式に当てはめるみたいな考えでいいですか?
すみません。
今、PCでコピペをした訳ではなく携帯で投稿したので明日、PCからコピペしてきます。
手書きだと大変なので。
値を公式に当てはめるみたいな考えでいいですか?
すみません。
今、PCでコピペをした訳ではなく携帯で投稿したので明日、PCからコピペしてきます。
手書きだと大変なので。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
関数は大抵INPUT/OUTPUTがあります。ptolemy さんが書きました:rotateは、
値を公式に当てはめるみたいな考えでいいですか?
関数の中身を理解しなくてもINPUT/OUTPUTが分かれば利用できます。
「3d.02 カメラを回転してみよう」の説明の中心はrotate関数です。
中身を理解していなくてもrotateの機能や使い方ぐらいは文章から類推できると思ったんですが難しいでしょうか。
そういう事情でしたら、明日お願いします。ptolemy さんが書きました: すみません。
今、PCでコピペをした訳ではなく携帯で投稿したので明日、PCからコピペしてきます。
手書きだと大変なので。
解決しかかっていたので、マズイと思った次第です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
#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
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
モデルを指定しても動かないので動作確認したものをお願いします。ptolemy さんが書きました:すみません。
PCからコピペしたので名前が違います。
動いているなら、ソースコードをzip圧縮して掲示板に添付してもらったほうが早いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
元々は、このサイトのコードですからね。
添付するのソースコード(.cppと.h)だけでお願いします。
添付するのソースコード(.cppと.h)だけでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリ3Dでのカメラの向きと進む向き
動くことを確認しました。ご協力ありがとうございます。
で、ここからはちゃんと直したほうが良い所です。
・インデントがちゃんとしていないので読みづらいです。
・変数名が不適当なので、何の変数なのか分かりづらい物があります。
・斜めの時はspeedを1にしていると書いてあリましたが、コードを読むと斜めの移動ベクトルを再設定しているコードに成っています。
・play.h player.cppで名前が不統一です。
・player.cppはplayerの処理なのに背景やら敵やらが処理されています。
あと3Dモデルのライセンスを確認して著作権表示が必要ならreadme.txtに記載して添付するようにして下さい。
で、ここからはちゃんと直したほうが良い所です。
・インデントがちゃんとしていないので読みづらいです。
・変数名が不適当なので、何の変数なのか分かりづらい物があります。
・斜めの時はspeedを1にしていると書いてあリましたが、コードを読むと斜めの移動ベクトルを再設定しているコードに成っています。
・play.h player.cppで名前が不統一です。
・player.cppはplayerの処理なのに背景やら敵やらが処理されています。
あと3Dモデルのライセンスを確認して著作権表示が必要ならreadme.txtに記載して添付するようにして下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリ3Dでのカメラの向きと進む向き
指摘された点は、修正しておきます。
斜めについてですが、speed=1にしたと書きましたがその後、再度確認したら微妙に速い気がして再設定しました。
斜めについてですが、speed=1にしたと書きましたがその後、再度確認したら微妙に速い気がして再設定しました。