見ているモデルを中心にカメラを回転させたい(DXLib)
見ているモデルを中心にカメラを回転させたい(DXLib)
カメラが常に3Dモデルの背中を見ているようにしたいのですが、
カメラの視点を回転することができても、カメラの位置を回転させることができません!
モデルが回転したらそれと同じ回転量でカメラをモデル中心で回転させたいです。
後、ひとつカメラのことでは、ありませんが・・・
UPボタンを押したときにZを足して移動させているのですが、
それでは、モデルの向きが変わった場合にモデルが進行方向に進みません。
できたら、モデルの向きに進ませたいのですが、それは、どうしたらいいですか?
カメラの視点を回転することができても、カメラの位置を回転させることができません!
モデルが回転したらそれと同じ回転量でカメラをモデル中心で回転させたいです。
後、ひとつカメラのことでは、ありませんが・・・
UPボタンを押したときにZを足して移動させているのですが、
それでは、モデルの向きが変わった場合にモデルが進行方向に進みません。
できたら、モデルの向きに進ませたいのですが、それは、どうしたらいいですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
とりあえず、自キャラやカメラのプログラムがどうなっているかわからないと答え様が無さそうです。
出来れば、モデルデータ不要なコンパクトな実験プログラムにしてもらうと答えやすくなるでしょう。
出来れば、モデルデータ不要なコンパクトな実験プログラムにしてもらうと答えやすくなるでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
え~と・・・
こぴぺですが
こぴぺですが
#include "DxLib.h"
int Key[256];
int gpKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int WINAPI WinMain( HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),SetWindowText("衝突判定"),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
int Model,Model2,wall_flag=0,T;
float y,x,z,Y;
int AttachIndex,Attack=0,Attack_flag=0;
float TotalTime,PlayTime,p=0.0f,HRotate=0.0f;
VECTOR StartPos, EndPos,StartPos2,EndPos2,CameraStartPos;
MV1_COLL_RESULT_POLY HitPoly,HitPoly2;
Model= MV1LoadModel( "Model/Model.mqo" );
Model2=MV1LoadModel("attackModel/human.pmd");
MV1SetPosition( Model, VGet( 320.0f, 0.0f, 600.0f ) ) ;
MV1SetupCollInfo( Model,0,8,1,8) ;
MV1SetScale(Model2,VGet(10.0f,10.0f,10.0f));
y=0.0f;
x=0.0f;
z=600.0f;
T=MV1GetTextureNum(Model);
AttachIndex=MV1AttachAnim(Model2,0,-1,FALSE);
TotalTime=MV1GetAttachAnimTotalTime(Model2,AttachIndex);
PlayTime=0.0f;
MV1SetAttachAnimTime(Model2,AttachIndex,PlayTime);
while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0&&gpKey()==0){
CameraStartPos=VGet(x,y+300.0f,z+600.0f);
SetCameraPositionAndTarget_UpVecY(CameraStartPos,VGet(x,y,z));//一応ここでカメラの設定をしてます
MV1SetPosition(Model2,VGet(x,y,z));
if(wall_flag!=1){
if( Key[ KEY_INPUT_UP ] >= 1 )
z -= 5.0f ;
}
if(wall_flag!=2){ //もし壁に当たっていたら処理させないようにしてます
if( Key[KEY_INPUT_DOWN ]>=1)
z += 5.0f ; //ここでZをプラスしています
}
if(Key[KEY_INPUT_LEFT]>=1){
p-=0.1f;
MV1SetRotationXYZ(Model2,VGet(0.0f,p,0.0f));//ここで、モデルを回転させてます(ここで一緒にカメラを回転させたいです
}
if(Key[KEY_INPUT_RIGHT]>=1){
p+=0.1f;
MV1SetRotationXYZ(Model2,VGet(0.0f,p,0.0f));//ここでも同じく回転(ここでも一緒に回転させたいです。
}
if(Attack_flag==0){
if(Key[KEY_INPUT_L]>=1){
Attack=1;
}
}
if(Attack==1){
Attack_flag=1;
PlayTime++;
MV1SetAttachAnimTime(Model2,AttachIndex,PlayTime);
if(CheckSoundFile()==0){
if(PlayTime>=10){
if(HitPoly2.HitFlag==1)
PlaySoundFile("attackModel/金属音.wav",DX_PLAYTYPE_BACK);
if(HitPoly2.HitFlag==0)
PlaySoundFile("attackModel/斬れた.wav",DX_PLAYTYPE_BACK);
}
}
if(PlayTime>=TotalTime){
Attack=0;
Attack_flag=0;
PlayTime=0.0f;
}
}
MV1DrawModel(Model);
MV1DrawModel(Model2);
StartPos = VGet( x, y, z ) ;
EndPos = VGet( x, y-20.0f,z ) ;
HitPoly = MV1CollCheck_Line( Model, 0, StartPos, EndPos ) ;
StartPos2=VGet(x,y+20,z);
EndPos2=VGet(x,y+20,z+30);
HitPoly2=MV1CollCheck_Line(Model,0,StartPos2,EndPos2);
DrawLine3D( StartPos, EndPos, GetColor( 255,255,0 ) ) ;
DrawLine3D( StartPos2,EndPos2,GetColor( 255,0,0));
DrawLine3D( CameraStartPos,EndPos,GetColor(255,0,0));
if(HitPoly.HitFlag==1)
EndPos=HitPoly.HitPosition;
if(HitPoly2.HitFlag==1)
EndPos2=HitPoly.HitPosition;
Y=StartPos.y-EndPos.y;
if(HitPoly2.HitFlag==1){
wall_flag=1;
}
else{
wall_flag=0;
}
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "HIT:%d", HitPoly2.HitFlag ) ;
DrawFormatString( 0, 50,GetColor(255,255,255)," %s",MV1GetTextureName(T,1));
DrawFormatString(0,30,GetColor(255,255,255),"距離:%f",Y);
if(HitPoly.HitFlag==0)
y-=15;
if(Y<=16)
y+=(17.5f-Y);
}
DxLib_End();
return 0;
}
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
まだまだ初心者なもので・・・
よくわからないので、簡単なコードをかいてくれたらありがたいです
よくわからないので、簡単なコードをかいてくれたらありがたいです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
それは、まず聞かずに自分でまず書いてみるべきだと思います。EIYUU さんが書きました:まだまだ初心者なもので・・・
よくわからないので、簡単なコードをかいてくれたらありがたいです
数学的な問題なので、プログラミング初心者とか関係ないと思いますので。
数学的に、カメラの位置を求める式をまず書いてみて下さい。
行列でやる方法も考えたのですが、三角関数で数学的にやるほうが初心者向けかなと思いました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
すみません
三角関数がまだあまりわかっていません
距離は、求められますが、位置までは・・・・
三角関数がまだあまりわかっていません
距離は、求められますが、位置までは・・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
そういうことなら、なおさら数学の勉強が必要だと思います。EIYUU さんが書きました:すみません
三角関数がまだあまりわかっていません
距離は、求められますが、位置までは・・・・
3Dは数学の世界ですから。
三角関数の勉強ができる数学の教科書はお持ちじゃないのでしょうか?
こういうやつです。
「回転移動の1次変換」
http://www.geisya.or.jp/~mwm48961/kou2/ ... mage3.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
カメラの位置を計算できたら、同じ計算方法でモデルの進行方向を求めることもできますよ。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
sinθ=r/y
cosθ=r/x
を直してみると
y=sinθ×r
x=cosθ×r
となりますがこれでいいですか
一応これでも結構がんばった
cosθ=r/x
を直してみると
y=sinθ×r
x=cosθ×r
となりますがこれでいいですか
一応これでも結構がんばった
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
まず、自キャラが向いている方向が決めてあって、そこからカメラの位置を求めるんじゃないでしょうか?
つまり角度rはすでに確定している状況です。ただし、カメラ位置はキャラの向いている反対方向である後ろにあります。
ここで180回した角度r2となるわけです。
それと3Dの場合は地面はXZ平面となります。Yは上方向ですからね。
なので擬似的に2Dでカメラの位置を決めるのでXZ平面上で回転させましょう。
次に距離を取り扱うわけですが、主人公からの相対ベクトルで距離を決めておきます。
回転前のベクトルは、真正面を見ていれば良いので仮の値として(0,0,500)と言うベクトルとします。
このベクトルをXZ平面上でr2の角度に回転させるわけですね。
こうして出来るのが主人公から見たカメラの相対位置という事になります。
よく分からなかったら、紙などに図を書いてみてください。
つまり角度rはすでに確定している状況です。ただし、カメラ位置はキャラの向いている反対方向である後ろにあります。
ここで180回した角度r2となるわけです。
それと3Dの場合は地面はXZ平面となります。Yは上方向ですからね。
なので擬似的に2Dでカメラの位置を決めるのでXZ平面上で回転させましょう。
次に距離を取り扱うわけですが、主人公からの相対ベクトルで距離を決めておきます。
回転前のベクトルは、真正面を見ていれば良いので仮の値として(0,0,500)と言うベクトルとします。
このベクトルをXZ平面上でr2の角度に回転させるわけですね。
こうして出来るのが主人公から見たカメラの相対位置という事になります。
よく分からなかったら、紙などに図を書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

こういう感じですかね・・・
これで、主人公を180度回転させるとカメラが見える ってかんじですかね・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
>これで、主人公を180度回転させるとカメラが見える ってかんじですかね・・・
常に主人公の背中の位置にに有るのが主人公追従カメラ(TPS視点カメラ)です。
この場合は、主人公ではなくカメラを動かすんですよ。
あと、2D回転時にはYは出て来ません(Y関係は後回し中)。
XZ平面上で回転している図にして、r2やらsinやらが出てくる式も書き加えて下さい。
常に主人公の背中の位置にに有るのが主人公追従カメラ(TPS視点カメラ)です。
この場合は、主人公ではなくカメラを動かすんですよ。
あと、2D回転時にはYは出て来ません(Y関係は後回し中)。
XZ平面上で回転している図にして、r2やらsinやらが出てくる式も書き加えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
sinθは角度ではありません。θが角度です。
主人公の向いている方向が図示されていませんが、カメラから矢印されている四角は何でしょうか?
>r2がよくわかりません
図で書けないのはイメージが全く出来ていない証拠だと思います。
それだとプログラムにできません。
まずrが主人公の見ている向きと定義して、そこからr2を求めると定義したはずですがr自体がよく分かっていないのでしょうか?
私がrとしたのがややこしかったみたいなので、angleと命名し直します。
以下の通りに使う要素の定義を変えます。
r 回転半径。カメラと主人公の距離の事で 500 とします。
angle 主人公の見ている方向(角度)
angle2 主人公からのカメラのいる方向(角度) つまり見ている方向であるangleの逆方向。
sin/cos三角関数。
cx 主人公とカメラのx方向の相対距離
cz 主人公とカメラのz方向の相対距離
これを全て図に書き入れて下さい。
たとえ数学が苦手でも3Dをやる限りは三角関数と向き合う必要があります。
がんばって図を書いて、何度も分かるまで書きなおしてがんばってください。
主人公の向いている方向が図示されていませんが、カメラから矢印されている四角は何でしょうか?
>r2がよくわかりません
図で書けないのはイメージが全く出来ていない証拠だと思います。
それだとプログラムにできません。
まずrが主人公の見ている向きと定義して、そこからr2を求めると定義したはずですがr自体がよく分かっていないのでしょうか?
私がrとしたのがややこしかったみたいなので、angleと命名し直します。
以下の通りに使う要素の定義を変えます。
r 回転半径。カメラと主人公の距離の事で 500 とします。
angle 主人公の見ている方向(角度)
angle2 主人公からのカメラのいる方向(角度) つまり見ている方向であるangleの逆方向。
sin/cos三角関数。
cx 主人公とカメラのx方向の相対距離
cz 主人公とカメラのz方向の相対距離
これを全て図に書き入れて下さい。
たとえ数学が苦手でも3Dをやる限りは三角関数と向き合う必要があります。
がんばって図を書いて、何度も分かるまで書きなおしてがんばってください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
全部を使って下さいとお願いしたたはずですので、もう一度お願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
これは・・
難しい....。
明日から学校なんで、次の土曜日くらいにまたお願いします。
難しい....。
明日から学校なんで、次の土曜日くらいにまたお願いします。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
ではヒントです。
この絵とsoftyaさんの掲示した変数要素の定義を見比べて、穴埋めをしてみてください。
この絵とsoftyaさんの掲示した変数要素の定義を見比べて、穴埋めをしてみてください。
- 添付ファイル
-
- hisensepicture.png (13.05 KiB) 閲覧数: 22485 回
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
少し間があいたので、質問を
これは、xは、0でいいのでしょうか
図をみたら、0では、ないようなきがするのですが。
これは、xは、0でいいのでしょうか
図をみたら、0では、ないようなきがするのですが。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
xが0と言う話は何処にも出ていないと思いますが、どこから出てきた話でしょうか?
そう思った部分を引用してもらえると助かります。
そう思った部分を引用してもらえると助かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
EIYUUさん
どのxを指していますか?EIYUU さんが書きました: これは、xは、0でいいのでしょうか
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
カメラの座標はx,zともにあらゆる値を取ります。
現在はxz平面上のみ考えるということでyは常に0になりますけどね。
【追記】
今気付いたのですが、私の描いた図だと回転方向が逆になってます。本当は時計回りなのでお間違えのないようにお願いします。
現在はxz平面上のみ考えるということでyは常に0になりますけどね。
【追記】
今気付いたのですが、私の描いた図だと回転方向が逆になってます。本当は時計回りなのでお間違えのないようにお願いします。
最後に編集したユーザー Priest on 2013年2月13日(水) 17:50 [ 編集 2 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
これですね?EIYUUスマホ さんが書きました:カメラの座標です
>回転前のベクトルは、真正面を見ていれば良いので仮の値として(0,0,500)と言うベクトルとします。
ここでのポイントは回転前という条件がある事です。つまり、これは初期のカメラ状態だけはxが0と言うことです。
主人公の向きに合わせてカメラは回転しますので、いつでもxは0ではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
angleは0度でangle2は180度になりますね。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
ところで、これについてはできましたか?softya(ソフト屋) さんが書きました: r 回転半径。カメラと主人公の距離の事で 500 とします。
angle 主人公の見ている方向(角度)
angle2 主人公からのカメラのいる方向(角度) つまり見ている方向であるangleの逆方向。
sin/cos三角関数。
cx 主人公とカメラのx方向の相対距離
cz 主人公とカメラのz方向の相対距離
これを全て図に書き入れて下さい。
【追記】
えっー!↓
最後に編集したユーザー Priest on 2013年2月13日(水) 22:00 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
とりあえず図が書けたら練習でPriestさんの書かれた図をDXライブラリで2Dで表示するプログラムをEIYUUさんに作ってもらおうかなと思っております。
カーソル←→で主人公とカメラ回転。カーソル↑↓でカメラとの距離変更など良いかな。と考え中。
カーソル←→で主人公とカメラ回転。カーソル↑↓でカメラとの距離変更など良いかな。と考え中。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
今気づきましたが、angleとangle2は起点が同じなのでこうですね。
画像取り消しました。
r,angleはOKですが、今のところcxとczの両方を書かれていません。
angle2については上に書いたとおりです。
それとcos(angle)*rで考え方は悪くないのですがcosで良いか、cos/sinの使い分けについてはよく考えてみて下さい。
0度の時にどうなるかに注目して考えてみると良いでしょう。
画像取り消しました。
r,angleはOKですが、今のところcxとczの両方を書かれていません。
angle2については上に書いたとおりです。
それとcos(angle)*rで考え方は悪くないのですがcosで良いか、cos/sinの使い分けについてはよく考えてみて下さい。
0度の時にどうなるかに注目して考えてみると良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
softya(ソフト屋) さんが書きました: 今気づきましたが、angleとangle2は起点が同じなのでこうですね。
ということなので、angle2の起点はangleではないのですか?softya(ソフト屋) さんが書きました: angle2 主人公からのカメラのいる方向(角度)
主人公から見た角度なので常に真後ろ=180度の定数扱いにするのかなと思っていました。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
疑問に思っていたのですが
math.hの中で、
sinf()やcosf()などがありますが
この中身では、どのような処理が行われているのでしょうか
math.hの中で、
sinf()やcosf()などがありますが
この中身では、どのような処理が行われているのでしょうか
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
私がややこしくしてしまったみたいなので、私のを取り消しておきます。
>angle2 主人公からのカメラのいる方向(角度)
そう読めますよね。失礼しました。
>sinf()やcosf()などがありますが
>この中身では、どのような処理が行われているのでしょうか
どういう意味でしょうか?
sinの計算式という意味なら、こんなのですが。
「高校生のための マクローリン展開(1)」
http://chaosweb.complex.eng.hokudai.ac. ... aurin1.htm
>angle2 主人公からのカメラのいる方向(角度)
そう読めますよね。失礼しました。
>sinf()やcosf()などがありますが
>この中身では、どのような処理が行われているのでしょうか
どういう意味でしょうか?
sinの計算式という意味なら、こんなのですが。
「高校生のための マクローリン展開(1)」
http://chaosweb.complex.eng.hokudai.ac. ... aurin1.htm
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
#include<DxLib.h>
#include<math.h>
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
float angle,x,y;
int r;
angle=0.0f;
x=400,y=250,r=150;
while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
DrawLine(250,250,x,y,GetColor(255,255,255));
if(CheckHitKey(KEY_INPUT_LEFT)>=1)
angle+=0.1f;
if(CheckHitKey(KEY_INPUT_RIGHT)>=1)
angle-=0.1f;
x=250+sinf(angle)*r;
y=250+cosf(angle)*r;
}
DxLib_End();
return 0;
};
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
動きとしてはOKだと思います。
では、実際にカメラとモデルを用意して、カメラがモデルを周回するプログラムを書いてみましょうか。
では、実際にカメラとモデルを用意して、カメラがモデルを周回するプログラムを書いてみましょうか。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
#include<DxLib.h>
#include<math.h>
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
float angle,x,z,mx,my,mz;
int r,Model,Zimen;
Zimen=MV1LoadModel("Model/地面.mqo");
Model=MV1LoadModel("Model/中心.mqo");
mx=0.0f,my=0.0f,mz=0.0f;
MV1SetPosition(Zimen,VGet(0.0f,0.0f,0.0f));
MV1SetPosition(Model,VGet(0.0f,0.0f,0.0f));
angle=0.0f;
x=0.0f,z=250.0f,r=250;
while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
SetCameraPositionAndTarget_UpVecY(VGet(x,100.0f,z),VGet(0.0f,0.0f,0.0f));
MV1SetPosition(Model,VGet(mx,my,mz));
MV1DrawModel(Zimen);
MV1DrawModel(Model);
if(CheckHitKey(KEY_INPUT_LEFT)>=1){
angle+=0.1f;
MV1SetRotationXYZ(Model,VGet(0.0f,angle,0.0f));
}
if(CheckHitKey(KEY_INPUT_RIGHT)>=1){
angle-=0.1f;
MV1SetRotationXYZ(Model,VGet(0.0f,angle,0.0f));
}
x=mx+sinf(angle)*r;
z=mz+cosf(angle)*r;
}
DxLib_End();
return 0;
};
しかし、モデルを今向いている向きに進ませるには、どうするのですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
カメラの仕組みと大して変わりません。
rをスピードとして、進行方向のcx/czを求めて今の座標に足します。これで向いている方向に移動します。
rをスピードとして、進行方向のcx/czを求めて今の座標に足します。これで向いている方向に移動します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
できました!!
少しできるのに時間がかかりましたが、よーく考えて書き換えてみたところ
正常に動きました!!
ありがとうございました
少しできるのに時間がかかりましたが、よーく考えて書き換えてみたところ
正常に動きました!!
ありがとうございました
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
おめでとうございます。EIYUU さんが書きました:できました!!
少しできるのに時間がかかりましたが、よーく考えて書き換えてみたところ
正常に動きました!!
ありがとうございました
ここのルールなのですが、完成したコードを投稿してもらえますか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
#include<DxLib.h>
#include<math.h>
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
float angle,x,z,mx,my,mz,v=0.0f;
int r,Model,Zimen,Speed=5.0f;
Zimen=MV1LoadModel("Model/地面.mqo");
Model=MV1LoadModel("Model/中心.mqo");
mx=0.0f,my=0.0f,mz=0.0f;
MV1SetPosition(Zimen,VGet(0.0f,0.0f,0.0f));
MV1SetPosition(Model,VGet(0.0f,0.0f,0.0f));
angle=0.0f;
x=0.0f,z=250.0f,r=250;
while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
SetCameraPositionAndTarget_UpVecY(VGet(x,100.0f,z),VGet(mx,my,mz));
MV1SetPosition(Model,VGet(mx,my,mz));
MV1DrawModel(Zimen);
if(CheckHitKey(KEY_INPUT_LEFT)>=1){
angle-=0.1f;
MV1SetRotationXYZ(Model,VGet(0.0f,angle,0.0f));
}
if(CheckHitKey(KEY_INPUT_RIGHT)>=1){
angle+=0.1f;
MV1SetRotationXYZ(Model,VGet(0.0f,angle,0.0f));
}
x=mx+sinf(angle)*r;
z=mz+cosf(angle)*r;
if(CheckHitKey(KEY_INPUT_W)>=1){
v-=5.0f;
}
if(CheckHitKey(KEY_INPUT_S)>=1){
v+=5.0f;
}
if(CheckHitKey(KEY_INPUT_S)==0&&CheckHitKey(KEY_INPUT_W)==0)
v=0.0f;
if(v>10.0f)
v=10.0f;
if(v<-10.0f)
v=-10.0f;
mx=mx+v*sinf(angle);
mz=mz+v*cosf(angle);
MV1DrawModel(Model);
DrawFormatString(10,10,GetColor(255,255,255),"%f",v);
}
DxLib_End();
return 0;
};
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
あれ? カメラと同じ方向に移動してません?
まぁ速度のプラスマイナスを逆にすればカメラと逆に前進できるんですけどね。
それと、この方式のままだと主人公の向きと独立してカメラのアングルを動かせませんよ。
大抵のRPGやTPSのゲームだとカメラを自由に回せますよね。
まぁ速度のプラスマイナスを逆にすればカメラと逆に前進できるんですけどね。
それと、この方式のままだと主人公の向きと独立してカメラのアングルを動かせませんよ。
大抵のRPGやTPSのゲームだとカメラを自由に回せますよね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
#include<DxLib.h>
#include<math.h>
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
float angle,x,z,mx,my,mz,v=0.0f,angle2=0.0f;;
int r,Model,Zimen,Speed=5.0f;
Zimen=MV1LoadModel("Model/地面.mqo");
Model=MV1LoadModel("Model/中心.mqo");
mx=0.0f,my=0.0f,mz=0.0f;
MV1SetPosition(Zimen,VGet(0.0f,0.0f,0.0f));
MV1SetPosition(Model,VGet(0.0f,0.0f,0.0f));
angle=0.0f;
x=0.0f,z=250.0f,r=250;
while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
SetCameraPositionAndTarget_UpVecY(VGet(x,100.0f,z),VGet(mx,my,mz));
MV1SetPosition(Model,VGet(mx,my,mz));
MV1DrawModel(Zimen);
if(CheckHitKey(KEY_INPUT_LEFT)>=1){
angle-=0.1f;
}
if(CheckHitKey(KEY_INPUT_RIGHT)>=1){
angle+=0.1f;
}
x=mx+sinf(angle)*r;
z=mz+cosf(angle)*r;
if(CheckHitKey(KEY_INPUT_W)>=1){
v-=5.0f;
MV1SetRotationXYZ(Model,VGet(0.0f,angle,0.0f));
}
if(CheckHitKey(KEY_INPUT_S)>=1){
v+=5.0f;
MV1SetRotationXYZ(Model,VGet(0.0f,angle,0.0f));
}
if(CheckHitKey(KEY_INPUT_S)==0&&CheckHitKey(KEY_INPUT_W)==0)
v=0.0f;
if(v>10.0f)
v=10.0f;
if(v<-10.0f)
v=-10.0f;
mx=mx+v*+sinf(angle);
mz=mz+v*+cosf(angle);
MV1DrawModel(Model);
DrawFormatString(10,10,GetColor(255,255,255),"%f",v);
}
DxLib_End();
return 0;
};
そしてカメラの向いている方向に動くようにしました
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
主人公の移動方向もカメラと一緒に変化している気がするのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
それなら、移動していない時カメラが回っても主人公が回っていないので若干の矛盾がありますね。
狙い通りなら良いのですが。
あと今のコードは移動と表示が1フレームずれているのでスピードが出ると操作感に多少違和感が出るかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。