Сначала разберёмся с физической стороной проблемы. Преломление - это изменение направления следования светового луча, возникающее на границе двух прозрачных сред с различной плотностью. В вакууме скорость света c составляет приблизительно 299 800 км в секунду. Когда луч путешествует в среде с ненулевой плотностью, его скорость замедляется. Замедление является функцией от длины волны и материала, из которого состоит среда. Чем выше плотность, тем сильнее замедляется луч. Это не проходит бесследно, видимый эффект заключается в изменение угла между нормалью преломляющей поверхности и направлением движения луча. Попав опять в вакуум, луч света приобретает прежнюю скорость с, а угол восстанавливается.
Преломление света описывается законом Снелла.
Для того, чтобы рассчитать, как луч будет преломляться на границе двух сред, используются индексы рефракции материалов, из которых эти среды состоят. Индекс рефракции n определяется по формуле:
n = c/v
где с - скорость распространения света в вакууме, v - скорость распространения в материале.
Индекс рефракции в вакууме равен 1, а это значит, что индекс рефракции любого материала всегда больше 1. Чем выше плотность, тем сильнее замедляется луч, тем выше становится индекс рефракции. Наименьшие индексы имеют различные газы, наибольшие - кристаллы. Вот пожалуй и всё по теории.
Раскопав таблицы индексов рефракции, я реализовал схематическое преломление луча для плоского стекла и для выпуклой линзы из различных материалов, чтобы разобраться в математике. Плоское стекло:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg73_CcugPJoWJt_4f4RhHlSo7urQZy5iEdFy715m77YOVgONQHT6ByYkL1OL_YsPwns8kslD7uOB1u2fMJXXzFNkLkDHyrysrbg2jSF4MFkjvsl9A8fK2YpycvA2TEhS4QaUfXvsQAzb65/s400/air_plane_glass.png)
Видно, что направление движения луча восстанавливается после того, как он покидает стекло. К сожалению, если использовать стандартный приём - выборку из кубической карты по вектору, никакого эффекта преломления не увидеть. Нужен честный рэйтрейс.
А вот я начал играться с линзой из различных материалов. К сожалению, линза не "отшлифована" как следует - вершины задавал на глазок, поэтому чёткий фокус получить не удалось. Тем не менее видно, что всё вычисляется корректно. Стекло:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgnmhlhRwWu6Vxih1yPo3A8U1xiORq-_M2PePfGdrA9Dcwx8OnyRtW5CIX_3Bejw7m2e_sotsQeFXD90f_750jWYvK93xSKNeS3cEYvmNYNWI6pOZ0aTLLnUOikPQBa-vZTOdbaX4uUvHJ/s400/air_glass.png)
Кварц:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn32dKoUzDXIMqyzWeLJCEIl7R70A089fatYS8oekEHd3qkdOmuznK-0nFHggbMCVKFiRuk0cYQws3uO6gTd34E-X0mqiR-6DtQ4yuYqVnsI358XlE_OeSMjN7TfUW6ebAGDJWwxRzhgyu/s400/air_quartz.png)
Рубин:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi72hvDlXVDx5tGuNLrh2Pm8vXB8vH4jJOeBGi1hwvbs3z9XePtAi2SNGL2t4MXB0-sg1H4DoErkb4mpDp-dJTVMdVY3ggr1ghqx2m8Sfnlq51AKKkphnxfmoFRF9k20N81wplw6MTiK26R/s400/air_ruby.png)
Алмаз (диамант):
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOStbSf8yRg8_mu9asYrDZLfYYKlwt93FGAle3z-aK-dXgujnmYjNZiev0kQ2OjXgeRht50Hq11g5OPw7g3Z44S7eioZfMGXpkeTpG6uiCzedBBkEdDEnQeN4CTpqEJ_Egf-cEvdx-2piW/s400/air_diamond.png)
Проверка математики, если в линзе воздух:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAkuYPhxkX9DR88NE8vYpZGW0muk7CTkEOdk0yoxklFVSAk7lhRMHBYrGKh6nq4tV0X8_13C_4aMEnYfOMhfLkMuiFooXY0veLHMbO71m-sHk_D9dsHJEXVyexjQfLpzs853oAE4wuvXfH/s400/air_air.png)
А вот так свет будет преломляться, если в линзе будет воздух и она (линза) будет помещена в воду:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidG8TjRVvK0RX2Dx-aPiKrewetxIuWsK_srwNCjYEBZ7dacEFPZSMAbV78sYSYWMRyTIffcmupB1vHDhwUPW_xINtpBtf2c_AWyKxI3vpUo2uqo68o1CnZSVv2zXuUlJAeF4pgwly0cLtn/s400/water_air.png)
Скажите пожалуйста, в какой программе визуализируете?
ОтветитьУдалитьКод визуализации написан мною, Direct3D 11.
ОтветитьУдалить