ページ 1 / 1
60章 視点を変える方法
Posted: 2009年6月30日(火) 07:15
by kai
龍神録60章を改造して遊んでいるのですが、
東方星蓮船の3面の最初みたいに視点を動かして
左右にゆらゆら動くようにしたいのですが、
どうソースを変えたらそんな風になるでしょうか?
Re:60章 視点を変える方法
Posted: 2009年7月01日(水) 00:04
by Justy
東方星蓮船の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章 視点を変える方法
Posted: 2009年7月01日(水) 14:06
by kai
>Ini3Dbackground関数のどこかで InitCamera()を、
>Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。
っていうのがちょっと言ってる意味が分からないのですが、どういうことなのでしょうか?
もうちょっと分かりやすく教えていただけたら幸いです。
それと
>CreateLookAtMatrix()の第2引数にカメラの位置を、第3引数にどこの位置を見るかを指定
とのことですが、どんな感じに指定すればいいのでしょうか?
簡単でいいですので例を挙げてもらえませんか?
Re:60章 視点を変える方法
Posted: 2009年7月01日(水) 14:21
by kai
ずみません。
>Ini3Dbackground関数のどこかで InitCamera()を、
>Main3Dbackground()の先頭で UdateCamera()をコールしてあげてください。
これは自己解決しました。
Re:60章 視点を変える方法
Posted: 2009年7月01日(水) 23:57
by kai
この視点は初期化できないんでしょうか?
最初からやり直すと
少しづつ右によって行くバグが発生するのですが・・
仕様なのかな?
Re:60章 視点を変える方法
Posted: 2009年7月02日(木) 00:41
by Justy
あー、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]
で。
Re:60章 視点を変える方法
Posted: 2009年7月02日(木) 01:19
by kai
??
試してみましたが特にバグは消えませんでした・・
Re:60章 視点を変える方法
Posted: 2009年7月02日(木) 01:28
by Justy
「最初からやり直す」ってアプリそのものを起動し直すことですか?
それとも何かそういう方法が?
そういう現象に遭遇しないのですが。
Re:60章 視点を変える方法
Posted: 2009年7月02日(木) 01:44
by kai
支館様のプログラムを活用したコンテニューです。
最初から始めるを選ぶとfunc_state = 99;になりゲーム初期化をする処理になるようにしてあります。
そのあと、ini();を呼びだしたのち、通常処理のfunc_state=100;にとぶようにしてあるのですが、
そのときコンテニューした場合、全画面の位置がやや右に移動してから起動してしまいます。
ふたたびコンテニューすると、もっと右に移動し、これを繰り返すと左側に桜の木と右側に黒画面しか
スクロールしない状況になります。
Re:60章 視点を変える方法
Posted: 2009年7月02日(木) 01:52
by kai
念のため、3Dbackground.cppに記述してあること自体が間違っている可能性もあるかも
しれないので添付しておきます
Re:60章 視点を変える方法
Posted: 2009年7月02日(木) 01:55
by Justy
>最初から始めるを選ぶと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章 視点を変える方法
Posted: 2009年7月02日(木) 02:17
by kai
考えて色々やってみたのですが
camera.pos_offset.x = camera.pos_offset.y = camera.pos_offset.z = 0;
の行だけ2回目以降は実行するやり方というのが分からなく、うまくいきませんでした。
どうしたらいいのでしょうか?
Re:60章 視点を変える方法
Posted: 2009年7月02日(木) 09:43
by ねこ
横から失礼します。
ただ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章 視点を変える方法
Posted: 2009年7月02日(木) 13:53
by kai
ねこさん、ありがとうございます。
さっそくやってみたのですが、それだと最初っから画面が真っ暗になってしまうのですが・・
Re:60章 視点を変える方法
Posted: 2009年7月02日(木) 14:09
by ねこ
えーっともしかして「//既存処理」のとこそのままにしてますか?
// 既存処理の所は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章 視点を変える方法
Posted: 2009年7月02日(木) 19:40
by kai
直りました!
ほんと、Justyさんとねこさんには感謝の気持ちでいっぱいです!
ありがとうございました。!これからもっと頑張って改良したいと思います!
Re:60章 視点を変える方法
Posted: 2009年7月03日(金) 02:55
by kai
最後に質問があるのですが
define.h内の
フィールドの左上の座標
#define FX 32を#define FX 128
にして中央に画面をセットしたら
背景がやや左側から流れるようになりました。
初期位置から見て、前にまっすぐに流れるように背景の位置を+96ずらしたいのですが
3Dbackground.cpp内の具体的にどこをいじったらいいのでしょうか?
分かる方がいたらぜひ教えてください。よろしくおねがいします。
Re:60章 視点を変える方法
Posted: 2009年7月03日(金) 23:47
by 通りすがり
96?
Re:60章 視点を変える方法
Posted: 2009年7月04日(土) 01:19
by Justy
試していませんが + 25をカット、かな。
Re:60章 視点を変える方法
Posted: 2009年7月04日(土) 14:36
by kai
おお!25を削除しただけで直りました。
Justyさんありがとうございます!