SVG3d:使用缓动函数控制路径的旋转

时间:2013-11-30 02:41:55

标签: javascript html5 svg svg-animate

我正在尝试在一个SVG中的某些路径中模拟y轴之间的三维旋转。 我找到了图书馆SVG3D https://code.google.com/p/svg3d/ 我试了一下。

问题是你只能控制每个“tick”的滴答间隔持续时间和增量(以弧度表示)(有一个setInterval定时函数调用执行旋转的transform()函数。)

有一个toggleRotation函数,它的作用类似于播放暂停命令,但它不能让你控制路径的时间和旋转。

我的路径有以下示例代码:

<g id="anim_container" 
    z:xOrigin="0"
    z:yOrigin="0"
    z:zRatio="1000"
    z:sortAlgo="none" 
    z:rotationTime="60"
    onload="init(this);">
    <path
    d="M 460.2203,600.93365 248.25964,263.59573 C 248.63437,272.77915 249.10289,281.86852 249.66521,290.86388 250.03994,298.54799 250.32105,306.70032 250.50856,315.32088 250.88328,323.75461 251.07069,331.251 251.07079,337.81007 L 251.07079,600.93365 203.28125,600.93365 203.28125,204.84271 265.68876,204.84271 479.89835,544.42955 C 479.33579,535.24653 478.77356,526.06345 478.21166,516.88029 477.83651,509.00916 477.4617,500.48202 477.0872,491.29883 476.71206,481.92845 476.52465,473.02649 476.52497,464.59291 L 476.52497,204.84271 524.87674,204.84271 524.87674,600.93365 460.2203,600.93365"
    id="path_n">
        <z:translation x="364.0790100097656" y="402.88818359375"/>
        <z:rotation incRotY="0.5"/>
        <z:translation x="-364.0790100097656" y="-402.88818359375"/>
    </path>
</g>

那么,你怎么能控制物体的旋转和速度呢?是否可以包含一个缓动函数来控制每次旋转的速度?

1 个答案:

答案 0 :(得分:0)

我找到了解决此问题的方法。 它需要三个步骤

  1. 首先,它需要您更改Svg3d库代码。

    打开文件“svg3d_parsing.js”并在“init”函数中注释以下行

    function init(g) {
        .......
        //clockRotation = window.setInterval("transform()", rotationTime);
        .......
    }
    

    我在这里做的是避免使用库中包含的“ticking”函数,因此我们将能够调用transform()(执行旋转的函数,可用作全局函数)使用我们自己的滴答功能(仅在我们需要时)。 然后,在同一个文件中找到“getAttrValue”函数并注释此处显示的行:

    function getAttrValue(......
    .....
    if (incAttValue) {
       var incValue = parseFloat(incAttValue);
       //node.setAttribute(tag, returnedValue + incValue);
    }
    return returnedValue;
    

    这是控制旋转的核心。当你执行init(this)并且每次调用transform()时,属性rotX和/或rotY(取决于你是否设置了incRotX,incRotY或两者)包含在<z:rotation incRotY="0.5"/>标记中,导致{{1 (对于这个例子)。函数transform()然后读取这些值,并使用它们作为每个轴的旋转角度(以弧度表示)计算变换矩阵。

    同样,每次调用transform()时,incRotX和/或incRotY都会增加rotX和/或rotY。所以,通过评论这一行(并按照下面的步骤),我们将能够按照自己的意愿控制旋转角度。

  2. 其次,通过包含ID来编辑<z:rotation incRotY="0.5" rotY="0.5"/>标签(我使用svg3d库文件中的一个函数“dom_utils.js”,但出于此解决方案的目的,我们将只设置一个易于访问的ID)---(你甚至可以删除incRotY属性) 所以,我们得到

    <z:rotation>
  3. 最后,获取补间和滴答功能,将rotY(和/或rotX,具体取决于您的情况)设置为z:rotation标记。这将是函数变换将应用于路径的旋转角度。

    对于这个例子,我使用来自createjs套件的easeljs(用于滴答)和tweenjs(用于补间):http://www.createjs.com/

    将以下代码附加到svg结束标记之前的文件中。

    <z:rotation id="rot" incRotY="0.5"/>
    

    现在我们可以控制旋转的次数,动画的持续时间以及合并缓动功能。

  4. 可能必须有一个更整洁的解决方案。

    我已在http://pastebin.com/fjPV4Gb4

    中发布了整个解决方案

    请记住:不要使用toggleTransform函数!

      

    注释:您可以取消注释在“init”函数(“svg3d_parsing.js”)中调用“transform()”函数的clockRotation计时函数,并在“update”函数中删除对transform()的调用,结果在相同的功能。但是,对transform()的调用将导致无限制。