【发布时间】:2013-07-15 19:36:42
【问题描述】:
我想在查看(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()
【问题讨论】:
-
您可能遇到了 Gimbal Lock 问题(您可以在网上研究)。解决方案是改用四元数旋转(也可研究)。请注意,最新的 Three.js,r59 现在默认使用四元数,并且 Object3D 中提供了新的旋转方法可能会有所帮助(rotateX()、rotateAroundAxis() 和朋友)。
-
您确定这是云台锁定问题吗?问题是我不知道
lookAt函数的机制。为什么团队不在lookAt函数中使用四元数?
标签: coffeescript three.js webgl