• Давайте уберём кватернионы из всех 3D-движков

    • Перевод
    image

    Для записи трёхмерных поворотов программисты графики используют кватернионы. Однако в кватернионах сложно разобраться, потому что изучают их поверхностно. Мы просто принимаем на веру странные таблицы умножения и другие загадочные определения, и используем их как «чёрные ящики», поворачивающие векторы так, как нам нужно. Почему $\mathbf{i}^2=\mathbf{j}^2=\mathbf{k}^2=-1$ и $\mathbf{i} \mathbf{j} = \mathbf{k}$? Почему мы берём вектор и превращаем его в «мнимый» вектор, чтобы преобразовать его, например $\mathbf{q} (x\mathbf{i} + y\mathbf{j} + z \mathbf{k}) \mathbf{q}^{*}$? Да кому это интересно, если всё работает, правда?

    Существует способ описания поворотов под названием ротор, который относится к области и комплексных чисел (в 2D), и кватернионов (в 3D), и даже обобщается до любого количества измерений.

    Мы можем создавать роторы практически полностью с нуля, вместо того, чтобы определять из ничего кватернионы и пытаться объяснить, как они работают задним числом. Это занимает больше времени, но мне кажется, что это стоит того, потому что их гораздо легче понять!

    Кроме того, для визуализации и понимания трёхмерных роторов не нужно использовать четвёртое пространственное измерение.

    Было бы здорово, если бы начали вытеснять использование и изучение кватернионов, заменяя их роторами. Заменить их очень просто, а код останется почти таким же. Всё, что можно делать с кватернионами, например, интерполяцию и устранение блокировки осей (Gimbal lock), можно сделать и с роторами. Но понимать мы начинаем гораздо больше.
    Читать дальше →
  • Домашняя электросеть

      Здесь часто возникает тема защиты оборудования в домашней электросети, но очень часть при описании базовых параметров устройств защиты информация не соответствует действительности или же, в лучшем случае, основана на отдельных примерах. Потому далее будет своеобразный ликбез о том, как правильно сделать вводный электрощиток.

      Это не столько инструкция, сколько объяснение, что должно быть сделано, так как каждое подключение по сути индивидуально. В любом случае необходима консультация с учетом реальной ситуации.
      Читать дальше →
    • Контроль консистентности кода в Go


        Если вы считаете консистентность важной составляющей качественного кода — эта статья для вас.


        Вас ждут:


        • Разные способы сделать одно и то же в Go (эквивалентные операции)
        • Менее очевидные факторы, влияющие на однородность вашего кода
        • Способы увеличения консистентности вашего проекта
        Читать дальше →
      • Почему Wi-Fi не будет работать, как планировалось, и зачем знать, каким телефоном пользуется сотрудник



          Привет!

          Поговорим о том, что реально влияет на скорость передачи данных в современных беспроводных сетях, развенчаем пару мифов и ответим, пора ли поменять свой старенький роутер на сверкающего рогатого пришельца с MU-MIMO на борту.

          Для разминки — небольшая задачка. Представьте себе беспроводную сеть Wi-Fi, состоящую из точки доступа (AP) и двух одинаковых клиентских устройств (STA1 и STA2).

          Читаем надписи на коробках:
          AP: 1733,3 Мбит/c
          STA1, STA2: 866,7 Мбит/c

          Внимание, вопрос. Оба клиента одновременно начинают загружать с сервера большой файл. На какую пропускную способность может рассчитывать каждое из устройств?
          Читать дальше →
        • Как я делал передачу звука на Raspberry Pi

          Привет!

          Понадобилась мне недавно передача звука на аудиосистему через малинку, хочу поделиться опытом по настройке.

          Шаг 0. Подготовка
          Читать дальше →
        • Protobuffers — это неправильно

          • Перевод
          Значительную часть своей профессиональной жизни я выступаю против использования Protocol Buffers. Они явно написаны любителями, невероятно узкоспециализированы, страдают от множества подводных камней, сложно компилируются и решают проблему, которой на самом деле нет ни у кого, кроме Google. Если бы эти проблемы протобуферов остались в карантине абстракций сериализации, то мои претензии на этом и закончились бы. Но, к сожалению, плохой дизайн Protobuffers настолько навязчив, что эти проблемы могут просочиться и в ваш код.

          Узкая специализация и разработка любителями

          Остановитесь. Закройте свой почтовый клиент, где уже написали мне полписьма о том, что «в Google работают лучшие в мире инженеры», что «их разработки по определению не могут быть созданы любителями». Не хочу этого слышать.

          Давай просто не будем обсуждать эту тему. Полное раскрытие: мне доводилось работать в Google. Это было первое (но, к сожалению, не последнее) место, где я когда-либо использовал Protobuffers. Все проблемы, о которых я хочу поговорить, существуют в кодовой базе Google; это не просто «неправильное использование протобуферов» и тому подобная ерунда.
          Читать дальше →
        • Локальный NPM репозиторий за 5 минут со своими пакетами и кэширование

          Доброго времени суток!

          Рано или поздно в организациях возникают проблемы с распространением js модулей между проектами, настало то время когда в нашей компании встал этот вопрос.

          Копировать и вставлять код это путь на темную сторону, поэтому было принято решение писать не просто js код, а создавать из него npm пакеты чтобы распространять между своими проектами.

          Поиск бесплатных, частных npm репозиториев завел в тупик, а использование частных репозиториев на npm требует платы (а это не наш менталитет).

          Поскольку в офисе есть сервер, который работает всегда(почти), было решено развернуть локальный npm.

          image
          Читать дальше →
          • +21
          • 4,8k
          • 8
        • Теория счастья. Термодинамика классового неравенства

            Продолжаю знакомить читателей Хабра с главами из своей книжки «Теория счастья» с подзаголовком «Математические основы законов подлости». Это ещё не изданная научно-популярная книжка, очень неформально рассказывающая о том, как математика позволяет с новой степенью осознанности взглянуть на мир и жизнь людей. Она для тех кому интересна наука и для тех, кому интересна жизнь. А поскольку жизнь наша сложна и, по большому счёту, непредсказуема, упор в книжке делается, в основном, на теорию вероятностей и математическую статистику. Здесь не доказываются теоремы и не даются основы науки, это ни в коем случае не учебник, а то, что называется recreational science. Но именно такой почти игровой подход позволяет развить интуицию, скрасить яркими примерами лекции для студентов и, наконец, объяснить нематематикам и нашим детям, что же такого интересного мы нашли в своей сухой науке.

            Опубликованные главы:

             •  Введение в мерфологию
             •  Закон арбузной корки и нормальность ненормальности
             •  Закон зебры и чужой очереди
             •  Проклятие режиссёра и проклятые принтеры

            В этой главе мы порассуждаем о деньгах, рынках и энтропии, а также посмотрим на анимированные гифки, которых, увы, в книжке напечатать не получится.


            Читать дальше →
          • Под капотом Graveyard Keeper: Как реализованы графические эффекты

              Всем привет! Целых 4 года я не писал на Хабр. Последняя моя серия постов была о различных инструментах и приемах, которые мы применяли на нашей прошлой игре (разрабатывая ее на Unity). С тех пор игру ту мы благополучно выпустили, а также выпустили и новую. Так что теперь можно немного выдохнуть и написать несколько новых статей, которые могут быть кому-то полезны.


              Сегодня я хочу рассказать о графических приемах и ухищрениях, которые мы применяли для создания той картинки, которую вы видите на гифке выше.

              Мы очень трепетно относимся к визуалу наших игр и по этому вложили довольно много времени и сил в различные эффекты и прочие плюшки, которые позволили бы сделать наш пиксель-арт максимально привлекательным. Возможно, кто-то найдет что-то полезное для себя.

              Для начала, кратко перечислю из чего собирается картинка в нашей игре:
              Читать дальше →
            • Неотвратимость наказания, эффективность внезапных проверок

                Это философская заметка про управление и воспитание, а также про очень неожиданное озарение связанное с моделированием цифровой плесени. Навеяно беседами о проблемах управления строительством, а также сетью существенно удалённых филиалов.

                image

                Борьба популяций цифровой плесени под воздействие испепеляющего солнца.

                Предуведомление. Статья состоит из трёх частей, и первые две кажутся вообще друг к другу никак не относящимися, однако есть третья объединяющая их.
                Читать дальше →
              • Как организовать собственный репозиторий модулей Node.js с блэкджеком и версионностью

                  В ISPsystem на текущий момент три front-end команды разрабатывают три крупных проекта: ISPmanager для управления веб-серверами, VMmanager для работы с виртуализацией и BILLmanager для автоматизации бизнеса хостеров. Команды работают одновременно, в режиме сжатых сроков, поэтому без оптимизации не обойтись. Чтобы сэкономить время, мы применяем единые решения и выносим общие компоненты в отдельные проекты. Такие проекты имеют собственные репозитории, которые поддерживают участники всех команд. Об устройстве этих репозиториев, а также работе с ними и будет эта статья.


                  Читать дальше →
                • Инверсная кинематика в двухмерном пространстве

                  • Перевод

                  Часть 1. Математика



                  Введение


                  Мы так привыкли к взаимодействию с окружающим нас миром, что не задумываемся о том, насколько сложно двигаются наши руки и ноги. В академической литературе задача управления манипулятором робота называется инверсной кинематикой. Кинематика обозначает "движения", а понятие "инверсная" связано с тем, что обычно мы не управляем самой рукой. Мы управляем «двигателями», поворачивающими каждую отдельную часть. Инверсная кинематика — это задача определения того, как перемещать эти двигатели, чтобы сдвинуть руку в конкретную точку. И в своём общем виде эта задача чрезвычайно сложна. Чтобы вы понимали, насколько она сложна, то можете вспомнить о таких играх, как QWOP, GIRP или даже Lunar Lander, в которой вы выбираете не куда двигаться, а какие мускулы (или ускорители) приводить в действие.

                  Задача управления подвижными приводами распостраняется даже на область робототехники. Вас не должно удивлять то, что на протяжении веков математики и инженеры смогли разработать множество решений. В большинстве 3D-редакторов и игровых движков (в том числе и в Unity) есть наборы инструментов, позволяющих выполнять риггинг человекоподобных и звероподобных существ. Для различных схем (манипуляторов роботов, хвостов, щупалец, крыльев и т.д.) встроенных решений обычно не существует.
                  Читать дальше →
                • Трассировка лучей на GPU в Unity

                  • Перевод
                  Для трассировки лучей (ray tracing) настали удивительные времена. Компания NVIDIA реализует ускоренное с помощью ИИ шумоподавление, Microsoft объявляет о нативной поддержке в DirectX 12, а Питер Ширли продаёт свои книги по свободной цене (pay what you want). Похоже, что трассировка лучей наконец получила шанс быть принятой при дворе. Возможно, говорить о начале революции ещё слишком рано, но уже определённо стоит начать изучать и накапливать знания в этой области.

                  В этой статье мы напишем с нуля в Unity очень простой трассировщик лучей с помощью compute shaders. Скрипты мы будем писать на C#, а шейдеры — на HLSL. Весь код выложен на Bitbucket.

                  В результате у нас получится отрендерить нечто подобное:

                  Читать дальше →
                • Цвет: от шестнадцатеричных кодов до глаза

                  • Перевод


                  Почему мы воспринимаем background-color: #9B51E0 как этот конкретный фиолетовый цвет?



                  Долгое время я думал, что знаю ответ на этот вопрос. Но хорошенько поразмыслив, осознал значительные пробелы в своих знаниях.
                  Читать дальше →
                • Learn OpenGL. Урок 4.10 — Инстансинг

                  • Перевод
                  • Tutorial
                  OGL3

                  Инстансинг


                  Представьте, что вы задумали сцену, содержащую огромное количество моделей объектов, причем преимущественно эти модели содержат одинаковые вершинные данные, разнятся только матрицы трансформации, примененные к ним. Например, сцена с травяным полем, где каждая былинка представлена маленькой моделью, составленной буквально из пары треугольников. Конечно же, для достижения нужного эффекта придется отрендерить эту модель не один раз, а тысячу, десять тысяч раз за кадр. Поскольку в каждом листике содержится буквально пара треугольников, то его рендер будет практически мгновенным. Но вот тысячи повторных вызовов функций рендера совокупно очень заметно ударят по производительности.
                  Читать дальше →
                  • +39
                  • 7,9k
                  • 4
                • Воссоздание эффекта воды из Super Mario Sunshine для Nintendo GameCube

                  • Перевод
                  image

                  Примечание: В оригинале статьи есть демо на WebGL2, которые в переводе заменены на видео и GIF.

                  Одно из моих хобби — написание программ просмотра моделей и графических инструментов для игр. Это хорошее соединение интересных мне тем — графики, рендеринга, реверс-инжиниринга сложных систем и ностальгии по старым видеоиграм.

                  Недавно я расширил возможности моего приложения просмотра игровых моделей на основе WebGL, добавив поддержку некоторых игр с Nintendo GameCube, в том числе The Legend of Zelda: The Wind Waker и Super Mario Sunshine. В GameCube, если вы не знаете, установлен передовой, почти программируемый видеопроцессор, но с фиксированным функционалом. Разработчики не могли писать шейдеры, и вместо этого программировали наборы комбинаторов текстур способом, похожим на использованные в конвейерах glTexEnv, но доведённым до максимума возможностей.
                  Читать дальше →
                  • +53
                  • 11,3k
                  • 2
                • Сравнение открытых OLAP-систем Big Data: ClickHouse, Druid и Pinot

                  • Перевод
                  ClickHouse, Druid и Pinot — три открытых хранилища данных, которые позволяют выполнять аналитические запросы на больших объемах данных с интерактивными задержками. Эта статья — перевод подробного сравнения, выполненного Романом Левентовым.

                  Спойлер

                  ClickHouse Druid или Pinot
                  В организации есть эксперты по C++ В организации есть эксперты по Java
                  Малый кластер Большой кластер
                  Немного таблиц Много таблиц
                  Один набор данных Несколько несвязанных наборов данных
                  Таблицы и данные находятся в кластере перманентно Таблицы и наборы данных периодически появляются в кластере и удаляются из него
                  Размер таблиц (и интенсивность запросов к ним) остается стабильным во времени Таблицы значительно растут и сжимаются
                  Однородные запросы (их тип, размер, распределение по времени суток и т.д.) Разнородные запросы
                  В данных есть измерение, по которому они могут быть сегментированы, и почти не выполняется запросов, которые затрагивают данные, расположенные в нескольких сегментах Подобного измерения нет, и запросы часто затрагивают данные, расположенные во всем кластере
                  Облако не используется, кластер должен быть развернут на специфическую конфигурацию физических серверов Кластер развернут в облаке
                  Нет существующих кластеров Hadoop или Spark Кластеры Hadoop или Spark уже существуют и могут быть использованы
                  А под катом — подробный рассказ о том, как Роман к этому пришёл.
                  Читать дальше →
                  • +45
                  • 11,5k
                  • 4
                • Cжатие и улучшение рукописных конспектов

                  • Перевод
                  Я написал программу для очистки отсканированных конспектов с одновременным уменьшением размера файла.

                  Исходное изображение и результат:


                  Слева: исходный скан на 300 DPI, 7,2 МБ PNG / 790 КБ JPG. Справа: результат с тем же разрешением, 121 КБ PNG [1]

                  Примечание: описанный здесь процесс более-менее совпадает с работой приложения Office Lens. Есть другие аналогичные программы. Я не утверждаю, что придумал нечто радикальное новое — это просто моя реализация полезного инструмента.

                  Если торопитесь, просто посмотрите репозиторий GitHub или перейдите в раздел результатов, где можно поиграться с интерактивными 3D-диаграммами цветовых кластеров.
                  Читать дальше →
                • Про двумерную упаковку: offline алгоритмы

                    Сегодня, дорогой Хабр, я расскажу тебе историю о комбинаторной оптимизации.
                    Издревле (как минимум, с начала прошлого века) математики задавались вопросом, как оптимально разместить некоторое количество пива нужных и полезных предметов в рюкзаке. Была сформулирована задача о ранце и ее подзадачи — тысячи их! — которые заинтересовали информатиков, криптографов и даже лингвистов.

                    От задачи о ранце отпочковалась задача об упаковке в контейнеры (Bin Packing Problem), одной из разновидностей которых является задача двумерной упаковки (2-Dimensional Bin Packing). Снова отбросив несколько вариаций, мы наконец придем к двумерной упаковке в полуограниченную полосу (2-Dimensional Strip Packing, 2DSP). Чувствуете, сколько интересного уже осталось за кадром? Но мы еще не закончили продираться сквозь классификацию. У 2DSP есть два варианта входных данных: когда набор упаковываемых объектов известен заранее (offline-проблема) и когда данные поступают порциями (online-проблема).

                    В этой статье рассматриваются алгоритмы решения offline-варианта 2DSP. Под катом немного матчасти и много картинок с цветными квадратиками.

                    В чем, собственно, проблема?


                    Читать дальше →
                  • Про двумерную упаковку: online алгоритмы

                      Это продолжение поста про оффлайн алгоритмы упаковки.

                      Суть задачи: имеем полубесконечную полосу — как в тетрисе, только без game over'а, и конечный набор прямоугольников. Данные о прямоугольниках поступают в режиме реального времени; каждый новый прямоугольник необходимо немедленно разместить и больше не двигать с места. Цель — минимизировать общую высоту упакованных прямоугольников.
                      Это online-вариация задачи об упаковке прямоугольников в полуограниченную полосу (2 Dimensional Strip Packing, 2DSP).

                      Чуть больше теоретических сведений можно найти в предыдущей статье, а пока, без лишних слов, перейдем к алгоритмам.
                      Читать дальше →