Tween相机目标在three.js

时间:2017-06-26 15:23:25

标签: three.js

我的代码效果很好:

function onMouseMove( event ) {

        window.onmousedown = function() { 

            var canvasPosition =    renderer.domElement.getBoundingClientRect();

            var mouseX = event.clientX - canvasPosition.left;
            var mouseY = event.clientY - canvasPosition.top;

            var mouseVector = new THREE.Vector3 (
                            2 * (mouseX / window.innerWidth) - 1,
                    1 - 2 * (mouseY / window.innerHeight), 1);

            mouseVector.unproject( camera );
            var dir = mouseVector.sub( camera.position ).normalize();
            var distance = - camera.position.z / dir.z;
            var pos = camera.position.clone().add( dir.multiplyScalar( distance ) );


            camera.getWorldDirection();

            camera.lookAt( pos );
            // camera.updateMatrixWorld(true);

            console.log(mouseVector);
            console.log(mouseX);
            console.log(mouseY);

            // render();

        }
  }

但我想顺利运动。所以我从补间示例中找到了以下代码,但不确定如何使用它。在上面的代码中,我从一个地方,一种格式获取当前相机的外观,并将新相机放在camera.lookat中以不同的格式显示 - 它们似乎都不是标准的x,y,z。

在下面的代码中,补间会让我更改单个项目的属性(x,y,z)。相机的未投影和标准化不适用:

new TWEEN.Tween( intersects[ 0 ].object.position )
  .to( { 
    x: Math.random() * 800 - 400, 
    y: Math.random() * 800 - 400, 
    z: Math.random() * 800 - 400 
  }, 2000 )
  .easing( TWEEN.Easing.Elastic.Out)
  .start();

如果出现故障或我可以阅读的内容,或者实际解决问题需要了解,我将不胜感激。我多年来一直在阅读相机教程和矩阵教程,但我的大脑根本无法理解它。

我一直在这里挖掘相当多,但没有什么可以解决相机补间 - 至少对于一个有效版本的threejs

谢谢!

2 个答案:

答案 0 :(得分:0)

我建议你熟悉线性插值,或者通常称为" lerp"。可用于在起点和终点之间插值的THREE.Vector3类has a lerp function

var camPos = new THREE.Vector3(0, 0, 0); // Holds current camera position
var targetPos = new THREE.Vector3(10, 10, -10); // Target position
var origin = new THREE.Vector3(0, 0, 0); // Optional origin

function animate(){
    // Interpolate camPos toward targetPos
    camPos.lerp(targetPos, 0.05);

    // Apply new camPos to your camera
    camera.position.copy(camPos);

    // (Optional) have camera look at the origin after it's been moved
    camera.lookAt(origin);

    // render();
}

在上面的示例中,每帧调用一次animate()函数,相机每帧将向targetPos行进5%。

如果您更改targetPos,相机将为其新目标值设置动画。

我建议您在开始引入第二方库(如TWEEN.js或其他人)之前先熟悉lerping。

答案 1 :(得分:0)

只是为了平滑运动,这可能已经帮助你了:

override fun onCreatePreferences(bundle: Bundle?, s: String?) {}