среда, 7 октября 2009 г.

Research In Refraction

Ранее я уже писал, что хочу заняться преломлениями и отражениями. Поэтому я начал собственный research в этой области, т. к. задача нетривиальная. В перспективе это должно вылиться в кульное DX11-demo.

Сначала разберёмся с физической стороной проблемы. Преломление - это изменение направления следования светового луча, возникающее на границе двух прозрачных сред с различной плотностью. В вакууме скорость света c составляет приблизительно 299 800 км в секунду. Когда луч путешествует в среде с ненулевой плотностью, его скорость замедляется. Замедление является функцией от длины волны и материала, из которого состоит среда. Чем выше плотность, тем сильнее замедляется луч. Это не проходит бесследно, видимый эффект заключается в изменение угла между нормалью преломляющей поверхности и направлением движения луча. Попав опять в вакуум, луч света приобретает прежнюю скорость с, а угол восстанавливается.

Преломление света описывается законом Снелла.

Для того, чтобы рассчитать, как луч будет преломляться на границе двух сред, используются индексы рефракции материалов, из которых эти среды состоят. Индекс рефракции n определяется по формуле:
n = c/v
где с - скорость распространения света в вакууме, v - скорость распространения в материале.

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

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

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

А вот я начал играться с линзой из различных материалов. К сожалению, линза не "отшлифована" как следует - вершины задавал на глазок, поэтому чёткий фокус получить не удалось. Тем не менее видно, что всё вычисляется корректно. Стекло:

Кварц:

Рубин:

Алмаз (диамант):

Проверка математики, если в линзе воздух:

А вот так свет будет преломляться, если в линзе будет воздух и она (линза) будет помещена в воду:

2 комментария:

  1. Скажите пожалуйста, в какой программе визуализируете?

    ОтветитьУдалить
  2. Код визуализации написан мною, Direct3D 11.

    ОтветитьУдалить