1

在我的应用程序中,我显示了一个 3D 图形,并向用户展示了用于旋转对象视图的控件。我的偏好不是实际旋转对象,而是围绕对象旋转相机,因此稍后添加诸如放大之类的操作会更简单一些。

使用 Three.js 以一定半径旋转相机似乎是一件容易的事。只需围绕 XZ 平面中具有一定半径的圆的每个点重新定位和重新瞄准相机。我的代码通过以下方式执行此操作:

render: ->
    @camera.lookAt @model.position
    @renderer.render @scene, @camera

rotate: (theta)->
    @rotation += theta

    @camera.position.x = @cameraDistance * Math.sin(@rotation)
    @camera.position.z = @cameraDistance * Math.cos(@rotation)

    @.render()

rotate()每当用户单击按钮时,都会调用该方法。

这看起来很简单,实际上基本上是在许多 Three.js 示例应用程序中使用的。然而,当我这样做时,这个人物的运动并不是静止的旋转——它确实会旋转,但似乎也以某种椭圆的方式移动(见截图)。

此外,在进行健全性检查时,我发现执行console.log square(@camera.position.x) + console.log square(@camera.position.z)不会产生@cameraDistance数字,而是会从非常小的值增长到巨大的值。出于某种原因,在这种情况下,单位圆身份似乎不适用于我。

感觉就像我在这里遗漏了一些明显的东西。谁能告诉我它是什么?

中立位置 图不是静止的 移出图片 在镜头前经过

4

1 回答 1

0

虽然这是一个老问题:

我很确定你只是混淆了 sin 和 cos。

OP的代码:

@camera.position.x = @cameraDistance * Math.sin(@rotation)
@camera.position.z = @cameraDistance * Math.cos(@rotation)

正确代码:

@camera.position.x = @cameraDistance * Math.cos(@rotation)
@camera.position.z = @cameraDistance * Math.sin(@rotation)
于 2014-06-05T12:23:49.040 回答