【问题标题】:Three.js tweened value doesn't arrive at target, instead completes but stays at initial valueThree.js补间值没有到达目标,而是完成但保持在初始值
【发布时间】:2012-11-13 03:29:45
【问题描述】:

我正在尝试在我的 WebGL 项目 (http://eyesonmars.com/) 中使用 Tween 将其顺利移动到新位置。但是,我还不能让 Tween 为我工作。

不是在 3 秒内将 camera.position.x 的值从 -3 调整到 -10,而是将相机的位置发送到 x=-3 并且不会继续。我还确认 Tween 对象通过让 Tween 的 .onComplete() 弹出一个警报来确认它已经完成了它的任务(我已经删除了该警报,因此它不在当前代码中)。

这是我正在使用的代码,可以在 http://eyesonmars.com/libs/EOM_Utils.js 找到它

function zoomOutCamera()
{
    var position, target;

    // app.camera.position.z = 10;

    position = -3.0;
    target = -10.0;
    myTween = new TWEEN.Tween(position).to(target, 3000);

    myTween.onUpdate(function(){
        // alert(position);
        app.camera.position.x = position;
    });

    // myTween.onComplete(bananaphone(position));

    myTween.start();
}


function myAnimate()
{


    if(!myTween.onComplete())
    {
    requestAnimationFrame( myAnimate);
    }
    myTween.update();


}

下面我总结了我是如何测试代码的,以及根据我认为我知道的应该发生的事情。

发生了什么: 输入浏览器 JavaScript 控制台:

input: camera.position.x
output: 0.5
input: myAnimate()
output: undefined
input: camera.position.x
output: -3

应该发生什么(根据我): 输入浏览器 JavaScript 控制台:

input: camera.position.x
output: 0.5
input: myAnimate()
output: undefined
input: camera.position.x
output: -10

我尝试了补间的不同变体,还研究了在线解决方案和我的 O'Reilly 书。我很高兴听到有关如何更准确地发布我的问题的任何建议。

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: javascript webgl three.js tween


    【解决方案1】:

    Tween 的更新功能需要时间!???? 当您使用 3d 渲染函数“myAnimate”时,您需要传递时间参数...

    function myAnimate(time)
    {
    
    
        if(!myTween.onComplete())
        {
        requestAnimationFrame( myAnimate);
        }
        myTween.update(time);
    
    
    } 

    【讨论】:

    • 请注意,总是需要传递时间,而不仅仅是在 3d 渲染方法中。在一个非常简单的例子中,只是在 HTML 页面上移动一个 div 元素,还需要传入 + new Date(),正如@Gero3 所指出的那样。我觉得奇怪的是这不在示例中,还是我忽略了它?
    【解决方案2】:

    tween 不适用于整数

    function zoomOutCamera()
    {
        var position, target;
    
        // app.camera.position.z = 10;
    
        position = { x:-3.0};
        target = {x:-10.0};
        myTween = new TWEEN.Tween(position).to(target, 3000);
    
        myTween.onUpdate(function(){
            // alert(position);
            app.camera.position.x = this.x;
        });
    
        // myTween.onComplete(bananaphone(position));
    
        myTween.start(+new Date());
    }
    
    
    function myAnimate()
    {
    
    
        if(!myTween.onComplete())
        {
        requestAnimationFrame( myAnimate);
        }
        myTween.update(+new Date());
    
    
    } 
    

    【讨论】:

    • 非常感谢您的快速回复。我已经合并了更改以确保变量是浮点数并且它正在做某事。但是,现在该值变为 NaN。我正在积极寻找解决方案,但我想我会发布,以便您知道即时结果。
    • 对不起,它似乎需要在回调中使用 this 而不是位置:myTween.onUpdate(function(){ // alert(position); app.camera.position.x = this. x; });
    • 我已将 Gero3 的答案中建议的更改合并到同一网站 eyesonmars.com 要查看结果,它需要 myAnimate2()
    • 我刚刚将最新的合并到 myAnimate2() 中,从 position.x 更改为 this.x。在这两种情况下,相机值的结果都是 NaN。我将离开电脑大约 30 分钟,这样我就可以像现在一样快速做出反应。非常感谢您的宝贵时间。
    • 我又更新了。它也应该在 start 和 update() 中获得时间
    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多