Three.js相机旋转问题

时间:2013-07-17 09:51:44

标签: coffeescript three.js webgl

我想在观察(0, 0, 0)点的同时围绕y-z平面上的x轴旋转相机。事实证明lookAt函数表现得很奇怪。旋转180°后,几何体意外跳到另一侧。你能解释一下为什么会这样,以及如何避免它?

您可以在jsFiddle上看到现场演示:http://jsfiddle.net/ysmood/dryEa/

class Stage
    constructor: ->
        window.requestAnimationFrame = 
            window.requestAnimationFrame or
            window.webkitRequestAnimationFrame or
            window.mozRequestAnimationFrame

        @init_scene()
        @make_meshes()

    init_scene: ->
        @scene = new THREE.Scene

        # Renderer
        width = window.innerWidth;
        height = window.innerHeight;
        @renderer = new THREE.WebGLRenderer({
            canvas: document.querySelector('.scene')
        })
        @renderer.setSize(width, height)

        # Camera
        @camera = new THREE.PerspectiveCamera(
            45,                 # fov
            width / height,     # aspect
            1,                  # near
            1000                # far
        )
        @scene.add(@camera)

    make_meshes: ->
        size = 20
        num = 1

        geo = new THREE.CylinderGeometry(0, size, size)
        material = new THREE.MeshNormalMaterial()
        mesh = new THREE.Mesh(geo, material)
        mesh.rotation.z = Math.PI / 2

        @scene.add(mesh)

    draw: =>
        angle = Date.now() * 0.001
        radius = 100

        @camera.position.set(
            0,
            radius * Math.cos(angle),
            radius * Math.sin(angle)
        )
        @camera.lookAt(new THREE.Vector3())

        @renderer.render(@scene, @camera)
        requestAnimationFrame(@draw)

stage = new Stage
stage.draw()

1 个答案:

答案 0 :(得分:2)

您正在Y-Z平面中围绕X轴旋转相机。当摄像机经过“北”和“南”两极时,它会翻转以保持正面朝上。默认情况下,相机的向上矢量为(0, 1, 0)

将相机x位置设置为100,因此其行为对您来说是正确的。在演示中添加一些轴作为参考框架。

这不是图书馆的错。查看Camera.lookAt()源代码。

如果您想通过其四元数来设置相机方向,则可以这样做。

three.js r.59