2

グーグルで調べた後、この質問に対する答えが見つからなかったので、ここで試してみます。

(2D)キャンバスを使用して、JavaScriptで3Dワールドを作成し、それで正常に動作する3Dカメラを作成しました。ただし、カメラは「自由なカメラ」であるため、回転すると、カメラはそれ自体を中心に回転します。

今、私はカメラを世界内のオブジェクトの周りに回転させたいと思っていますが、その方法を理解するのに苦労しています。

次の式を試しましたが、回転しようとする前にびっくりします...

this.x += (Math.sin(this.yd * (Math.PI / 180)) * distance);
this.z -= (Math.cos(this.yd * (Math.PI / 180)) * distance);

これまでの更新 以下の WojtekT によって提供された anwser のおかげで、次のコードにたどり着きました。カメラをオブジェクトの周りに向けますが、ズームインしているようにも見えます...距離変数がほとんど変化しないため、これは私の目がだまされているだけかもしれません(小さな丸めの問題があると思いますが、それ以外は期待される結果が得られます)

this.y = (Math.sin(this.yd * (Math.PI / 180)) * distance + this.targetY);
this.z = (Math.cos(this.yd * (Math.PI / 180)) * distance + this.targetZ);

this.yd は、度単位で実行する速度です。

どの式が必要ですか?

編集:どのコードがこの問題の解決に役立つかわからないため、完全なソースを次に示します。

http://clanpvp.com/sol http://clanpvp.com/js/sol/camera.js < Camera オブジェクト、これだろう。

デバッグ上の理由から、キーアップ イベントがトリガーされると、新しいフレームが読み込まれます。また、デバッグの場合、ターゲット オブジェクトは固定点です。画面中央に。

矢印キーはカメラを動かし、wasd キーはカメラを回転させます。これまでのところ、W と S だけが何かを行い、上記のコードのおかげで間違っています...

4

1 に答える 1

2

この式が機能するには、各フレームを変更する変数が必要です。たとえば、変数time:

time += this.yd;
this.x = (Math.sin(time * (Math.PI / 180)) * distance);
this.z = (Math.cos(time * (Math.PI / 180)) * distance);

それ以外の場合は、各フレームで同じ値Math.sinを返します。Math.cos基本的に何かを回転させるには、時間とともに変化する角度を提供する必要があります。この例では、角度は可変ですtime

編集:私は私の答えに置き換え+=ました。=この計算により正確な正確なx値が得られるzため、インクリメントを行う必要はありません。

編集2:

この式にも回転の中心がありません。適切な計算は次のようになります。

this.x = (Math.sin(this.yd * (Math.PI / 180)) * distance + object_looked_at.x);
this.z = (Math.cos(this.yd * (Math.PI / 180)) * distance + object_looked_at.z);
于 2012-05-11T09:46:17.463 に答える