ページ 11

龍神録60章にて

Posted: 2009年11月09日(月) 14:49
by はね
聞きたいことがあるのですが
フェードインした部分とフェードアウトする部分を
画面の中心を軸にして
添付した黄色の線に沿って回転する感じ(壁が軸に対して回る感じ)にしたいのですが、
どうしたらいいでしょうか?

Re:龍神録60章にて

Posted: 2009年11月09日(月) 23:38
by Justy
 全然イメージがつかめないのですが、「フェードインした部分とフェードアウトする部分」って
どこのことでしょうか?

 ただ画面全体が回転すればいいのですか?

Re:龍神録60章にて

Posted: 2009年11月10日(火) 01:40
by はね
そうです。よろしくお願いします

Re:龍神録60章にて

Posted: 2009年11月10日(火) 02:22
by Justy
 3D部分だけなら、ワールド行列かカメラ(ビュー行列)をZ軸で回転させれば回ります。

 2Dも含めて回したい場合は、回したい部分だけを一旦別のテクスチャに
レンダリングしておいて、そのテクスチャを回転させて画面に描画すればOKです。

Re:龍神録60章にて

Posted: 2009年11月10日(火) 03:16
by はね
一応、Justyさんのサンプルも使ってるのですが
http://www.play21.jp/board/formz.cgi?ac ... &rln=36229
そのZ軸に値する場所ってどこなのでしょうか?

Re:龍神録60章にて

Posted: 2009年11月10日(火) 14:38
by はね
すみません。ここということが分かったのですが、
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; 
    camera.pos_offset.z += (r.z - camera.pos_offset.z) * k; 
     
    VECTOR pos; 
    VectorAdd(&pos, &camera.base_pos, &camera.pos_offset); 
     
    MATRIX cameraMatrix; 
    CreateLookAtMatrix(&cameraMatrix, &pos, &camera.target, &camera.up); 
    SetTransformToView(&cameraMatrix); 
}
カメラ自体を回す方法が分からないのですが
どうしたらいいのでしょうか?

Re:龍神録60章にて

Posted: 2009年11月10日(火) 22:46
by Justy
 なるほど。回すのは3D部分だけでいいのですね。

 CreateLookAtMatrixの第3引数に上向きのベクトルを指定してあげてください。

 先のスレのままなら、camera.upが指定されているはずで、中身は [0, 1, 0]、
つまり真上を向くようになっています。

 これを例えば、[-1, 0, 0] とかにすれば右に 90度回転することができますし、
[0, -1, 0]なら 180度、上下逆さまになります。

Re:龍神録60章にて

Posted: 2009年11月11日(水) 03:04
by はね
ありがとうございます。
ただ、これだと一瞬のうちに角度が変わってしまうのですが、
綺麗に角度をゆっくり変える方法はないでしょうか?

Re:龍神録60章にて

Posted: 2009年11月11日(水) 22:42
by Justy

>綺麗に角度をゆっくり変える方法はないでしょうか?

 ベクトルを指定すればその向きが上になる(正確にはちょっと違いますが)のですから、
ベクトルをゆっくりなめらかに回してあげればいいだけです。

 60章のサンプルの場合、視線の Zの符号が一定なので [0, 1, 0]を
Z軸で指定角度だけ回転した行列を使って求めてもいいですし、
単純に xと y要素を円の方程式を使って回転したベクトルを指定すれば、
滑らかになるはずです。

Re:龍神録60章にて

Posted: 2009年11月12日(木) 19:50
by はね
例えばですが、
右に40度動かすには
具体的にどういった計算方法で算出すればいいのでしょうか?

Re:龍神録60章にて

Posted: 2009年11月12日(木) 23:13
by Justy

>具体的にどういった計算方法で算出すればいいのでしょうか

 60章であれば
[color=#d0d0ff" face="monospace]
const float angle40 = 40.f * (float)PI / 180.f;
camera.up.x = -sinf(angle40);
camera.up.y = cosf(angle40);
[/color]

でいいと思います。

 カメラを本格的にいじり始めたらこれじゃダメですけど。

Re:龍神録60章にて

Posted: 2009年11月12日(木) 23:15
by Dixq (管理人)
短文で申し訳ないですが、
ver3が出たいまやもう昔の3D関数を使う意味はないので、
本格的に3D描画をしたいなら、新しく実装された3D関数をお使いになってはいかがでしょうか?

あんなに苦労したのにDXライブラリは便利になりすぎだよ、うぅ(悲嬉涙