新年快到了!
让自己和他人振作起来会很好。复制和发送带有从网络下载的精美图片和 GIF 的明信片不知何故不再有趣。
我想要一些不寻常的、明亮的、喜庆的东西,只有你拥有,你可以用这样的话送给你所爱的人——“我为你做的!”
或者带着满足感和自豪感离开它:-)
制作新年动画比赛的想法属于@Hamster
这是她作为样本提供的图纸。
看,就像在任何其他新年贺卡中一样,各种动画都有潜力。
例如:
- 来自星星的光线。
stroke-dasharray
使用宽字符串可以轻松完成。添加径向渐变、线旋转动画和渐变移动。
- 雪花
要在 CSS 或 SVG 中绘制,许多人将能够进一步为雪花的大小、旋转和下落设置动画。
- 花环的人字形
眨眼,圣诞树装饰物、烟火等的光摇摆和扭动等。 短语动画 - 2019 年新年快乐!
短语移动和/或摆动、笔划、字母外观
新年人物动画 - 松鼠、兔子 :) 圣诞老人和雪少女
您可以执行上面列出的整个动画列表,您可以实现一项或多项。
主要条件是你可以拍任何照片或自己画,但动画应该是你自己的,不能复制粘贴!
比赛已经结束。
祝贺获胜者@Misha Saidov
感谢您的作品,亲爱的参与者,比赛变得有趣、明亮和令人难忘。我们一起了解了新参与者的名字,他们立即在移动中闯入竞争并做出了非常酷的工作。
所有作品都是在高水平上完成的,每件作品都以自己的方式有趣和优秀。
Это бандл из моих предыдущих ответов.
Как видите, код стал модульным - можно на его базе собрать любого Франкенштейна. Также код вариативный везде, где только можно - любой коэффициент можно поменять, чтобы добиться желаемого результата и резиновый (на сколько смог). Повторюсь, что я не умею в векторную графику и канвас, поэтому накодил все на дивах и картинках. Разверните на всю страницу, если сильно сплющит.
UPD 0: Добавил покачивание снежинок, изменил некоторые коэффициенты и сменил изображение звездочек елки на более нейтральное.
UPD 1: Добавил текст и заанимировал.
UPD 2: Санта! Он будет появляться и махать рукой с разных сторон экрана. Думаю, далее будут только какие-то минорные правки, а так - это финалочка ;)
UPD 3: Оптимизация. Теперь все делает один цикл (вместо 4-х, как раньше). Открытка стала чуть более снисходительна на старт: картинки появляются только после полной загрузки и убрал ненужный тут
$(document).ready()
Скрипт по-прежнему костыль :)Новогодняя сценка создана без использования каких-либо ресурсов.
Это все придумано давным давно, однако раньше, трассировка лучей в реальном времени была фантастикой и таким образом создавали статические картинки. сегодня каждый обладатель компьютера с видеокартой может написать фрагментный шейдер, который делает трассировку простеньких (и не очень) сцен в реальном времени.
Для этого потребуются:
Во фрагменте кода приведена уже склеенная версия, исходник на github gists и blocks.
Итак, попробую по-простому описать что тут происходит, т.к. код вы можете и сами почитать.
Для начала WebGL инициализируется таким образом, чтобы нарисовать один треугольник, который покрывает весь экран как на изображении ниже, или как-то иначе, главное вызвать фрагментный шейдер для каждого пикселя.
Фрагментный шейдер делает всю работу.
Перед формированием каждого кадра, из javascript в шейдер передаются некоторые переменные, которые характеризуют сцену, тут это положение наблюдателя в декартовых координатах, размер картинки, и еще для анимации понадобится время.
Конечно перед каждым кадром обновлять все uniform переменные не нужно, но в этом примере я сделал так для простоты кода.
—-
Далее в каждом фрагменте(пикселе) происходит трассировка луча:
В нашем случае это raymarching, что про сути есть оптимизация шага трассировки.
В отличие от классического представления объектов сцены в виде треугольников, тут используются математические формулы дистанции до поверхностей(так называемые signed distance fields, SDF). Шагая вдоль луча, применяется огромная формула (функция
map(vec3)
), которая вычисляет дистанцию от точки-аргумента до всех объектов в сцене и возвращает минимальную. Дистанция которую вернула эта функция - безопасное расстояние, шагнув на которое, мы точно не во что не упремся.Собственно это будет длина следующего шага, вдоль луча, и так до тех пор, пока луч не упрется в поверхность.
Изначально результат инициализируется расстоянием очень далеким от наблюдателя, т.е. будущим фоном. -1 выступает в роли идентификатора материала.
Функция
opU
- названа от слов operation и union и предназначена для объединения объектов сцены.Каждый компонент, объединяемый этой операцией это в свою очередь тоже функция, только описывающая один объект сцены плюс возвращающая вторым компонентом идентификатор(цвет) материала. Объекты, в свою очередь, состят из более простых примитивов: сфер, цилиндров, кубов, фракталов, поверхностей безье, чего душе угодно, между которыми возможно всевозможные трансформации, булевые операции итд.
Все вместе это и описывает сцену .
После того, как точка где луч уперся в поверхность найдена - начинается самое сложное и самое интересное, это определение цвета найденной точки.
В этой сцене цвет состоит из нескольких компонентов:
Этот список можно было бы продолжать всякими экранными эффектами, компонентами других моделей освещения и чего еще только не напридумывали.
Непосредственно при моделировании никаких сложных примитивов не использовано, все объекты собраны из
сфер
плоскостей
усеченных конусов
цилиндра
и шума(noise), для создания "сугробов":
Так же тут используется отражение и поворот пространства, для создания 6 снеговиков и звезды, операция smoothMin для создания плавных переходов между поверхностями
Upd2: добавил деталей, теперь летит снег и взаимодействует с другим снегом в сцене при помощи
smooth minimum
, двигается источник света, самую актуальную версию смотрите тутPPS: все происходящее тут можно сильно оптимизировать, начиная от шума, который тут считается каждый раз, его можно либо запечь в текстуру, либо сразу предоставить текстуру шума, затем функция
map()
... для разных частей освещения или эффектов можно использовать различные упрощенные версииmap()
кандидаты на это - построение теней, ambient occlusion, из последнего убрать бы летящий снег, сам raymarching тоже может быть оптимизирован на счет первоначальной трассировки более простых сцен(кубов или сфер в которых вписаны объекты сцены), для уменьшения количества шагов трассировкиPPPS: Где можно про это почитать:
Ну и конечно же гуглёж по терминам
signed distance field(function), SDF
raymarching, raytracing
UPD 31.03.2019: Починил ( правда ценой производительности (: ) артефакты прошлой версии, когда при взгляде сверху появлялись черно-цветные полосы.
ВНИМАНИЕ! Ёлка не идеальна и только для современных браузеров и только в качестве примера!
🎄 ПРИМЕР НА CODEPEN.
*Скомпилированный код не вмещается в ответ на so.
Технологии:
pug
,sass/scss
,svg
ЗАДАЧА 1. ЁЛОЧКА
Хотелось сделать ёлочку с большими звездочками по середине и равномерным уменьшением к краям т.е. задать необходимые для этого условия в
pug
иscss
файлах.Код от участника @Grundy:
pug:
scss:
Codepen
Скомпилированный код:
Пришлось обратится за помощью, но потом и меня осенила собственная идея:
pug:
scss:
Получилось не так изящно. Смысл в том, что создаю строки
.x
, в каждой строке 3 блока.inc
(по возрастанию),.dec
(по убыванию для его реализации в стилях задаюflex-row: row-reverse
) и.mid
(серединка).ЗАДАЧА 2. СНЕГ
Признаюсь честно, за основу был взят плагин magic-snowflakes, но код
js
преобразован вscss
:pug:
scss:
codepen
ЗАДАЧА 3. НАДПИСЬ (Handwriting)
За пример были взяты работы с codepen: пример1,пример2. Перепробовав все возможные варианты:
Type -> Create outlines
clip-path
. Блокируем этот слой.stroke
который мы будем анимировать.svg
вставляем вhtml(pug)
код.Анимация заключается в изменении значения
stroke-dashoffset
:При этом важно задать
stroke-width
такой, чтобы полностью заполнить букву.Получаем: codepen
P.S: буквы обрисовала не аккуратно, поэтому есть заметные изъяны).
Итого:
🎄 ПРИМЕР НА CODEPEN.
❄ ❄ ❄ ❄ ❄ ❄ ❄
❄ ❄ ❄ ❄ ❄ ❄ ❄
А вот и Ёлочка!
Я плох в векторной графике и канвасе, но что-то смыслю в математике, поэтому как смог :) В общем, можно заметить, что есть очень много общего со скриптом снежинок, который я кидал ранее. Соль заключается в том, что позиционированием звездочек полностью занимается js при помощи функции
y=sin(x)*x
, график которой похож на елку. Перевернув эту функцию на 90 градусов можно получить точки расположения звездочек по оси Y. Размер звездочек вариативный, но зависит от смещения сверху: чем ниже, тем больше звезда, как на картинке. Немного визуальных эффектов и вот :) Хорошо себя чувствует при ресайзе, разверните на весь экран, для примера. Не совсем похоже, конечно, но, думаю, имеет место быть.我要开始播种了。
比赛将于今天开始 - 2018年 12 月 24 日,奖励丰厚。
我们将在新年前夕总结结果。
例如,我将从问题列表中制作动画的第一项。由于我将在此空白中使用基本的 svg 命令和简单、众所周知的技巧,因此您可以安全地在比赛答案中使用它们,这不会被视为复制粘贴。
我是用 SVG 做的,当然可以在
CSS
,Javascript
,上实现jQuery
如何使用 SVG 来做到这一点
r="100"
,周长是2 * 3,14 * 100 = 628px
你需要得到 12 条光线 + 12 个间隙 = 24 个相等的部分。一部分等于
26,16px
将条的长度和间距代入属性stroke-width="200"
由于线对称地放置在圆中心线的两侧,
其
r="100px"
宽度必须200px
填满圆的内部空间。为了演示,圆圈用颜色填充。
fill="purple"
雪花原型
我们删除填充
fill="none"
并分配stroke="#87CEFA"
添加星光的渐变和动画,可惜这个版本的动画只适用于
FF
这段代码被注释掉了恒星光线旋转的动画
要将对象顺时针旋转一整圈,您需要在其标签内添加动画命令:
使用嵌套动画时,对象标签的语义有点棘手。
为了澄清,这里有一个线程:那些奇怪的 SVG 标签
下面是星星光线旋转的动画代码
使旋转算法复杂化
顺时针转动 720° → 暂停 → 逆时针转动 720° → 暂停
通过选择角度、它们的顺序以及更改旋转时间
dur="3.43s"
,您可以获得有趣的效果。我觉得如果你愿意,可以少用js,但看起来很正常,很漂亮)
雪花
Варианты анимации фразы - С Новым 2019 годом!
Этот вариант не участвует в конкурсе, создан для примера. Участники могут брать эту технику анимации прорисовки и раскрашивания букв в качестве заготовки и использовать, творчески переработав, в своих конкурсных ответах.
Как сделать анимацию обводки букв - подробно, с картинками рассказывается как это сделать
update Новый вариант
#2 Анимация волной
Подробно теория и примеры, как это сделать здесь
#3 Двойная анимация,- волны и букв на ней
Дед Мороз и ёлка
Это внеконкурсный ответ
Только HTML и CSS.
d3.js 🎄 интерактивная версия
updates 06.01.2019:
updates 08.01.2019:
Начну делать елку с звезды. Я сделал лучи заднего плана полностью на линейных градиентах без svg. Звезду позаимстовал у SE и добавил эффект свечения. Получилось вот что-то такое: