谷歌搜索后我没有找到这个问题的答案,所以我将在这里尝试。
使用(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做了一些事情,由于上面的代码他们做错了...
答案 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.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);