• Объёмное атмосферное рассеяние света

    • Перевод
    image

    Если вы прожили на планете Земля достаточно долго, то наверно задавались вопросом, почему небо обычно синее, но краснеет на закате. Оптическое явление, которое стало (основной) причиной этого, называется рэлеевским рассеянием. В этой статье я расскажу, как смоделировать атмосферное рассеяние, чтобы имитировать многие визуальные эффекты, которые проявляются на планетах. Если вы хотите научиться рендерить физически точные изображения чужих планет, то этот туториал определённо стоит изучить.

    GIF

    Статья разбита на следующие части:

    • Часть 1. Объёмное атмосферное рассеяние
    • Часть 2. Теория атмосферного рассеяния
    • Часть 3. Математика рэлеевского рассеяния
    • Часть 4. Путешествие сквозь атмосферу
    • Часть 5. Атмосферный шейдер
    • Часть 6. Пересечение атмосферы
    • Часть 7. Шейдер атмосферного рассеяния
    Читать дальше →
  • О классификации методов преобразования Фурье на примерах их программной реализации средствами Python

    • Tutorial

    Введение


    Публикации по методу Фурье условно можно разделить на две группы. Первая группа так называемых познавательных публикаций, например, [1,2].

    Вторая группа публикаций касается применения преобразований Фурье в технике, например, при спектральном анализе [3,4].

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

    Задачи публикации


    Провести классификацию методов преобразования Фурье на примерах их программной реализации средствами Python. При этом для облегчения чтения использовать формулы только в программном коде с соответствующими пояснениями.

    Гармонический анализ и синтез


    Гармоническим анализом называют разложение функции f(t), заданной на отрезке [0, Т] в ряд Фурье или в вычислении коэффициентов Фурье по формулам.

    Гармоническим синтезом называют получение колебаний сложной формы путем суммирования их гармонических составляющих (гармоник).

    Программная реализация
    #!/usr/bin/python
    # -*- coding: utf-8 -*
    from scipy.integrate import quad # модуль для интегрирования
    import matplotlib.pyplot as plt # модуль для графиков
    import numpy as np # модуль для операций со списками и массивами
    T=np.pi; w=2*np.pi/T# период и круговая частота
    def func(t):# анализируемая функция
             if t<np.pi:
                      p=np.cos(t)
             else:
                      p=-np.cos(t)
             return p
    def func_1(t,k,w):# функция для расчёта коэффициента a[k] 
             if t<np.pi:
                      z=np.cos(t)*np.cos(w*k*t)
             else:
                      z=-np.cos(t)*np.cos(w*k*t)
             return z
    def func_2(t,k,w):#функция для расчёта коэффициента b[k] 
             if t<np.pi:
                      y=np.cos(t)*np.sin(w*k*t)
             else:
                      y=-np.cos(t)*np.sin(w*k*t)
             return y
    a=[];b=[];c=4;g=[];m=np.arange(0,c,1);q=np.arange(0,2*np.pi,0.01)# подготовка списков для численного анализа
    a=[round(2*quad(func_1, 0, T, args=(k,w))[0]/T,3) for k in m]# интеграл для a[k], k -номер гармоники 
    b=[round(2*quad(func_2, 0, T, args=(k,w))[0]/T,3) for k in m]# интеграл для b[k], k -номер гармоники
    F1=[a[1]*np.cos(w*1*t)+b[1]*np.sin(w*1*t) for t in q]#функции для гармоник
    F2=[a[2]*np.cos(w*2*t)+b[2]*np.sin(w*2*t) for t in q]
    F3=[a[3]*np.cos(w*3*t)+b[3]*np.sin(w*3*t) for t in q]
    plt.figure()
    plt.title("Классический гармонический анализ функции \n при t<pi  f(t)=cos(t)  при t>=pi  f(t)=-cos(t)")
    plt.plot(q, F1, label='1 гармоника')
    plt.plot(q, F2 , label='2 гармоника')
    plt.plot(q, F3, label='3 гармоника')
    plt.xlabel("Время t")
    plt.ylabel("Амплитуда А")
    plt.legend(loc='best')
    plt.grid(True)
    F=np.array(a[0]/2)+np.array([0*t for t in q-1])# подготовка массива для анализа с a[0]/2
    for k in np.arange(1,c,1):
             F=F+np.array([a[k]*np.cos(w*k*t)+b[k]*np.sin(w*k*t) for t in q])# вычисление членов ряда Фурье
    plt.figure()
    P=[func(t) for t in q]
    plt.title("Классический гармонический синтез")
    plt.plot(q, P, label='f(t)')
    plt.plot(q, F, label='F(t)')
    plt.xlabel("Время t")
    plt.ylabel("f(t),F(t)")
    plt.legend(loc='best')
    plt.grid(True)
    plt.show()
    

    Читать дальше →
    • +6
    • 6,2k
    • 1
  • Библия движений Doom. Часть 1

    Здравствуйте и добро пожаловать в Библию движений Doom! В статье разобраны и рассортированы по категориям все причуды и капризы кода движений в Doom, включая замысловатые трюки с описанием их работы.



    Метрика


    Начнем с основ. Код движка для движений игрока в Doom имеет следующий вид:
    • Сбор исходных данных игрока
    • Применение векторов движущей силы к игроку на основе исходных данных
    • Сжатие скорости игрока, если она слишком велика
    • Проверка, расчеты и перемещения
    • Использование ускорения через трение для следующего движения игрока

    Рассмотрим все поподробней.
    Благодаря только этому и паре переменных мы сможем определить возможные максимальные скорости персонажа игрока.

    По вполне понятным причинам максимальная скорость игрока достигается тогда, когда ускорение, заданное игроком, равно и противоположно замедлению от трения.

    Читать дальше →
    • +67
    • 33,3k
    • 9
  • Внутреннее устройство и оптимизация бандла webpack

      Webpack фактически стал стандартом для сборки крупных приложений на JS. Его используют практически все. Для разработчика webpack выглядит как магический черный ящик: если забросить в него файлы и небольшой конфиг, на выходе автоматически появится бандл.

      Чтобы разобраться в секретах этой магии, мы обратились к эксперту, человеку, который неоднократно залезал внутрь webpack, — Алексею Иванову. Он готов объяснить, как выглядит бандл изнутри, как на него влияют разные настройки, к чему и почему могут привести некоторые из них, а также рассказать, как все это отладить и оптимизировать.


      В основе материала — доклад Алексея Иванова на конференции HolyJS 2017, проходившей в Санкт-Петербурге 2-3 июня.
      Читать дальше →
    • Космическая съёмка Земли


        Cпутниковый снимок в ложных цветах (зелёный, красный, ближний инфракрасный) с пространственным разрешением 3 метра и наложенной маской зданий из OpenStreetMap (спутниковая группировка PlanetScope)

        Привет, Хабр! Мы постоянно расширяем источники данных, которые используем для аналитики, поэтому решили добавить ещё и спутниковые снимки. У нас аналитика по спутниковым снимкам полезна в продуктах для предпринимательства и инвестиций. В первом случае статистика по геоданным поможет понять, в каком месте стоит открывать торговые точки, во втором позволяет анализировать деятельность компаний. Например, для строительных компаний можно посчитать, сколько за месяц было построено этажей, для сельскохозяйственных компаний — сколько гектаров урожая взошло и т.д.

        В этой статье я постараюсь дать примерное представление о космической съёмке Земли, расскажу о трудностях, с которыми можно столкнуться, начиная работу со спутниковыми снимками: предварительная обработка, алгоритмы для анализа и библиотеки Python для работы со спутниковыми снимками и геоданными. Так что все, кому интересна область компьютерного зрения, добро пожаловать под кат!
        Читать дальше →
      • Шум Перлина

        • Перевод
        • Tutorial

        Я использовал шум Перлина для создания эффекта тумана и главного экрана в Under Construction. Я твитнул о моих усилиях по оптимизации алгоритма, и несколько людей ответили, что они не понимают, как работает шум Перлина и что это на самом деле такое.


        Признаюсь, что я (немного) понимаю шум Перлина прежде всего потому, что я реализовывал его ранее, и несколько дней ушло на погружение в неуклюжие объяснения полдюжины разработчиков, более заинтересованных в показе собственных демок, нежели в реальном объяснении. Несколько полезных ресурсов, которые я нашел, часто содержали ошибки и не давали мне интуитивного чувства понимания, как и почему оно все-таки работает.


        Вот пост, который я хотел бы прочитать в первую очередь.
      • Введение в архитектуры нейронных сетей



          Григорий Сапунов (Intento)


          Меня зовут Григорий Сапунов, я СТО компании Intento. Занимаюсь я нейросетями довольно давно и machine learning’ом, в частности, занимался построением нейросетевых распознавателей дорожных знаков и номеров. Участвую в проекте по нейросетевой стилизации изображений, помогаю многим компаниям.

          Давайте перейдем сразу к делу. Моя цель — дать вам базовую терминологию и понимание, что к чему в этой области, из каких кирпичиков собираются нейросети, и как это использовать.

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

          Дальше я расскажу про важные тренды, что происходит в этой области. Затем мы углубимся в архитектуру нейросетей, рассмотрим 3 основных их класса. Это будет самая содержательная часть.

          После этого рассмотрим 2 сравнительно продвинутых темы и закончим небольшим обзором фреймворков и библиотек для работы с нейросетями.
          Читать дальше →
          • +48
          • 48,5k
          • 2
        • Как научить свою нейросеть анализировать морфологию

          Недавно мы рассказывали про генератор стихов. Одной из особенностей языковой модели, лежащей в его основе, было использование морфологической разметки для получения лучшей согласованности между словами. Однако же у использованной морфоразметки был один фатальный недостаток: она была получена с помощью “закрытой” модели, недоступной для общего использования. Если точнее, выборка, на которой мы обучались, была размечена моделью, созданной для Диалога-2017 и основанной на закрытых технологиях и словарях ABBYY.


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


          Вместо морфологического движка ABBYY я использовал широко известный pymorphy2. Что в итоге получилось? Спойлер — получилось неплохо.

          Читать дальше →
        • Learn OpenGL. Урок 2.5 — Источники света

          OGL3

          Источники света


          Вплоть до этой статьи мы довольствовались освещением, исходящим из одной точки в пространстве. И результат был неплох, однако в реальности существует множество источников освещения с различающимся «поведением». В данном уроке рассматриваются несколько таких источников света. Умение имитировать характеристики разных источников света является еще одним инструментом обогащения создаваемых сцен.

          Начнем урок с направленного источника света, затем перейдем к точечному источнику, который является развитием упомянутого простого метода освещения. В конце рассмотрим, как устроен источник, имитирующий свойства прожектора (спотлайт).
          Читать дальше →