围绕javascript中的对象围绕3d相机

时间:2012-05-11 09:19:43

标签: javascript math 3d

谷歌搜索后我没有找到这个问题的答案,所以我将在这里尝试。

使用(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<相机对象,这可能。

出于调试原因,在触发keyup事件时会加载新帧。 同样,对于调试,目标对象是固定点。在屏幕的中心。

箭头键移动相机,wasd键转动相机,到目前为止只有W和S做了一些事情,由于上面的代码他们做错了...

1 个答案:

答案 0 :(得分:2)

要使此公式起作用,您必须拥有一些可更改每个帧的变量。例如变量time

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

否则Math.sinMath.cos每帧返回相同的值。 基本上对于要旋转的东西,您需要提供随时间变化的角度。在此示例中,角度是变量time

编辑: 在我的回答中,我已将+=替换为=。此计算可为您提供正确的xz值,因此您无需进行任何增量。

编辑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);