ページ 11

キャラクターが向いている方向に移動

Posted: 2010年3月24日(水) 03:08
by SHIM
キャラクターが向いている方向に移動するようにPGを書いているのですが値が変わりません。
Player.rotが0~360度の回転の値が入っております。
どのようにすればよいのでしょうか?

またCameraMoveという関数を作って
キャラクターが向いている方向を自動的に見るような仕様にしたいのですが
キャラクターの向いている方向に注視点を作りだすこと及びカメラの位置の移動についてがよくわかりません。
http://homepage2.nifty.com/natupaji/DxL ... ction.html
↑等も見て参考にしてみたのですがよくわかりませんでした・・・。


    // 初期化
    Player.Move.x = 0;
    //Player.Move.y = 0;
    Player.Move.z = 0;
    
    float rot = float(Player.rot/180*M_PI);

    // 移動処理
    if( Key[KEY_INPUT_UP].Flg == 1 ){
        Player.Move.x = cos(rot) * Player.MoveSpeed;
        Player.Move.z = sin(rot) * Player.MoveSpeed;
    }
    if( Key[KEY_INPUT_DOWN].Flg == 1 ){
        Player.Move.x = cos(rot) * Player.MoveSpeed * -1;
        Player.Move.z = sin(rot) * Player.MoveSpeed * -1;    
    }

    //  ジャンプ処理
    if( Key[KEY_INPUT_SPACE].trgKey == 1 ){
        if(Player.Move.y == 0)    Player.Move.y = 4;
    }

    if(Player.Move.y != 0){
        Player.Move.y -= 0.2f;
    }

    // 移動値加算
    Player.Pos.x += Player.Move.x;
    Player.Pos.y += Player.Move.y;
    Player.Pos.z += Player.Move.z;

    // Yは0より下がらない
    if(Player.Pos.y <= 0){
        Player.Pos.y = 0;
        Player.Move.y = 0;
    }

Re:キャラクターが向いている方向に移動

Posted: 2010年3月24日(水) 15:55
by SHIM
すみません。DXライブラリを使っております。

Re:キャラクターが向いている方向に移動

Posted: 2010年3月24日(水) 18:28
by softya
部分的だと分からないことも多いので全てのソースコードを添付してもらえますか。
プロジェクトは、ここの添付制限120KBを超えるので不要です。 画像

Re:キャラクターが向いている方向に移動

Posted: 2010年3月25日(木) 01:03
by SHIM
回答ありがとうございます。
ソースを添付させて頂きます。

関係ある部分だけ切り取らさせて頂きました。
もしかしたら実行するとエラーが出るかもしれません。

Re:キャラクターが向いている方向に移動

Posted: 2010年3月25日(木) 01:36
by ideyan
見てて思ったんですが

float rot = float(Player.rot/180*M_PI);

Player.rotはintっぽいので

Player.rot / 180
この部分がintで計算されて、
2~0×M_PIをfloatにキャストするってなってないですか?
(float)Player.rot/180*M_PI
とか
Player.rot/180.0f*M_PI
でなんか変わりそうな気がするんですが。

Re:キャラクターが向いている方向に移動

Posted: 2010年3月26日(金) 04:37
by SHIM
ideyan様
rotをfloat型に修整した所、少し近づきましたありがとうございます。
ただやはり上手くは動いてくれません・・・。
キャラクターが旋回?するようにしてカメラもそれを追うような形にしたいのですが
カメラの位置がおかしな値になってしまいます。

Re:キャラクターが向いている方向に移動

Posted: 2010年3月26日(金) 07:42
by Ma
>カメラの位置がおかしな値になってしまいます。
ソース見ました。
Camera.Pos, Camera.EyePos
の計算部分が見当たりません。(初期化しか見当たりませんでした。)
そもそも、計算をしようとすらしていないので、うまく動かないというよりは
計算の仕方を教えてほしいということでいいですか?


私が実装するなら、
カメラの注視点はプレイヤーの位置でOKです。
カメラの位置は、プレイヤーの向きベクトルに、負の値をかけれたベクトルをプレイヤーの位置ベクトルに加算するといいと思います。

こうすると、プレイヤーの向きの反対側、つまり後ろからプレイヤーを見ることになります。

Re:キャラクターが向いている方向に移動

Posted: 2010年3月26日(金) 10:24
by SHIM
Ma様

回答ありがとうございます。

カメラは自分なりに実装してみました。
とりあえず全てPlayMove関数で行ってしまっておりますが気にしないで下さい。

ただキャラクターが移動してしまいますと問題が発生します。

上下キーを押すとキャラクターは動き
カメラの位置がおかしい為どんどん遠ざかってしまいます。

これをCamera.Length分、後ろに下がった場所からみたいのですが
どの様に値を取得すればよいのかがわかりません。

又、3Dの場合X軸がSINでZ軸がCOSであっているでしょうか?

その他ソースにておかしい部分がありましたら指摘頂けますと助かります。
お手数ですがご教授願えないでしょうか?

Re:キャラクターが向いている方向に移動

Posted: 2010年3月26日(金) 14:41
by Ma
んー。
どうやら、難しく考えすぎているようです。


>カメラの位置は、プレイヤーの向きベクトルに、負の値をかけれたベクトルをプレイヤーの位置ベクトルに加算するといいと思います。

おそらく、ここを誤解していますよ。

プレイヤーの向きベクトルに、負の値をかけれたベクトル = VScale(Player.Move,-1)
//ただし、-1でなくても、-2でもOK。この値の絶対値が距離に比例する。


プレイヤーの位置ベクトル = Player.pos


プレイヤーの向きベクトルに、負の値をかけれたベクトルをプレイヤーの位置ベクトルに加算 = VAdd(VScale(Player.Move,-1),Player.pos)

これが、カメラの位置です。
ちなみに、こぴぺではなく理解してくださいね。

意外と簡単なことです。
まずプレイヤーの位置から、プレイヤーが移動しようとしている方向の逆方向に移動させたベクトルなんです。


(0,0) にプレイヤー 、(0,1)方向にむいているなら、
カメラの位置は、
<0,0> + (-1)*<0,1>です。
すなわち、<0,-1> になるんです。

そのてんから、プレイヤーがいる位置<0,0>に注視したと想像してください。

見事にプレイやーがカメラにおさまって、しかも進行方向を見ていると思いませんか?

Re:キャラクターが向いている方向に移動

Posted: 2010年3月26日(金) 16:15
by SHIM
Ma様
丁寧な説明で何となく理解しました。

もしキャラクターが回転して常にキャラの後ろにカメラを設定したい場合は

Camera.Pos = VAdd(VScale(Player.Move,-1),Player.Pos);
Camera.Pos.x += sin(rot) * Camera.Length;
Camera.Pos.z += cos(rot) * Camera.Length;

と書けばよいということですよね?
試してみた所、問題なく動いているようです。

非常に助かりました><

Re:キャラクターが向いている方向に移動

Posted: 2010年3月27日(土) 12:21
by Ma
>と書けばよいということですよね?

いや、
Camera.Pos.x += sin(rot) * Camera.Length;
Camera.Pos.z += cos(rot) * Camera.Length;
これは不要だと思いますよ。
もしかしたら私が理解していないだけかもしれません。
これはどのような意図でかかれたのでしょうか?


Camera.Pos = VAdd(VScale(Player.Move,-Camera.Length),Player.Pos);

Camera.Length が、カメラからキャラクターまでの距離ならば、
この1行だけでいいとおもうのですが、、、