在javascript中围绕对象旋转3d摄影机

在javascript中围绕对象旋转3d摄影机,javascript,math,3d,Javascript,Math,3d,谷歌搜索之后,我还没有找到这个问题的答案,所以我打算在这里试试 使用(2d)画布,我用javascript创建了一个3d世界,甚至还制作了一个可以很好地使用它的3d相机。但是,相机是“自由相机”,因此当您旋转时,相机会围绕自身旋转 现在我想让相机围绕一个现实中的物体旋转,但我很难理解怎么做 我尝试了下面的公式,但在我尝试旋转之前它就崩溃了。。。 迄今为止已更新 多亏了下面WojtekT提供的anwser,我得到了下面的代码,它使相机围绕着物体旋转,但似乎也在放大。。。这可能只是我的眼睛在愚弄

谷歌搜索之后,我还没有找到这个问题的答案,所以我打算在这里试试

使用(2d)画布,我用javascript创建了一个3d世界,甚至还制作了一个可以很好地使用它的3d相机。但是,相机是“自由相机”,因此当您旋转时,相机会围绕自身旋转

现在我想让相机围绕一个现实中的物体旋转,但我很难理解怎么做

我尝试了下面的公式,但在我尝试旋转之前它就崩溃了。。。

迄今为止已更新 多亏了下面WojtekT提供的anwser,我得到了下面的代码,它使相机围绕着物体旋转,但似乎也在放大。。。这可能只是我的眼睛在愚弄我,因为距离变量几乎没有变化(我认为有一个很小的舍入问题,但除此之外,它给出了预期的结果)

其中,这个.yd是它应该运行的速度,单位为度

我需要什么配方

编辑: 我不确定哪些代码有助于解决此问题,因此以下是完整的源代码:

http://clanpvp.com/js/sol/camera.js 出于调试原因,在触发keyup事件时将加载新帧。 同样为了调试,目标对象是一个固定点。在屏幕中央


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

要使此公式起作用,您必须有一些变量来更改每一帧。例如变量
时间

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
每帧返回相同的值。 基本上,对于旋转的物体,你需要提供随时间变化的角度。在本例中,角度是可变的
时间

编辑: 在我的回答中,我将
+=
替换为
=
。此计算给出了正确的
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);

你说的“它疯了”是什么意思?我不太清楚到底发生了什么,但相机似乎每帧都会向后移动。我猜我使用的公式是完全错误的,所以相机做了一些完全不同的事情,然后我想你能给我们展示更多的代码吗?我不太确定什么代码可以帮助解决这个问题,所以我将只链接项目。是的,请,这肯定会有帮助。yd在用户按键时会改变,对不起,我不清楚。我列出了使事情更清楚的希望来源是
这个.yd
旋转的速度或旋转本身?这个.yd就是旋转本身。你似乎不需要增加
.x
.z
。我已经编辑了我的答案,并将
+=
-=
替换为
=
。我更新了代码以反映您的anwser(减去时间变量),但camara仍然不起作用(即使没有任何输入)
time += this.yd;
this.x = (Math.sin(time * (Math.PI / 180)) * distance);
this.z = (Math.cos(time * (Math.PI / 180)) * distance);
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);