如何在网页中做出炫酷的动画(使用Spine) 转

转自:https://www.jianshu.com/p/5f57fb4ae9da?tdsourcetag=s_pcqq_aiomsg

Lottie和Spine Runtime

Lottie是Airbnb推出的可以解析AE导出的包含动画信息的json文件的库,支持Android、iOS,React Native等平台。

Spine Runtime是Spine提供的Spine导出的动画解析的库,支持各种游戏引擎,如egret、cocos2d-x等。

Lottie渲染时需要提供一系列的图片,渲染不同帧的时候会使用组合不同的图片。Spine Runtime使用一个小图片合成的大图片,渲染时会取不同的部分来渲染。

Lottie
Spine Runtime

此外,Lottie支持svg、dom、canvas三种渲染方式,而Spine Runtime只支持canvas。

实际开发中,Lottie在应用中用的多,Spine Runtime在游戏中用的多。但并不代表他们不能在另外的场景中使用。

在web应用中使用Spine Runtime

需求中涉及到动画,设计师没有使用AE,而是使用Spine来设计的。导出的文件也是Spine特有的格式,于是我就对Spine进行了调研。

经过调研我发现Spine的Runtime中有Html Canvas,这就是他可用在web应用中的基础。

我把demo下下来看了一下,通过阅读代码,替换对应的资源文件,删减部分无用代码之后,对Spine Canvas Runtime的使用有了一些心得。

动画资源

Spine导出的文件有3个,xxx.atlas、xxx.json、xxx.png

xxx.json是动画的描述文件,分为skeleton、bones、slots、skins、animations这5部分

我们没必要去详细了解,只需要知道这里的animations下有一个叫做animation的动画就可以了。

xxx.png是图片文件,因为图片整合到了一起,所有有一个xxx.atlas文件来描述哪个小图片在什么地方。

资源就这3个文件,接下来就是动画实现的代码了。

动画实现代码

经过分析,整体流程就是加载资源后,通过不断的重绘来显示一帧帧的图片,图片的更新是通过时间的毫秒数来驱动的。

不断重绘的逻辑:

改变绘制内容的逻辑:

每次绘制传入两次绘制的时间差,spine runtime会计算出当前应该渲染的内容是什么。

上面是核心的不断重绘的机制和更新渲染内容的机制,整体的流程如下:

先加载资源,然后不断re-render。

整体代码如下:


<!-- saved from url=(0068)http://esotericsoftware.com/files/runtimes/spine-ts/examples/canvas/ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<script src="./js/spine-canvas.js"></script>
<style>
    * { margin: 0; padding: 0; }
    body, html { height: 100% }
    canvas { position: absolute; width: 100% ;height: 100%; }
</style>
</head>
<body>
<canvas id="canvas" width="398" height="588"></canvas>

<script>


var lastFrameTime = Date.now() / 1000;
var canvas, context;
var assetManager;
var skeleton, state, bounds;
var skeletonRenderer;

// var skelName = "spineboy-ess";
var skelName = "pk_list_flash";
// var animName = "walk";
var animName = "animation";


function init () {
    canvas = document.getElementById("canvas");
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    context = canvas.getContext("2d");

    skeletonRenderer = new spine.canvas.SkeletonRenderer(context);
    // enable debug rendering
    skeletonRenderer.debugRendering = false;
    // enable the triangle renderer, supports meshes, but may produce artifacts in some browsers
    skeletonRenderer.triangleRendering = false;

    assetManager = new spine.canvas.AssetManager();

    assetManager.loadText("assets/" + skelName + ".json");
    assetManager.loadText("assets/" + skelName.replace("-pro", "").replace("-ess", "") + ".atlas");
    assetManager.loadTexture("assets/" + skelName.replace("-pro", "").replace("-ess", "") + ".png");

    requestAnimationFrame(run);
}

function run () {
    if (assetManager.isLoadingComplete()) {
        var data = loadSkeleton(skelName, animName, "default");
        skeleton = data.skeleton;
        state = data.state;
        bounds = data.bounds;
        requestAnimationFrame(render);
    } else {
        requestAnimationFrame(run);
    }
}

function loadSkeleton (name, initialAnimation, skin) {
    if (skin === undefined) skin = "default";

    // Load the texture atlas using name.atlas and name.png from the AssetManager.
    // The function passed to TextureAtlas is used to resolve relative paths.
    atlas = new spine.TextureAtlas(assetManager.get("assets/" + name.replace("-pro", "").replace("-ess", "") + ".atlas"), function(path) {
        return assetManager.get("assets/" + path);
    });

    // Create a AtlasAttachmentLoader, which is specific to the WebGL backend.
    atlasLoader = new spine.AtlasAttachmentLoader(atlas);

    // Create a SkeletonJson instance for parsing the .json file.
    var skeletonJson = new spine.SkeletonJson(atlasLoader);

    // Set the scale to apply during parsing, parse the file, and create a new skeleton.
    var skeletonData = skeletonJson.readSkeletonData(assetManager.get("assets/" + name + ".json"));
    var skeleton = new spine.Skeleton(skeletonData);
    skeleton.flipY = true;
    var bounds = calculateBounds(skeleton);
    skeleton.setSkinByName(skin);

    // Create an AnimationState, and set the initial animation in looping mode.
    var animationState = new spine.AnimationState(new spine.AnimationStateData(skeleton.data));
    animationState.setAnimation(0, initialAnimation, true);
    animationState.addListener({
        event: function(trackIndex, event) {
            // console.log("Event on track " + trackIndex + ": " + JSON.stringify(event));
        },
        complete: function(trackIndex, loopCount) {
            // console.log("Animation on track " + trackIndex + " completed, loop count: " + loopCount);
        },
        start: function(trackIndex) {
            // console.log("Animation on track " + trackIndex + " started");
        },
        end: function(trackIndex) {
            // console.log("Animation on track " + trackIndex + " ended");
        }
    })

    // Pack everything up and return to caller.
    return { skeleton: skeleton, state: animationState, bounds: bounds };
}

function calculateBounds(skeleton) {
    var data = skeleton.data;
    skeleton.setToSetupPose();
    skeleton.updateWorldTransform();
    var offset = new spine.Vector2();
    var size = new spine.Vector2();
    skeleton.getBounds(offset, size, []);
    return { offset: offset, size: size };
}

function render () {
    var now = Date.now() / 1000;
    var delta = now - lastFrameTime;
    lastFrameTime = now;

    resize();
    
    state.update(delta);
    state.apply(skeleton);
    skeleton.updateWorldTransform();
    skeletonRenderer.draw(skeleton);

    requestAnimationFrame(render);
}

function resize () {
    var w = canvas.clientWidth;
    var h = canvas.clientHeight;
    if (canvas.width != w || canvas.height != h) {
        canvas.width = w;
        canvas.height = h;
    }

    // magic
    var centerX = bounds.offset.x + bounds.size.x / 2;
    var centerY = bounds.offset.y + bounds.size.y / 2;
    var scaleX = bounds.size.x / canvas.width;
    var scaleY = bounds.size.y / canvas.height;
    var scale = Math.max(scaleX, scaleY) * 1.2;
    if (scale < 1) scale = 1;
    var width = canvas.width * scale;
    var height = canvas.height * scale;

    context.setTransform(1, 0, 0, 1, 0, 0);
    context.scale(1 / scale, 1 / scale);
    context.translate(-centerX, -centerY);
    context.translate(width / 2, height / 2);
}

(function() {
    init();
}());

</script>
</body></html>

总结

web中的动画有属性动画和帧动画两种,帧动画常用的库有Lottie和Spine Runtime,用哪一种取决于动效师使用的是AE还是Spine,其中Spine多用于游戏的动画。

从图片资源的管理方式、支持的渲染方式和平台这几个方面比较了Lottie和Spine Runtime的区别:Spine 多用于游戏,图片资源整合到一起并且提供atlas文件来标明对应图片位置,支持canvas的渲染方式,支持各种游戏引擎。Lottie多用于应用,图片资源分开存放,支持canvas、svg、dom三种渲染方式,并且支持Android、ios、React Native等平台。仅从canvas角度看,两者区别并不大。

作者:凌霄光
链接:https://www.jianshu.com/p/5f57fb4ae9da
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

点赞
  1. Josephlax说道:
    Google Chrome Windows 10
    Looking for practical tips on home remodeling bellevue? This Home remodeling Bellevue resource gives you the essentials. Get clear steps, examples, and things to avoid before you start..
  2. Josephlax说道:
    Google Chrome Windows 10
    Looking for practical tips on siding contractors? This Siding contractors resource gives you the essentials. Get clear steps, examples, and things to avoid before you start..
  3. AndrewGof说道:
    Google Chrome Windows 10
    https://t.me/s/TeleCasino_1WIN
  4. JamesAmusa说道:
    Google Chrome Windows 10
    Эта статья сочетает познавательный и занимательный контент, что делает ее идеальной для любителей глубоких исследований. Мы рассмотрим увлекательные аспекты различных тем и предоставим вам новые знания, которые могут оказаться полезными в будущем. Подробнее тут - https://quick-vyvod-iz-zapoya-1.ru/
  5. Phillipvimip说道:
    Google Chrome Windows 10
    Quick reference on accessory dwelling unit contractor. Packed with the key takeaways only. Bookmark it for later research.
  6. SeymourFap说道:
    Google Chrome Windows 10
    https://t.me/s/official_beef_beef
  7. SeymourFap说道:
    Google Chrome Windows 10
    https://t.me/s/Rus1WIN_Casino
  8. Phillipvimip说道:
    Google Chrome Windows 10
    Clear overview: Siding near me. Great for a quick orientation. Perfect for a quick scan on the go.
  9. Phillipvimip说道:
    Google Chrome Windows 10
    Quick reference on shelter construction. Packed with the key takeaways only. Bookmark it for later research.
  10. ArthurRub说道:
    Google Chrome Windows 10
    Limo Service From Seattle Airport offers luxurious and convenient transportation. Upon arrival at Seattle-Tacoma International Airport, a professional chauffeur will greet you, assist with luggage, and escort you to your waiting limousine. The fleet includes modern, well-maintained vehicles equipped with amenities to ensure a comfortable ride. The service provides safe and reliable transfers to your destination, with options for corporate travel, special events, or tours. Booking is easy, with customer support available to assist with any needs. Whether you're traveling for business or leisure, Limo Service From Seattle Airport ensures a stress-free and elegant journey. - https://bdluxlimo.com/limo-service-from-seattle-airport-to-cruise-terminal/
  11. Robertged说道:
    Google Chrome Windows 10
    https://t.me/online_1_win/12177
  12. Phillipvimip说道:
    Google Chrome Windows 10
    Useful read: DADU:. The page keeps things concise and practical. Bookmark it for later research.
  13. Phillipvimip说道:
    Google Chrome Windows 10
    Clear overview: Commercial Siding. You’ll get the essentials in minutes. Perfect for a quick scan on the go.
  14. Danielhoish说道:
    Google Chrome Windows 10
    В этом информативном тексте представлены захватывающие события и факты, которые заставят вас задуматься. Мы обращаем внимание на важные моменты, которые часто остаются незамеченными, и предлагаем новые перспективы на привычные вещи. Подготовьтесь к тому, чтобы быть поглощенным увлекательными рассказами! Полная информация здесь - https://foodzamzam.com/index.php/2023/06/24/11129
  15. Phillipvimip说道:
    Google Chrome Windows 10
    Quick reference on Home office remodel. It outlines the basics without fluff. Handy when you need a fast refresher.
  16. GilbertMap说道:
    Google Chrome Windows 10
    В кардиологической и психологической поддержке «Частного Медика 24» в Самаре — полный комплекс для безопасного восстановления после запоя. Исследовать вопрос подробнее - вывод из запоя в стационаре анонимно самара
  17. ArthurRub说道:
    Google Chrome Windows 10
    Seattle executive car service offers premium limousine transportation tailored for business professionals, corporate clients, and discerning travelers. With a fleet of luxury sedans, SUVs, and stretch limousines, this service ensures comfort, style, and punctuality for airport transfers, corporate events, weddings, and city tours. Experienced, professional chauffeurs provide discreet, courteous service, prioritizing safety and efficiency. Whether you need a Seattle executive car service for a high-profile meeting, a seamless ride to Sea-Tac Airport, or an elegant night out, every detail is meticulously handled. Advanced booking options, real-time tracking, and 24/7 availability guarantee convenience and reliability. Ideal for executives, VIPs, and groups, Seattle executive car service combines sophistication with practicality, featuring amenities like Wi-Fi, refreshments, and climate control. Competitive pricing and customized packages make it a top choice for those seeking luxury transportation in Seattle. Trust this elite service for a flawless, stress-free experience. - https://bdluxlimo.com/the-gold-standard-of-chauffeur-excellence-seattle-town-car-service/
  18. ArthurRub说道:
    Google Chrome Windows 10
    Seattle VIP transportation offers premium limousine services for discerning clients seeking luxury, comfort, and professionalism. Whether for corporate events, weddings, airport transfers, or nightlife excursions, these elite services provide a fleet of high-end vehicles, including stretch limousines, SUVs, and executive sedans, all maintained to the highest standards. Experienced, courteous chauffeurs ensure punctuality and discretion, catering to every detail of your journey. Seattle VIP transportation prioritizes safety, reliability, and personalized service, with amenities like complimentary Wi-Fi, refreshments, and climate control for a seamless experience. Ideal for business executives, celebrities, or special occasions, these services deliver unmatched sophistication. Competitive pricing, 24/7 availability, and customizable packages make Seattle VIP transportation the top choice for upscale ground transportation in the Emerald City. Book in advance for guaranteed availability and a flawless, high-end travel experience. - https://bdluxlimo.com/the-gold-standard-of-chauffeur-excellence-seattle-town-car-service/
  19. LawrenceHU说道:
    Google Chrome Windows 10
    Дезцентр Челябинск Здесь вы получите качественную услугу по обработке помещения! ## Мы — профессионалы своего дела: Работаем быстро и эффективно в области дезинсекции, дезинфекции и дератизации. ## Что мы предлагаем? * Комплексные мероприятия по уничтожению паразитов * Индивидуальные программы профилактики ### Наши услуги: * Дератизация: устранение любых видов вредителей. * Устранение муравьев и прочих насекомых * Проведение санитарной обработки помещений ## Почему выбирают нас? * Высококачественные экологичные средства * Работа круглосуточно и без выходных https://sanepidemstanciya1.ru/
  20. Williamgaf说道:
    Google Chrome Windows 10
    Эта статья сочетает в себе как полезные, так и интересные сведения, которые обогатят ваше понимание насущных тем. Мы предлагаем практические советы и рекомендации, которые легко внедрить в повседневную жизнь. Узнайте, как улучшить свои навыки и обогатить свой опыт с помощью простых, но эффективных решений. Подробнее - https://vivod-iz-zapoya-1.ru/
  21. BODavid说道:
    Google Chrome Windows 10
    Квалифицированная помощь в борьбе с вредителями Добро пожаловать в нашу службу дезинсекции и дезинфекции! ## Мы — профессионалы своего дела: Более 10 лет опыта в области дезинсекции, дезинфекции и дератизации. ## Что мы предлагаем? * Современная система обработки жилых и коммерческих помещений * Индивидуальные программы профилактики ### Наши услуги: * Дезинсекция: устранение любых видов вредителей. * Профессиональная борьба с тараканами * Санитарная профилактика и контроль грызунов ## Почему выбирают нас? * Быстрое реагирование на заявку клиента * Гарантии результата https://sanepidemstanciya1.ru/
  22. JamesJK说道:
    Google Chrome Windows 10
    Экспертная служба дезинсекции и дезинфекции Вы обратились в лучший центр дезинсекции и дезинфекции Челябинска! ## Мы — профессионалы своего дела: Работаем быстро и эффективно в области дезинсекции, дезинфекции и дератизации. ## Что мы предлагаем? * Комплексные мероприятия по уничтожению паразитов * Собственный автопарк специальной техники ### Наши услуги: * Дератизация: устранение любых видов вредителей. * Устранение муравьев и прочих насекомых * Предоставление полного комплекса санитарно-гигиенических мероприятий ## Почему выбирают нас? * Высококачественные экологичные средства * Аккуратность и чистота выполняемых работ https://sanepidemstanciya1.ru/
  23. Thomasanova说道:
    Google Chrome Windows 10
    The Seattle premium transportation sector offers elite limousine services tailored for discerning clients seeking luxury, reliability, and professionalism. Serving corporate executives, weddings, airport transfers, and special events, these services provide a fleet of high-end vehicles, including stretch limousines, SUVs, and luxury sedans, equipped with cutting-edge amenities like leather interiors, climate control, and entertainment systems. Driven by experienced, licensed chauffeurs, Seattle premium transportation prioritizes punctuality, discretion, and safety, ensuring seamless travel across the city and beyond. Many providers offer 24/7 availability, real-time tracking, and personalized route planning to avoid traffic delays. Competitive pricing, transparent billing, and customizable packages—such as hourly charters or multi-day rentals—cater to diverse needs, from business meetings to prom nights. Eco-conscious options, like hybrid or electric luxury vehicles, are also emerging in the Seattle premium transportation sector, aligning with the city’s sustainability goals. Top-tier companies emphasize white-glove service, including meet-and-greet assistance, complimentary refreshments, and concierge-level support. Whether for Seattle-Tacoma International Airport (SEA) transfers or scenic tours of Puget Sound, these services redefine convenience and sophistication in Pacific Northwest travel. - https://bestlimorates.com/the-future-of-urban-mobility-why-seattles-premium-transportation-sector-is-attracting-investors/
  24. ArthurRub说道:
    Google Chrome Windows 10
    Seattle airport car service offers premium, reliable transportation for travelers arriving at or departing from Seattle-Tacoma International Airport (SEA). Whether for business or leisure, these professional services provide luxurious limousines, sedans, and SUVs with experienced chauffeurs ensuring a smooth, punctual ride. Key features include 24/7 availability, real-time flight tracking to adjust for delays, and complimentary meet-and-greet at baggage claim. Passengers enjoy plush interiors, Wi-Fi, refreshments, and privacy for work or relaxation. Ideal for corporate clients, weddings, or special events, Seattle airport car service guarantees safety, comfort, and style. Booking is seamless via online platforms, phone, or mobile apps, with transparent pricing and no hidden fees. Eco-friendly and hybrid vehicle options are also available. Trusted providers prioritize customer satisfaction, offering personalized routes, child seats, and multilingual drivers upon request. For stress-free travel, Seattle airport car service is the top choice, combining efficiency with luxury for an unmatched airport transfer experience. - https://bdluxlimo.com/the-gold-standard-of-chauffeur-excellence-seattle-town-car-service/
  25. Jerrybilen说道:
    Google Chrome Windows 10
    Капельницы в «ЧелМед Детокс» — это модульная конструкция, а не «микс на удачу». База — регидратация и коррекция электролитов. По показаниям добавляются антиэметики, антивегетативные средства, поддержка метаболизма, витамины группы B, магний. Отдельным блоком идёт ночной модуль: задача — собрать восстановительный сон, не «перелечивая» пациента. Каждый модуль имеет свою цель и стоп-критерий. Врач избегает одновременного запуска нескольких новых элементов, чтобы видеть причинно-следственную связь и точно понимать, что именно работает у конкретного человека. Детальнее - https://vyvod-iz-zapoya-v-chelyabinske16.ru/vyvod-iz-zapoya-chelyabinsk-kruglosutochno/
  26. SeymourRep说道:
    Google Chrome Windows 10
    Решение о кодировании принимает врач после очной оценки. Методика подбирается индивидуально, с обязательным информированным согласием. Ниже — ориентиры, помогающие понять, когда процедура уместна, а когда стоит отложить или выбрать альтернативу. Получить больше информации - https://kodirovanie-ot-alkogolizma-v-spb16.ru/kodirovanie-sankt-peterburg/
  27. SeymourRep说道:
    Google Chrome Windows 10
    Кодирование от алкоголизма — это не «волшебная таблетка», а четко структурированный этап комплексного лечения, который должен вписываться в общий терапевтический план: диагностика, стабилизация состояния, выбор методики, юридически корректное информированное согласие, сопровождение и профилактика рецидивов. В наркологической клинике «НеоТрезвие СПБ» приоритет — безопасность, предсказуемость и конфиденциальность. Мы не перебираем методы «на удачу», а подбираем технологию с учетом клинического профиля, мотивации, социализации и коморбидных факторов (тревога, депрессия, соматические заболевания). Получить дополнительную информацию - кодирование от алкоголизма
  28. SeymourRep说道:
    Google Chrome Windows 10
    Кодирование от алкоголизма — это не «волшебная таблетка», а четко структурированный этап комплексного лечения, который должен вписываться в общий терапевтический план: диагностика, стабилизация состояния, выбор методики, юридически корректное информированное согласие, сопровождение и профилактика рецидивов. В наркологической клинике «НеоТрезвие СПБ» приоритет — безопасность, предсказуемость и конфиденциальность. Мы не перебираем методы «на удачу», а подбираем технологию с учетом клинического профиля, мотивации, социализации и коморбидных факторов (тревога, депрессия, соматические заболевания). Подробнее тут - https://kodirovanie-ot-alkogolizma-v-spb16.ru/kodirovanie-sankt-peterburg
  29. AngelEnrof说道:
    Google Chrome Windows 7
    Наши специалисты в Ростове-на-Дону имеют многолетний опыт работы в области наркологии и готовы помочь вам на каждом этапе лечения. Детальнее - вывод из запоя клиника ростов-на-дону
  30. RobertBilla说道:
    Google Chrome Windows 8.1
    В Ростове-на-Дону клиника «ЧСП№1» предоставляет услуги по выводу из запоя. Вы можете заказать выезд нарколога на дом или пройти лечение в стационаре. Все процедуры проводятся анонимно и с соблюдением конфиденциальности. Исследовать вопрос подробнее - наркологический вывод из запоя

发表回复

电子邮件地址不会被公开。必填项已用 * 标注