masterspammer (masterspammer) wrote,
masterspammer
masterspammer

Сеточка, блин!

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

Похоже, придётся мне делать серию про одномерную графику.

----

Жуки вообще-то чит на чите by design. Одним из читов является одномерная графика.

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

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

Как отбрасывается тень? Для каждой (очередной) точки на прямой основания (2d преобразуется в 1d) есть высота тени - то есть высота самого высокого встреченного предмета. Если очередная точка ВЫШЕ тени, то она освещена (и высота тени дальше будет равна ей высоте), иначе точка затенена. Вот самый грубый случай - для лучей параллельных поверхности и предметов без дырок.

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

---

У меня сегодня оказалось, что при освещении почти с севера (линия сканирования идёт почти вертикально, но иногда перескакивает на соседний столбец) в некоторых местах (там где полого в направлении север-юг, но круто - запад восток) при перескакивании высота изменялась скачком а одномерный алгоритм не знал причин и стоил ступенчатую тень. Получался этакой муар. Вылечилось вычислением средней высоты из той, что на этой линии и той что на следующей, куда перескочить - коэффициенты для смешивания уже были известны - перескок делается по переполнении байта-аккумулятора в результате переодического добавления к нему заранее известной константы. Что осталось после переполнения - доля (с поправкой что это [0..256) а не [0..1), что несложно) высоты из следующей линии, а её дополнение (то есть 256-a) - доля текущей.

UPD: явно придётся писать с картинками и формулами. Математики ОЧЕНЬ много.
Tags: xbugs, ФиксикиПокусали
Subscribe

  • (no subject)

    В общем, загад (вот гад!) не бывает богат. Из запланированного сделал абсолютный минимум. Эпиграфом субботы был анекдот про лягушку, ходившую по…

  • git

    Пропустил букву 'i'. Вышло так: $ gt fetch --all -p Программа 'gt' на данный момент не установлена. Вы можете установить её,…

  • Монитороложество

    Ковыряю телек - хочу отделить монитор. Прозвонил что куда - всё На плате - микросхема toshiba 203g04f0004, её описания нигде нет, только вот…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments