Задать вопрос
  • Как сделать эффект текста на кривой безье?

    @garbagecollected
    Математика трансформаций очень простая.

    Отрендерить текст на изображение можно используя
    https://opentype.js.org/

    Вы можете отрендерить каждую букву используя библиотеку, а далее уже отрендеренные буквы использовать на своем сайте без библиотеки.

    Либо использовать эту же библиотеку для того, чтобы получить path data для каждой буквы.

    Если ваша трансформация сводится к аффинным преобразованиям, то можно рассчитывать координаты не каждой точки изображения буквы, а только точки, которые участвуют в path data. Таким образом трансформируя все точки path data вы получите такую же path data, используя которую вы начертаете шрифты в любом месте на любом изображении. Это может дать очень выгодный прирост к производительности (потенциально до 1000х раз). Кроме того, линии path data "рисуется" с правильным расчетом межпиксельного пространства, и вам не надо будет делать ресамплинг, как при работе с трансформированием изображений.

    Но рисовать шрифты по безье - это не всегда можно свести к аффинным преобразованиям.

    На верхней иллюстрации у вас используется искажение по оси X: skewX()

    Получить координаты каждой точки можно умножив матрицу с исходными точками на матрицу CTM.
    https://www.w3.org/TR/SVG11/coords.html#TransformM...

    Сама матрица CTM - это произведение матриц всех трансформаций. То есть, чтобы не умножать матрицу точек на матрицы каждой трансформации, сначала вычисляется произведение матриц всех трансформаций, которое называется CTM.

    По ссылке выше вы найдёте матрицы с формулами аффинных преобразований в двухмерном пространстве. Матрицы имеют вид (3х3) из которых 6 чисел значимые, 3 числа - статичные (всегда [0, 0, 1]).

    Для 3D-преобразований используются матрицы 4х4 из которых 12 чисел значимые, 4 числа - статичные (всегда [0, 0, 0, 1]):
    https://drafts.csswg.org/css-transforms-2/#mathema...

    Для расчета 3d-трансформаций с учетом перспективы используются матрицы 8х8.

    На нижней иллюстрации у вас используются трехмерные искажения.

    Про математику 3D искажении с перспективой можно прочитать тут
    https://www.cs.cmu.edu/~ph/texfund/texfund.pdf
    Там рассматриваются и формулы получения координат на плоскости и ресамплинг (чтобы, например, не было пикселизации шрифтов после трансформации).

    Для перемножений матриц можно использовать функцию

    const multiply = (a, b) => a.map((_, r) => b[0].map((_, c) => a[r].reduce((s,_,i) => s + a[r][i] * b[i][c], 0)));


    Рассчитать координаты безье можно функциями (соответственно, квадратичная и кубическая безьё):

    // [p0x, p0x] - are coordinates of origin point
    // [p1x, p1y] - are coordinates of single control point
    // [p2x, p2y] - are coordinates of destination point
    // T - is number of points that needs to draw the curve
    const quadratic = ([p0x,p0y], [p1x,p1y], [p2x,p2y], T = 60) => {
      const x = t => (1 - t)**2 * p0x + 2 * (1 - t) * t * p1x + t**2 * p2x;
      const y = t => (1 - t)**2 * p0y + 2 * (1 - t) * t * p1y + t**2 * p2y;
      return Array.from({ length: T+1 }).map((_, t) => [x(t / T), y(t / T)]);
    };
    
    // [p0x, p0x] - are coordinates of origin point
    // [p1x, p1y] - are coordinates of first control point
    // [p2x, p2y] - are coordinates of second control point
    // [p3x, p3y] - are coordinates of destination point
    // T - is number of points that needs to draw the curve
    const cubic = ([p0x, p0y], [p1x, p1y], [p2x, p2y], [p3x, p3y], T = 60) => {
      const y = t => (1 - t)**3 * p0y + 3 * (1 - t)**2 * t * p1y + 3 * (1 - t) * t**2 * p2y + t**3 * p3y;
      const x = t => (1 - t)**3 * p0x + 3 * (1 - t)**2 * t * p1x + 3 * (1 - t) * t**2 * p2x + t**3 * p3x;
      return Array.from({ length: T+1 }).map((_, t) => [x(t / T), y(t / T)]);
    };
    Ответ написан
    1 комментарий
  • Как написать игровой движок?

    @LifeKILLED
    В создании собстванного 3д-движка нет ничего необычного. Этим реально занимаются люди, получают хорошие деньги. Особенно актуально для мобилок, где графика требуется не такая сложная и соответственно кода будет не много. Хотя если надо поставить мобилки на поток, лучше выбрать Юнити. Но тем не менее работа графического программиста это крутой навык, который мало кому доступен.

    Под движком имеется в виду конечно не огромная экосистема, как в Юнити, а низкоуровневая основа вывода 3д-графики (перекладываем каждый кадр байтики из оперативки в GPU, включаем-выключаем шейдеры). То, что необходимо конкретно для внутренней разработки игры.

    Если хочется совсем-совсем с нуля, советую скопипастить какой-нибудь пример с сайта https://learnopengl.com/ и таким образом получить готовую графическую часть в движке. Там есть даже примеры с современными технологиями типа PBR, т.е. теоретически можно даже не хуже, чем в Анриле, картинку получить.

    Также можно глянуть готовое решение https://diligentgraphics.com/diligent-engine/ , это основа графического движка, в которую уже заложено портирование на кучу платформ и API. Если нужен результат, я бы кодил что-то на его основе. Это именно фреймворк/библиотека, которая берется за основу.

    Знания векторов и матриц в принципе хватает, но из этих простых вещей делаются очень сложные алгоритмы, особенно в шейдерах. Всë это надо знать. Еще лучше конечно не ограничиваться OpenGL (в sfml именно он), а подучить другие API, тогда можно и работу хорошую найти.

    Желаю удачи в становлении графическим программистом! Главное долго не мусолить всë это. На основе уроков learnopengl можно за пару недель написать свой рендер с тенями, pbr и прочими эффектами, я так на геймджеме сделал когда-то :) Хотя это всë зарефакторить бы, код там очень страшный, но работало
    Ответ написан
    Комментировать
  • Будущее веб-разработчиков python?

    dmnBrest
    @dmnBrest
    Salesforce for money. Python, Go, Ruby for soul.
    Насколько я могу судить из свой практики. Ангуляр остается (и еще долго будет оставаться) всего лишь "продвинутым шаблонизатором" для создания интерактивных страничек. Клиенты не спешат выкидывать бизнес логику на фронтенд. А на счет того что nodejs выпихнет python с рынка бэкенда, то это вообще нонсенс. Сервернный JS красив пока не начал на нем писать. Для Hello World пойдет, но писать серьезные бизнес приложения - просто сразу ставить крест на бизнесе клиента. Серверный JS взлетел лишь благодаря хайпу и наличию огромной армии jQuery программистов, который возомнили себя теперь full-stack программистами. Сами погуглите много интересных историй про качество кода в NPM. Вот тут уже давно тоже был показательный случай
    https://habrahabr.ru/post/228751/
    Я тоже поддавался хайпу и пробовал для продакшен проектов и nodejs и go. Но в итоге все равно вернулся к старому доброму python :))))
    Ответ написан
    16 комментариев
  • Как сделать разработку web-движка публичной?

    longclaps
    @longclaps
    Три года - изрядный срок, полагаю, вам уже можно рассказать о гитхабе.
    Итак, гитхаб - такой сайт, где вы можете выложить в публичный доступ свой продукт.
    После этого вы сможете гораздо более эфективно искать и привлекать единомышленников.
    Ответ написан
    3 комментария
  • Обновлять ли MBPro_Retina_Late_2013_8Gb_RAM с Mavericks до Sierra?

    Самый очевидный совет -- ждите первого апдейта. Никогда не ставьте что то самое свежее.
    Ответ написан
    1 комментарий
  • На чем лучше и быстрее написать парсер (PHP)?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    PHP: multi-curl+regex+DOMXPath

    Пример ( https://www.ibm.com/developerworks/ru/library/x-xp... ) :
    $doc = new DOMDocument;
    $doc->load('products.xml');
    $xpath = new DOMXPath($doc);
    $products = $xpath->query("/PRODUCTS/PRODUCT[SKU='soft5678']/NAME");
    foreach ($products as $product)
       print($product->nodeValue);
    Ответ написан
    Комментировать
  • Возможно зарегистрировать компанию за границей, если ты проживаешь в РФ?

    edinorog
    @edinorog
    Троллей не кормить!
    в то время как соединённые штаты америки бороздят ... тьфу блин ... арестовывают! счета русских предпринимателей без суда и следствия ... вам в голову приходят такие дикие мысли! выкиньте вы их из головы =).
    Ответ написан
  • Yii + adLdap exception 'adLDAPException' with message 'No LDAP support for PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    "No LDAP support for PHP" - сам справишься закинуть в гугл-трнслейт или тебе перевести?
    Ответ написан
    Комментировать
  • Как научиться проектировать интерфейсы?

    Алан Купер
    "Психбольница в руках пациентов"
    Ответ написан
    Комментировать