【问题标题】:Three.js, the lookAt function issue三.js、lookAt函数问题
【发布时间】:2014-12-06 14:05:51
【问题描述】:

我创建了一个圆柱体几何形状的圆锥体。然后当我想用lookAt函数旋转圆锥指向X轴的正方向时,它就不起作用了。我的代码有什么问题吗?或者这是 Three.js 的 bug?

你也可以在 jsFiddle 上看到我的代码:http://jsfiddle.net/ysmood/CRdxP/

class Stage
    constructor: ->
        @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
        )
        @camera.position.z = 200;
        @scene.add(@camera)

    make_meshes: ->
        size = 20
        @mesh = new THREE.Mesh(
            new THREE.CylinderGeometry(
                0, size, size
            ),
            new THREE.MeshNormalMaterial()
        )
        @scene.add(@mesh)

        # I want the mesh's tip point to right, but it doesn't work.
        @mesh.lookAt(new THREE.Vector3(1, 0, 0))

    draw: =>
        @renderer.render(@scene, @camera)

stage = new Stage
stage.draw()

【问题讨论】:

    标签: three.js webgl


    【解决方案1】:

    默认情况下,所有网格都将lookAt 向量设置为(0,0,1),并将up 向量设置为(0,1,0)。 通过将lookAt 向量设置为(1,0,0),您实际上将网格绕y 轴旋转了90 度。

    看这个演示:http://threejs.org/examples/misc_lookat.html

    你会发现

    geometry.applyMatrix( new THREE.Matrix4().makeRotationFromEuler( new THREE.Vector3( Math.PI / 2, Math.PI, 0 ) ) );
    

    该命令修改几何图形,使圆锥的尖边现在沿 z 轴放置,然后它使用 mesh.lookAt(someVector) 重新定向网格以查看空间中的某个所需点。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,真的很有帮助!顺便说一句,我认为lookAt向量的默认值应该是(0, 0, -1),或者相机的lookAt向量默认改为(0, 0, -1)
    • 我相信相机的默认值为(0,0,-1)。如果此答案解决了问题,请单击答案左侧的复选标记接受。谢谢。
    • 有没有办法只改变lookAt 向量?您的解决方案改变了几何的初始位置,这就是我不想要的。我知道我可以使用lookAt 将其旋转回(0, 1, 0),但它似乎有点脏。
    • 此外,只有geometry.applyMatrix(new THREE.Matrix4().makeRotationX(Math.PI / 2)) 会发挥作用。为什么还要旋转 y 轴?
    • 也许使用up 而不是lookAt 向量?所以几何本身不会改变,但尖的一面实际上是在up 方向。我复制/粘贴了演示中的代码,只是为了展示变换几何的原理以及如何完成。
    【解决方案2】:

    我自己也遇到了 camera.up 向量的问题,所以我编写了自己的 lookAt 函数,它不使用 up 向量。它只是将相机指向目标位置,保持当前滚动。

    CameraUtils.lookAt = function(camera, targetPosition) {
        var targetPos = camera.worldToLocal(targetPosition.clone());
        var rotationAxis = new THREE.Vector3().crossVectors(
            new THREE.Vector3(0, 0, -1),
            targetPos
        ).normalize();
        var angle = new THREE.Vector3(0, 0, -1).angleTo(
            targetPos.normalize().clone());
    
        camera.rotateOnAxis(rotationAxis, angle);
    }
    

    这样称呼它:

    CameraUtils.lookAt(camera, myObject.position);
    

    希望对你有帮助。

    【讨论】:

    • 谢谢老兄。这对物体也很有用,而不仅仅是相机。
    • 所以这类似于将相机包装在具有旋转 0,0,0 的父 Object3D 中,然后在父对象上调用常规查看(保留相机的“滚动”,假设相机仍在向下看 Z) ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多