見ているモデルを中心にカメラを回転させたい(DXLib)

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

見ているモデルを中心にカメラを回転させたい(DXLib)

#1

投稿記事 by EIYUU » 12年前

カメラが常に3Dモデルの背中を見ているようにしたいのですが、
カメラの視点を回転することができても、カメラの位置を回転させることができません!
モデルが回転したらそれと同じ回転量でカメラをモデル中心で回転させたいです。



後、ひとつカメラのことでは、ありませんが・・・
UPボタンを押したときにZを足して移動させているのですが、
それでは、モデルの向きが変わった場合にモデルが進行方向に進みません。
できたら、モデルの向きに進ませたいのですが、それは、どうしたらいいですか?

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#2

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

とりあえず、自キャラやカメラのプログラムがどうなっているかわからないと答え様が無さそうです。
出来れば、モデルデータ不要なコンパクトな実験プログラムにしてもらうと答えやすくなるでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#3

投稿記事 by EIYUU » 12年前

え~と・・・
こぴぺですが

コード:

#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)

#4

投稿記事 by 忍ノ一字 » 12年前

毎フレーム、モデルの位置、モデルの向きからカメラの位置を計算するのはどうでしょうか?

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#5

投稿記事 by EIYUU » 12年前

まだまだ初心者なもので・・・
よくわからないので、簡単なコードをかいてくれたらありがたいです

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#6

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

EIYUU さんが書きました:まだまだ初心者なもので・・・
よくわからないので、簡単なコードをかいてくれたらありがたいです
それは、まず聞かずに自分でまず書いてみるべきだと思います。
数学的な問題なので、プログラミング初心者とか関係ないと思いますので。
数学的に、カメラの位置を求める式をまず書いてみて下さい。

行列でやる方法も考えたのですが、三角関数で数学的にやるほうが初心者向けかなと思いました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#7

投稿記事 by EIYUU » 12年前

すみません
三角関数がまだあまりわかっていません
距離は、求められますが、位置までは・・・・

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#8

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

EIYUU さんが書きました:すみません
三角関数がまだあまりわかっていません
距離は、求められますが、位置までは・・・・
そういうことなら、なおさら数学の勉強が必要だと思います。
3Dは数学の世界ですから。
三角関数の勉強ができる数学の教科書はお持ちじゃないのでしょうか?

こういうやつです。
「回転移動の1次変換」
http://www.geisya.or.jp/~mwm48961/kou2/ ... mage3.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#9

投稿記事 by ISLe » 12年前

カメラの位置を計算できたら、同じ計算方法でモデルの進行方向を求めることもできますよ。

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#10

投稿記事 by EIYUU » 12年前

sinθ=r/y
cosθ=r/x
を直してみると
y=sinθ×r
x=cosθ×r
となりますがこれでいいですか
一応これでも結構がんばった

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#11

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

まず、自キャラが向いている方向が決めてあって、そこからカメラの位置を求めるんじゃないでしょうか?
つまり角度rはすでに確定している状況です。ただし、カメラ位置はキャラの向いている反対方向である後ろにあります。
ここで180回した角度r2となるわけです。

それと3Dの場合は地面はXZ平面となります。Yは上方向ですからね。
なので擬似的に2Dでカメラの位置を決めるのでXZ平面上で回転させましょう。

次に距離を取り扱うわけですが、主人公からの相対ベクトルで距離を決めておきます。
回転前のベクトルは、真正面を見ていれば良いので仮の値として(0,0,500)と言うベクトルとします。
このベクトルをXZ平面上でr2の角度に回転させるわけですね。
こうして出来るのが主人公から見たカメラの相対位置という事になります。

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

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#12

投稿記事 by EIYUU » 12年前

画像

こういう感じですかね・・・
これで、主人公を180度回転させるとカメラが見える ってかんじですかね・・・

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#13

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

>これで、主人公を180度回転させるとカメラが見える ってかんじですかね・・・

常に主人公の背中の位置にに有るのが主人公追従カメラ(TPS視点カメラ)です。
この場合は、主人公ではなくカメラを動かすんですよ。
あと、2D回転時にはYは出て来ません(Y関係は後回し中)。

XZ平面上で回転している図にして、r2やらsinやらが出てくる式も書き加えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#14

投稿記事 by EIYUU » 12年前

画像

こんなかんじかな・・
r2がよくわかりません

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#15

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

sinθは角度ではありません。θが角度です。
主人公の向いている方向が図示されていませんが、カメラから矢印されている四角は何でしょうか?

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

#17

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

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

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#18

投稿記事 by EIYUU » 12年前

これは・・
難しい....。
明日から学校なんで、次の土曜日くらいにまたお願いします。

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#19

投稿記事 by Priest » 12年前

ではヒントです。
この絵とsoftyaさんの掲示した変数要素の定義を見比べて、穴埋めをしてみてください。
添付ファイル
hisensepicture.png
hisensepicture.png (13.05 KiB) 閲覧数: 22512 回

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#20

投稿記事 by EIYUU » 12年前

少し間があいたので、質問を

これは、xは、0でいいのでしょうか
図をみたら、0では、ないようなきがするのですが。

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#21

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

xが0と言う話は何処にも出ていないと思いますが、どこから出てきた話でしょうか?
そう思った部分を引用してもらえると助かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#22

投稿記事 by Priest » 12年前

EIYUUさん
EIYUU さんが書きました: これは、xは、0でいいのでしょうか
どのxを指していますか?

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }


Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#24

投稿記事 by Priest » 12年前

カメラの座標はx,zともにあらゆる値を取ります。
現在はxz平面上のみ考えるということでyは常に0になりますけどね。

【追記】
今気付いたのですが、私の描いた図だと回転方向が逆になってます。本当は時計回りなのでお間違えのないようにお願いします。
最後に編集したユーザー Priest on 2013年2月13日(水) 17:50 [ 編集 2 回目 ]

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#25

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

EIYUUスマホ さんが書きました:カメラの座標です
これですね?
>回転前のベクトルは、真正面を見ていれば良いので仮の値として(0,0,500)と言うベクトルとします。

ここでのポイントは回転前という条件がある事です。つまり、これは初期のカメラ状態だけはxが0と言うことです。
主人公の向きに合わせてカメラは回転しますので、いつでもxは0ではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EIYUUスマホ

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#26

投稿記事 by EIYUUスマホ » 12年前

初期位置の時って、angleとangle2は、どちらも180度
でしょうか

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#27

投稿記事 by Priest » 12年前

angleは0度でangle2は180度になりますね。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#28

投稿記事 by Priest » 12年前

softya(ソフト屋) さんが書きました: r 回転半径。カメラと主人公の距離の事で 500 とします。
angle 主人公の見ている方向(角度)
angle2 主人公からのカメラのいる方向(角度) つまり見ている方向であるangleの逆方向。
sin/cos三角関数。
cx 主人公とカメラのx方向の相対距離
cz 主人公とカメラのz方向の相対距離
これを全て図に書き入れて下さい。
ところで、これについてはできましたか?

【追記】
えっー!↓
最後に編集したユーザー Priest on 2013年2月13日(水) 22:00 [ 編集 1 回目 ]

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#29

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

とりあえず図が書けたら練習でPriestさんの書かれた図をDXライブラリで2Dで表示するプログラムをEIYUUさんに作ってもらおうかなと思っております。
カーソル←→で主人公とカメラ回転。カーソル↑↓でカメラとの距離変更など良いかな。と考え中。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。


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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#31

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

今気づきましたが、angleとangle2は起点が同じなのでこうですね。
画像取り消しました。

r,angleはOKですが、今のところcxとczの両方を書かれていません。
angle2については上に書いたとおりです。

それとcos(angle)*rで考え方は悪くないのですがcosで良いか、cos/sinの使い分けについてはよく考えてみて下さい。
0度の時にどうなるかに注目して考えてみると良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#32

投稿記事 by Priest » 12年前

softya(ソフト屋) さんが書きました: 今気づきましたが、angleとangle2は起点が同じなのでこうですね。
softya(ソフト屋) さんが書きました: angle2 主人公からのカメラのいる方向(角度)
ということなので、angle2の起点はangleではないのですか?
主人公から見た角度なので常に真後ろ=180度の定数扱いにするのかなと思っていました。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#33

投稿記事 by EIYUU » 12年前

疑問に思っていたのですが
math.hの中で、
sinf()やcosf()などがありますが
この中身では、どのような処理が行われているのでしょうか

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#34

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

私がややこしくしてしまったみたいなので、私のを取り消しておきます。
>angle2 主人公からのカメラのいる方向(角度)
そう読めますよね。失礼しました。

>sinf()やcosf()などがありますが
>この中身では、どのような処理が行われているのでしょうか

どういう意味でしょうか?
sinの計算式という意味なら、こんなのですが。
「高校生のための マクローリン展開(1)」
http://chaosweb.complex.eng.hokudai.ac. ... aurin1.htm
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#35

投稿記事 by EIYUU » 12年前

コード:

#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;
};
これでは、だめでしょうか

Priest
記事: 123
登録日時: 12年前
住所: 愛知

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#36

投稿記事 by Priest » 12年前

動きとしてはOKだと思います。

では、実際にカメラとモデルを用意して、カメラがモデルを周回するプログラムを書いてみましょうか。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#37

投稿記事 by EIYUU » 12年前

コード:

#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)

#38

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

カメラの仕組みと大して変わりません。
rをスピードとして、進行方向のcx/czを求めて今の座標に足します。これで向いている方向に移動します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#39

投稿記事 by EIYUU » 12年前

できました!!
少しできるのに時間がかかりましたが、よーく考えて書き換えてみたところ
正常に動きました!!

ありがとうございました

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#40

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

EIYUU さんが書きました:できました!!
少しできるのに時間がかかりましたが、よーく考えて書き換えてみたところ
正常に動きました!!

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

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#41

投稿記事 by EIYUU » 12年前

コード:

#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)

#42

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

あれ? カメラと同じ方向に移動してません?
まぁ速度のプラスマイナスを逆にすればカメラと逆に前進できるんですけどね。

それと、この方式のままだと主人公の向きと独立してカメラのアングルを動かせませんよ。
大抵のRPGやTPSのゲームだとカメラを自由に回せますよね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#43

投稿記事 by EIYUU » 12年前

コード:

#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)

#44

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

主人公の移動方向もカメラと一緒に変化している気がするのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EIYUU
記事: 24
登録日時: 12年前
住所: Home

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#45

投稿記事 by EIYUU » 12年前

http://www.nicovideo.jp/watch/sm8387469
こういう感じにしたかったので・・・
これでいいかなと

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

Re: 見ているモデルを中心にカメラを回転させたい(DXLib)

#46

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

EIYUU さんが書きました:http://www.nicovideo.jp/watch/sm8387469
こういう感じにしたかったので・・・
これでいいかなと
それなら、移動していない時カメラが回っても主人公が回っていないので若干の矛盾がありますね。
狙い通りなら良いのですが。

あと今のコードは移動と表示が1フレームずれているのでスピードが出ると操作感に多少違和感が出るかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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