60章 視点を変える方法
60章 視点を変える方法
龍神録60章を改造して遊んでいるのですが、
東方星蓮船の3面の最初みたいに視点を動かして
左右にゆらゆら動くようにしたいのですが、
どうソースを変えたらそんな風になるでしょうか?
東方星蓮船の3面の最初みたいに視点を動かして
左右にゆらゆら動くようにしたいのですが、
どうソースを変えたらそんな風になるでしょうか?
Re:60章 視点を変える方法
東方星蓮船の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引数にどこの位置を見るか
を指定してあげることです。
これを頑張って改良していけば、そのうちゆらゆらするのも作れるかと思います。
視点を動かすだけなら、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引数にどこの位置を見るか
を指定してあげることです。
これを頑張って改良していけば、そのうちゆらゆらするのも作れるかと思います。
Re:60章 視点を変える方法
>Ini3Dbackground関数のどこかで InitCamera()を、
>Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。
っていうのがちょっと言ってる意味が分からないのですが、どういうことなのでしょうか?
もうちょっと分かりやすく教えていただけたら幸いです。
それと
>CreateLookAtMatrix()の第2引数にカメラの位置を、第3引数にどこの位置を見るかを指定
とのことですが、どんな感じに指定すればいいのでしょうか?
簡単でいいですので例を挙げてもらえませんか?
>Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。
っていうのがちょっと言ってる意味が分からないのですが、どういうことなのでしょうか?
もうちょっと分かりやすく教えていただけたら幸いです。
それと
>CreateLookAtMatrix()の第2引数にカメラの位置を、第3引数にどこの位置を見るかを指定
とのことですが、どんな感じに指定すればいいのでしょうか?
簡単でいいですので例を挙げてもらえませんか?
Re:60章 視点を変える方法
ずみません。
>Ini3Dbackground関数のどこかで InitCamera()を、
>Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。
これは自己解決しました。
>Ini3Dbackground関数のどこかで InitCamera()を、
>Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。
これは自己解決しました。
Re:60章 視点を変える方法
あー、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]
で。
じゃ、
[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]
で。
Re:60章 視点を変える方法
支館様のプログラムを活用したコンテニューです。
最初から始めるを選ぶとfunc_state = 99;になりゲーム初期化をする処理になるようにしてあります。
そのあと、ini();を呼びだしたのち、通常処理のfunc_state=100;にとぶようにしてあるのですが、
そのときコンテニューした場合、全画面の位置がやや右に移動してから起動してしまいます。
ふたたびコンテニューすると、もっと右に移動し、これを繰り返すと左側に桜の木と右側に黒画面しか
スクロールしない状況になります。
最初から始めるを選ぶとfunc_state = 99;になりゲーム初期化をする処理になるようにしてあります。
そのあと、ini();を呼びだしたのち、通常処理のfunc_state=100;にとぶようにしてあるのですが、
そのときコンテニューした場合、全画面の位置がやや右に移動してから起動してしまいます。
ふたたびコンテニューすると、もっと右に移動し、これを繰り返すと左側に桜の木と右側に黒画面しか
スクロールしない状況になります。
Re:60章 視点を変える方法
>最初から始めるを選ぶと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]
の行だけ実行するようにしてください。
Re:60章 視点を変える方法
考えて色々やってみたのですが
camera.pos_offset.x = camera.pos_offset.y = camera.pos_offset.z = 0;
の行だけ2回目以降は実行するやり方というのが分からなく、うまくいきませんでした。
どうしたらいいのでしょうか?
camera.pos_offset.x = camera.pos_offset.y = camera.pos_offset.z = 0;
の行だけ2回目以降は実行するやり方というのが分からなく、うまくいきませんでした。
どうしたらいいのでしょうか?
Re:60章 視点を変える方法
横から失礼します。
ただ2回目以降は呼ばないなら下記のようにすればいいだけじゃないでしょか。
ただ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; } }
Re:60章 視点を変える方法
えーっともしかして「//既存処理」のとこそのままにしてますか?
// 既存処理の所は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]
}
// 既存処理の所は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]
}
Re:60章 視点を変える方法
直りました!
ほんと、Justyさんとねこさんには感謝の気持ちでいっぱいです!
ありがとうございました。!これからもっと頑張って改良したいと思います!
ほんと、Justyさんとねこさんには感謝の気持ちでいっぱいです!
ありがとうございました。!これからもっと頑張って改良したいと思います!
Re:60章 視点を変える方法
最後に質問があるのですが
define.h内の
フィールドの左上の座標
#define FX 32を#define FX 128
にして中央に画面をセットしたら
背景がやや左側から流れるようになりました。
初期位置から見て、前にまっすぐに流れるように背景の位置を+96ずらしたいのですが
3Dbackground.cpp内の具体的にどこをいじったらいいのでしょうか?
分かる方がいたらぜひ教えてください。よろしくおねがいします。
define.h内の
フィールドの左上の座標
#define FX 32を#define FX 128
にして中央に画面をセットしたら
背景がやや左側から流れるようになりました。
初期位置から見て、前にまっすぐに流れるように背景の位置を+96ずらしたいのですが
3Dbackground.cpp内の具体的にどこをいじったらいいのでしょうか?
分かる方がいたらぜひ教えてください。よろしくおねがいします。