ページ 1 / 1
見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 13:20
by EIYUU
カメラが常に3Dモデルの背中を見ているようにしたいのですが、
カメラの視点を回転することができても、カメラの位置を回転させることができません!
モデルが回転したらそれと同じ回転量でカメラをモデル中心で回転させたいです。
後、ひとつカメラのことでは、ありませんが・・・
UPボタンを押したときにZを足して移動させているのですが、
それでは、モデルの向きが変わった場合にモデルが進行方向に進みません。
できたら、モデルの向きに進ませたいのですが、それは、どうしたらいいですか?
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 14:34
by softya(ソフト屋)
とりあえず、自キャラやカメラのプログラムがどうなっているかわからないと答え様が無さそうです。
出来れば、モデルデータ不要なコンパクトな実験プログラムにしてもらうと答えやすくなるでしょう。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 15:41
by EIYUU
え~と・・・
こぴぺですが
コード:
#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)
Posted: 2013年2月11日(月) 15:51
by 忍ノ一字
毎フレーム、モデルの位置、モデルの向きからカメラの位置を計算するのはどうでしょうか?
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 15:59
by EIYUU
まだまだ初心者なもので・・・
よくわからないので、簡単なコードをかいてくれたらありがたいです
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 16:05
by softya(ソフト屋)
EIYUU さんが書きました:まだまだ初心者なもので・・・
よくわからないので、簡単なコードをかいてくれたらありがたいです
それは、まず聞かずに自分でまず書いてみるべきだと思います。
数学的な問題なので、プログラミング初心者とか関係ないと思いますので。
数学的に、カメラの位置を求める式をまず書いてみて下さい。
行列でやる方法も考えたのですが、三角関数で数学的にやるほうが初心者向けかなと思いました。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 16:13
by EIYUU
すみません
三角関数がまだあまりわかっていません
距離は、求められますが、位置までは・・・・
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 16:17
by softya(ソフト屋)
EIYUU さんが書きました:すみません
三角関数がまだあまりわかっていません
距離は、求められますが、位置までは・・・・
そういうことなら、なおさら数学の勉強が必要だと思います。
3Dは数学の世界ですから。
三角関数の勉強ができる数学の教科書はお持ちじゃないのでしょうか?
こういうやつです。
「回転移動の1次変換」
http://www.geisya.or.jp/~mwm48961/kou2/ ... mage3.html
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 17:14
by ISLe
カメラの位置を計算できたら、同じ計算方法でモデルの進行方向を求めることもできますよ。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 17:36
by EIYUU
sinθ=r/y
cosθ=r/x
を直してみると
y=sinθ×r
x=cosθ×r
となりますがこれでいいですか
一応これでも結構がんばった
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 17:51
by softya(ソフト屋)
まず、自キャラが向いている方向が決めてあって、そこからカメラの位置を求めるんじゃないでしょうか?
つまり角度rはすでに確定している状況です。ただし、カメラ位置はキャラの向いている反対方向である後ろにあります。
ここで180回した角度r2となるわけです。
それと3Dの場合は地面はXZ平面となります。Yは上方向ですからね。
なので擬似的に2Dでカメラの位置を決めるのでXZ平面上で回転させましょう。
次に距離を取り扱うわけですが、主人公からの相対ベクトルで距離を決めておきます。
回転前のベクトルは、真正面を見ていれば良いので仮の値として(0,0,500)と言うベクトルとします。
このベクトルをXZ平面上でr2の角度に回転させるわけですね。
こうして出来るのが主人公から見たカメラの相対位置という事になります。
よく分からなかったら、紙などに図を書いてみてください。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 18:15
by EIYUU
こういう感じですかね・・・
これで、主人公を180度回転させるとカメラが見える ってかんじですかね・・・
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 18:47
by softya(ソフト屋)
>これで、主人公を180度回転させるとカメラが見える ってかんじですかね・・・
常に主人公の背中の位置にに有るのが主人公追従カメラ(TPS視点カメラ)です。
この場合は、主人公ではなくカメラを動かすんですよ。
あと、2D回転時にはYは出て来ません(Y関係は後回し中)。
XZ平面上で回転している図にして、r2やらsinやらが出てくる式も書き加えて下さい。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 18:59
by EIYUU
こんなかんじかな・・
r2がよくわかりません
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 19:22
by softya(ソフト屋)
sinθは角度ではありません。θが角度です。
主人公の向いている方向が図示されていませんが、カメラから矢印されている四角は何でしょうか?
>r2がよくわかりません
図で書けないのはイメージが全く出来ていない証拠だと思います。
それだとプログラムにできません。
まずrが主人公の見ている向きと定義して、そこからr2を求めると定義したはずですがr自体がよく分かっていないのでしょうか?
私がrとしたのがややこしかったみたいなので、angleと命名し直します。
以下の通りに使う要素の定義を変えます。
r 回転半径。カメラと主人公の距離の事で 500 とします。
angle 主人公の見ている方向(角度)
angle2 主人公からのカメラのいる方向(角度) つまり見ている方向であるangleの逆方向。
sin/cos三角関数。
cx 主人公とカメラのx方向の相対距離
cz 主人公とカメラのz方向の相対距離
これを全て図に書き入れて下さい。
たとえ数学が苦手でも3Dをやる限りは三角関数と向き合う必要があります。
がんばって図を書いて、何度も分かるまで書きなおしてがんばってください。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 19:46
by EIYUU
こうかな
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 20:29
by softya(ソフト屋)
全部を使って下さいとお願いしたたはずですので、もう一度お願いします。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 21:01
by EIYUU
これは・・
難しい....。
明日から学校なんで、次の土曜日くらいにまたお願いします。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月11日(月) 21:08
by Priest
ではヒントです。
この絵とsoftyaさんの掲示した変数要素の定義を見比べて、穴埋めをしてみてください。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 16:43
by EIYUU
少し間があいたので、質問を
これは、xは、0でいいのでしょうか
図をみたら、0では、ないようなきがするのですが。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 16:46
by softya(ソフト屋)
xが0と言う話は何処にも出ていないと思いますが、どこから出てきた話でしょうか?
そう思った部分を引用してもらえると助かります。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 17:01
by Priest
EIYUUさん
EIYUU さんが書きました:
これは、xは、0でいいのでしょうか
どのxを指していますか?
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 17:04
by EIYUUスマホ
カメラの座標です
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 17:07
by Priest
カメラの座標はx,zともにあらゆる値を取ります。
現在はxz平面上のみ考えるということでyは常に0になりますけどね。
【追記】
今気付いたのですが、私の描いた図だと回転方向が逆になってます。本当は時計回りなのでお間違えのないようにお願いします。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 17:10
by softya(ソフト屋)
EIYUUスマホ さんが書きました:カメラの座標です
これですね?
>回転前のベクトルは、真正面を見ていれば良いので仮の値として(0,0,500)と言うベクトルとします。
ここでのポイントは回転前という条件がある事です。つまり、これは初期のカメラ状態だけはxが0と言うことです。
主人公の向きに合わせてカメラは回転しますので、いつでもxは0ではありません。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 20:31
by EIYUUスマホ
初期位置の時って、angleとangle2は、どちらも180度
でしょうか
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 20:40
by Priest
angleは0度でangle2は180度になりますね。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 21:41
by Priest
softya(ソフト屋) さんが書きました:
r 回転半径。カメラと主人公の距離の事で 500 とします。
angle 主人公の見ている方向(角度)
angle2 主人公からのカメラのいる方向(角度) つまり見ている方向であるangleの逆方向。
sin/cos三角関数。
cx 主人公とカメラのx方向の相対距離
cz 主人公とカメラのz方向の相対距離
これを全て図に書き入れて下さい。
ところで、これについてはできましたか?
【追記】
えっー!↓
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月13日(水) 21:53
by softya(ソフト屋)
とりあえず図が書けたら練習でPriestさんの書かれた図をDXライブラリで2Dで表示するプログラムをEIYUUさんに作ってもらおうかなと思っております。
カーソル←→で主人公とカメラ回転。カーソル↑↓でカメラとの距離変更など良いかな。と考え中。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月14日(木) 17:14
by EIYUU
ん~。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月14日(木) 17:27
by softya(ソフト屋)
今気づきましたが、angleとangle2は起点が同じなのでこうですね。
画像取り消しました。
r,angleはOKですが、今のところcxとczの両方を書かれていません。
angle2については上に書いたとおりです。
それとcos(angle)*rで考え方は悪くないのですがcosで良いか、cos/sinの使い分けについてはよく考えてみて下さい。
0度の時にどうなるかに注目して考えてみると良いでしょう。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月14日(木) 17:37
by Priest
softya(ソフト屋) さんが書きました:
今気づきましたが、angleとangle2は起点が同じなのでこうですね。
softya(ソフト屋) さんが書きました:
angle2 主人公からのカメラのいる方向(角度)
ということなので、angle2の起点はangleではないのですか?
主人公から見た角度なので常に真後ろ=180度の定数扱いにするのかなと思っていました。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月14日(木) 17:59
by EIYUU
疑問に思っていたのですが
math.hの中で、
sinf()やcosf()などがありますが
この中身では、どのような処理が行われているのでしょうか
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月14日(木) 18:19
by softya(ソフト屋)
私がややこしくしてしまったみたいなので、私のを取り消しておきます。
>angle2 主人公からのカメラのいる方向(角度)
そう読めますよね。失礼しました。
>sinf()やcosf()などがありますが
>この中身では、どのような処理が行われているのでしょうか
どういう意味でしょうか?
sinの計算式という意味なら、こんなのですが。
「高校生のための マクローリン展開(1)」
http://chaosweb.complex.eng.hokudai.ac. ... aurin1.htm
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月14日(木) 18:47
by EIYUU
コード:
#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)
Posted: 2013年2月14日(木) 18:57
by Priest
動きとしてはOKだと思います。
では、実際にカメラとモデルを用意して、カメラがモデルを周回するプログラムを書いてみましょうか。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月14日(木) 20:45
by EIYUU
コード:
#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;
};
カメラがモデルを中心にして回るようになりました。
しかし、モデルを今向いている向きに進ませるには、どうするのですか?
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月14日(木) 20:57
by softya(ソフト屋)
カメラの仕組みと大して変わりません。
rをスピードとして、進行方向のcx/czを求めて今の座標に足します。これで向いている方向に移動します。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月15日(金) 21:55
by EIYUU
できました!!
少しできるのに時間がかかりましたが、よーく考えて書き換えてみたところ
正常に動きました!!
ありがとうございました
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月15日(金) 21:59
by softya(ソフト屋)
EIYUU さんが書きました:できました!!
少しできるのに時間がかかりましたが、よーく考えて書き換えてみたところ
正常に動きました!!
ありがとうございました
おめでとうございます。
ここのルールなのですが、完成したコードを投稿してもらえますか。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月16日(土) 17:42
by EIYUU
コード:
#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;
};
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月16日(土) 17:49
by softya(ソフト屋)
あれ? カメラと同じ方向に移動してません?
まぁ速度のプラスマイナスを逆にすればカメラと逆に前進できるんですけどね。
それと、この方式のままだと主人公の向きと独立してカメラのアングルを動かせませんよ。
大抵のRPGやTPSのゲームだとカメラを自由に回せますよね。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月16日(土) 18:29
by EIYUU
コード:
#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;
};
カメラが自由に動けるようにしました
そしてカメラの向いている方向に動くようにしました
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月16日(土) 18:32
by softya(ソフト屋)
主人公の移動方向もカメラと一緒に変化している気がするのですが。
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月16日(土) 20:25
by EIYUU
Re: 見ているモデルを中心にカメラを回転させたい(DXLib)
Posted: 2013年2月16日(土) 20:49
by softya(ソフト屋)
それなら、移動していない時カメラが回っても主人公が回っていないので若干の矛盾がありますね。
狙い通りなら良いのですが。
あと今のコードは移動と表示が1フレームずれているのでスピードが出ると操作感に多少違和感が出るかもしれません。