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

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

箭头键移动相机,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.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);
于 2012-05-11T09:46:17.463 回答