60章 視点を変える方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kai

60章 視点を変える方法

#1

投稿記事 by kai » 16年前

龍神録60章を改造して遊んでいるのですが、
東方星蓮船の3面の最初みたいに視点を動かして
左右にゆらゆら動くようにしたいのですが、
どうソースを変えたらそんな風になるでしょうか?

Justy

Re:60章 視点を変える方法

#2

投稿記事 by Justy » 16年前

 東方星蓮船の3面がどうなっているのか見たことがないので知りませんが、
視点を動かすだけなら、CreateLookAtMatrixにカメラの位置とか向きとかを入れてビュー行列を作り、
SetTransformToView()でセットすればその位置と向きにカメラが向きます。

 それだけでは判りづらそうなので、3Dbackground.cppを改良した
適当なサンプルを作ってみました。

[color=#d0d0ff" face="monospace]
// カメラ位置
struct Camera
{
VECTOR base_pos;
VECTOR pos_offset;
VECTOR base_target;
VECTOR target;
VECTOR up;
} camera;

// カメラ初期化
static void InitCamera()
{
MATRIX cameraMatrix;
GetTransformToViewMatrix(&cameraMatrix);
camera.base_pos.x = -cameraMatrix.m[3][0];
camera.base_pos.y = -cameraMatrix.m[3][1];
camera.base_pos.z = -cameraMatrix.m[3][2];
camera.pos_offset.x = camera.pos_offset.y = camera.pos_offset.z = 0;
camera.base_target.x = camera.base_pos.x + cameraMatrix.m[2][0] * 100 + 25;
camera.base_target.y = camera.base_pos.y + cameraMatrix.m[2][1] * 100;
camera.base_target.z = camera.base_pos.z + cameraMatrix.m[2][2] * 100;
camera.target = camera.base_target;
camera.up.x = 0, camera.up.y = 1, camera.up.z = 0;
}

static void UdateCamera()
{
const float range = 50;
VECTOR r;
r.x = -((float)(ch.x - FX) / (FMX - FX) * range - range*0.5f);
r.y = ((float)(ch.y - FY) / (FMY - FY) * range - range*0.5f);
r.z = 0.f;

const float k = 0.04f;
camera.pos_offset.x += (r.x - camera.pos_offset.x) * k;
camera.pos_offset.y += (r.y - camera.pos_offset.y) * k;

VECTOR pos;
VectorAdd(&pos, &camera.base_pos, &camera.pos_offset);

MATRIX cameraMatrix;
CreateLookAtMatrix(&cameraMatrix, &pos, &camera.target, &camera.up);
SetTransformToView(&cameraMatrix);
}
[/color]

 あとは GV.hをインクルードした上で Ini3Dbackground関数のどこかで InitCamera()を、
Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。

 肝は CreateLookAtMatrix()の第2引数にカメラの位置を、第3引数にどこの位置を見るか
を指定してあげることです。

 これを頑張って改良していけば、そのうちゆらゆらするのも作れるかと思います。

kai

Re:60章 視点を変える方法

#3

投稿記事 by kai » 16年前

>Ini3Dbackground関数のどこかで InitCamera()を、
>Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。
っていうのがちょっと言ってる意味が分からないのですが、どういうことなのでしょうか?
もうちょっと分かりやすく教えていただけたら幸いです。
それと
>CreateLookAtMatrix()の第2引数にカメラの位置を、第3引数にどこの位置を見るかを指定
とのことですが、どんな感じに指定すればいいのでしょうか?
簡単でいいですので例を挙げてもらえませんか?

kai

Re:60章 視点を変える方法

#4

投稿記事 by kai » 16年前

ずみません。
>Ini3Dbackground関数のどこかで InitCamera()を、
>Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。
これは自己解決しました。

kai

Re:60章 視点を変える方法

#5

投稿記事 by kai » 16年前

この視点は初期化できないんでしょうか?
最初からやり直すと
少しづつ右によって行くバグが発生するのですが・・
仕様なのかな?

Justy

Re:60章 視点を変える方法

#6

投稿記事 by Justy » 16年前

 あー、FMX/FMYって位置じゃなくてサイズだったか。

 じゃ、
[color=#d0d0ff" face="monospace]
r.x = -((float)(ch.x) / FMX * range - range*0.5f);
r.y = ((float)(ch.y) - (FMY-FMY*3/4)) / FMY * range - range*0.5f;
[/color]

 で。

kai

Re:60章 視点を変える方法

#7

投稿記事 by kai » 16年前

??
試してみましたが特にバグは消えませんでした・・

Justy

Re:60章 視点を変える方法

#8

投稿記事 by Justy » 16年前

「最初からやり直す」ってアプリそのものを起動し直すことですか?
それとも何かそういう方法が?

 そういう現象に遭遇しないのですが。

kai

Re:60章 視点を変える方法

#9

投稿記事 by kai » 16年前

支館様のプログラムを活用したコンテニューです。
最初から始めるを選ぶとfunc_state = 99;になりゲーム初期化をする処理になるようにしてあります。
そのあと、ini();を呼びだしたのち、通常処理のfunc_state=100;にとぶようにしてあるのですが、
そのときコンテニューした場合、全画面の位置がやや右に移動してから起動してしまいます。
ふたたびコンテニューすると、もっと右に移動し、これを繰り返すと左側に桜の木と右側に黒画面しか
スクロールしない状況になります。

kai

Re:60章 視点を変える方法

#10

投稿記事 by kai » 16年前

念のため、3Dbackground.cppに記述してあること自体が間違っている可能性もあるかも
しれないので添付しておきます

Justy

Re:60章 視点を変える方法

#11

投稿記事 by Justy » 16年前


>最初から始めるを選ぶとfunc_state = 99;になりゲーム初期化をする処理になるようにしてあります

 そういう機能を入れた、ということですか。
 なるほど、であればだいたい理由はわかります。

 InitCamera()では起動直後の状態の情報を取得しているので、
2回目以降は不要な初期化が含まれています。

 なので、2回目以降は InitCamera()内の
[color=#d0d0ff" face="monospace]
camera.pos_offset.x = camera.pos_offset.y = camera.pos_offset.z = 0;
[/color]

の行だけ実行するようにしてください。

kai

Re:60章 視点を変える方法

#12

投稿記事 by kai » 16年前

考えて色々やってみたのですが
camera.pos_offset.x = camera.pos_offset.y = camera.pos_offset.z = 0;
の行だけ2回目以降は実行するやり方というのが分からなく、うまくいきませんでした。
どうしたらいいのでしょうか?

ねこ

Re:60章 視点を変える方法

#13

投稿記事 by ねこ » 16年前

横から失礼します。
ただ2回目以降は呼ばないなら下記のようにすればいいだけじゃないでしょか。
static bool bCameraInit = false;
// カメラ初期化 
static void InitCamera() {
	if( bCameraInit == false ) {
		// 既存処理
		bCameraInit = true;
	} else {
		camera.pos_offset.x = camera.pos_offset.y = camera.pos_offset.z = 0; 
	}
}

kai

Re:60章 視点を変える方法

#14

投稿記事 by kai » 16年前

ねこさん、ありがとうございます。
さっそくやってみたのですが、それだと最初っから画面が真っ暗になってしまうのですが・・

ねこ

Re:60章 視点を変える方法

#15

投稿記事 by ねこ » 16年前

えーっともしかして「//既存処理」のとこそのままにしてますか?
// 既存処理の所はJustyさんが張ったCameraInitの中を意味してるので
下の赤の部分を貼り付けて下さいね。

// カメラ初期化
static void InitCamera()
{
[color=red>
MATRIX cameraMatrix;
GetTransformToViewMatrix(&cameraMatrix);
camera.base_pos.x = -cameraMatrix.m[3][0];
camera.base_pos.y = -cameraMatrix.m[3][1];
camera.base_pos.z = -cameraMatrix.m[3][2];
camera.pos_offset.x = camera.pos_offset.y = camera.pos_offset.z = 0;
camera.base_target.x = camera.base_pos.x + cameraMatrix.m[2][0] * 100 + 25;
camera.base_target.y = camera.base_pos.y + cameraMatrix.m[2][1] * 100;
camera.base_target.z = camera.base_pos.z + cameraMatrix.m[2][2] * 100;
camera.target = camera.base_target;
camera.up.x = 0, camera.up.y = 1, camera.up.z = 0;
[/color]
}

kai

Re:60章 視点を変える方法

#16

投稿記事 by kai » 16年前

直りました!
ほんと、Justyさんとねこさんには感謝の気持ちでいっぱいです!
ありがとうございました。!これからもっと頑張って改良したいと思います!

kai

Re:60章 視点を変える方法

#17

投稿記事 by kai » 16年前

最後に質問があるのですが
define.h内の
フィールドの左上の座標
#define FX 32を#define FX 128
にして中央に画面をセットしたら
背景がやや左側から流れるようになりました。
初期位置から見て、前にまっすぐに流れるように背景の位置を+96ずらしたいのですが
3Dbackground.cpp内の具体的にどこをいじったらいいのでしょうか?
分かる方がいたらぜひ教えてください。よろしくおねがいします。

通りすがり

Re:60章 視点を変える方法

#18

投稿記事 by 通りすがり » 16年前

96?

Justy

Re:60章 視点を変える方法

#19

投稿記事 by Justy » 16年前

試していませんが + 25をカット、かな。

kai

Re:60章 視点を変える方法

#20

投稿記事 by kai » 16年前

おお!25を削除しただけで直りました。
Justyさんありがとうございます!

閉鎖

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