我有一个场景,可以渲染一个有多个物体的棋盘。单击其中一个对象并使用对象拾取,我可以获取对象并为摄像机位置设置动画,使其位于对象的“俯视”视图中。然后使用camera.lookAt方法我可以强制相机直接看对象。
我在动画开始时注意到在onUpdate方法中调用camera.lookAt时的快速跳转,因为它最初有一个很大的距离来旋转以查看所选对象。相比之下,每次对camera.lookAt的调用都很小,而且动画很好。
// Position the camera to fit
var tween = new TWEEN.Tween(camera.position).to({
x: selectedObject.position.x,
y: selectedObject.position.y,
z: 1
}).easing(TWEEN.Easing.Quadratic.InOut).onUpdate(function() {
camera.lookAt(selectedObject.position);
}).onComplete(function() {
camera.lookAt(selectedObject.position);
}).start();
有没有办法动画方法,还是我必须手动变换相机的矩阵值才能查看我选择的对象?
这是一个例子的小提琴。它使用WebGLRenderer,因此请使用合适的浏览器。
http://jsfiddle.net/fungus1487/SMLwa/
感谢您的帮助。
答案 0 :(得分:18)
您可以做的一件事是在相机位置和相机目标(您必须定义)之间进行补间。
var tween = new TWEEN.Tween( camera.position )
.to( {
x: selectedObject.position.x,
y: selectedObject.position.y,
z: 1
} )
.easing( TWEEN.Easing.Linear.None ).onUpdate( function () {
camera.lookAt( camera.target );
} )
.onComplete( function () {
camera.lookAt( selectedObject.position );
} )
.start();
var tween = new TWEEN.Tween( camera.target )
.to( {
x: selectedObject.position.x,
y: selectedObject.position.y,
z: 0
} )
.easing( TWEEN.Easing.Linear.None )
.onUpdate( function () {
} )
.onComplete( function () {
camera.lookAt( selectedObject.position );
} )
.start();
这有点棘手,因为补间需要完全同时运行,而且它们不...... 这就是在第二个补间中调用camera.lookAt()的原因。
答案 1 :(得分:5)
WestLangley的答案有效但似乎很奇怪。我使用了以下预定义位置(xyz)和目标(xyz)。使用透视摄像头和轨迹球控件。
new TWEEN.Tween( camera.position ).to( {
x: position.x,
y: position.y,
z: position.z}, 600 )
.easing( TWEEN.Easing.Sinusoidal.EaseInOut).start();
new TWEEN.Tween( controls.target ).to( {
x: target.x,
y: target.y,
z: target.z}, 600 )
.easing( TWEEN.Easing.Sinusoidal.EaseInOut).start();