Ответ на пост «Сообществу плоской Земли посвящается»
Я в инсте первые пару недель тоже был своего рода "плоскоземельщиком". Согласно моей теории существовали прямые линии. Как-то заикнулся о прямой линии перед профессором и он меня потролил. Далее разговор:
Я: вот эта линия абсолютно прямая
П: нет, она не прямая, а кривая
Я: ну предположим что она идеальная, потому она все же прямая
П: но если даже и предположить так, то она все равно кривая
Я: а почему?
П: да потому, что в этом случае эта линия лежит на окружноси с бесконечным радиусом
Геометрия и линейные пространства - вопрос!
Я тут задумался, вот если мы берем евклидово пространство, то это просто-напросто линейное пространство со скалярным произведением с определенными свойствами. Свойства этого пространства описываются аксиомами евклидовой геометрии.
А можно ли так сделать с абсолютной геометрией или геометрией Лобачевского? Ну, то-есть положить в основу то же самое линейное пространство и как-то отождествить точки с векторами, чтобы аксиомы линейного пространства выполнялись и мы получили нечто похожее на евклидово пространство, но без скалярного произведения, в случае абсолютной геометрии, или с каким-то специальным, может, через метрический тензор, в случае геометрии Лобачевского?
Проблема связана с тем, что возник вопрос - вот пространство геометрии Лобачевского - оно линейное, или нет? Если там все кривое, это еще не значит, что пространство нелинейное. Вон пространство Минковского вроде бы вполне себе линейное, только скалярным произведением от евклидова отличается.
Головоломки на Пикабу!
У нас новая игра: нужно расставлять по городу вышки связи так, чтобы у всех жителей был мобильный интернет. И это не так просто, как кажется. Справитесь — награда в профиль ваша. Ну что, попробуете?
Как артист делал систему рисования линий для своей игры
Статья о том как художник/дизайнер бодался с системой рисования линий для игры и сделал ее :)
Кому будет интересна статья? Наверно всем, но не бывалым прогерам так как тут ничего нового для них нет. Читателя ждет МНОООГО видео, картинок и обьяснений "на пальцах".
Немного модного арта для затравки (который получился попутно и случайно в процессе тестов рисовалки):
В общем надоело смотреть на то как лазерный луч в нашей инди-игре не оставляет на стенах ничего. Абсолютно ничего. Пробовал trail добавлять, но он же исчезает. И смотрится trail так себе... Даже бомжам стыдно показывать.
Итак, поехали. Нужно было сделать систему рисования линий для игры. Линия должна рисоваться от лазерного луча на любой поверхности. Стал делать свою систему потому, что на AssetStore ничего такого нет. Есть одна система, но она:
1) рисование на каждом обьекте (static/dynamic) приводит к тому, что обьект вырывается из батчинга и создает +1 drawCall.
2) система рисует только точки. Ну типа как в Splatoon. Можно рисовать пятна, но не линии.
Очевидно, это мне не подходит, так что go делать что-то свое.
Это далеко неконечный вариант так как линии здесь не рисуются, рисуются "точки". За счет медленного движения мышки кисть рисуется часто и след выглядит как линия:
В сети можно найти кусочки кода и даже проекты, которые позволяют рисовать следы на какой-то одной модели.
Требования к системе такие:
- линии должны рисоваться на статических обьектах, но не всех. Динамические обьекты должны не давать рисовать линию на полигонах, которые ЗА ними.
- работает максимально быстро
- работает на любом железе на котором работает Unity
- число линий неограничего
- число цветов линий - неограничено
- рисовать можно не только линии
Задача эта для меня новая, никогда такого еще не делал, пришлось повозиться.
Как рисуются линии в комп-графике? Есть модель и игрок проводит по модели лучем. На модели должен остаться след. Нужно найти в каком месте рисовать этот след.
1) очевидно, полигоны, которые смотрят ОТ начала рисования линии не будут содержать на себе след. Потому, что это полигоны с противоположной стороны модели. Их можно отбраковать.
2) есть полигоны, которые смотрят на игрока и которые попали в область рисования линии. На них предположительно будет след от линии.
Ну вот, для наглядности:
Красная точка - начало луча. Синие линии - это сектор в котором луч повернулся. Стрелка показывает направление поворота (хотя это неневажно).
В итоге у нас есть треугольник, которым рассекли модель. Полигоны, которые повернуты от игрока (backfaced) сразу тупо отбросились и я их не сек плоскостью в кторой орудует луч.
Есть некоторые полигоны, которые повернуты к нам, но, которые не дожны рисовать на себе линию так как они перекрыты другими полигонами. Например, это полигоны в центре картинки. Для отбраковки таких линий, я запилил алгоритм отбраковки, который отсеивает их.
Вот фото работы этого алгоритма:
Красные линии - это то, что будет рисовать линию на модели. Желтые - это то, что отсечено.
Цифры и прочее - это для себя. Вообще пришлось сделать стенд и на нем все отлаживать. Стенд поддерживает подргузку линий из файла. если в игре что-то крякнется, приходится запускать отладчик, который подгружает в себя все логи и тестирует состояние игры на момент поломки. Удобно, всем советую искать баги невручную :) ну а потом, когда баг выявлен, ищешь что нагнулось в алгоритме.
Здесь просто тесты алгоритма, смотрел как работает:
В сцене может быть несколько "рисователей". Вот видео. где одновременно рисуется больше одного пятна за 1 раз. Кстати, тут видно, что нужно рисовать именно линии, а не пятна. Иначе между точками есть пробелы.
Здесь видно (подсвечиваю) полигоны на модели и какие полигоны секутся лучем (рисуют линию):
Здесь наглядно видно как работает рисование линий:
Удалось сечь обьект и рисовать на нем линию. Здорово!
Осталось сделат самую малость: найти обьекты, которые будут рисовать на себе линии.Вот водишь ты лучем в пространстве и нужно знать с чем луч пересечется. Для этого есть Оctree & BVH. Первый хорош для статики, второй для динамических обьектов. Спасибо GameDev.ru (а именно крутым парням foxes и kkolyan за подсказки).
Внедряем деревянные структуры, печем, запускаем. Работает!
Это не конечный вариант, но все же. Вот как смотрится след в действии:
Спасибо за внимание. На данный момент я занимаюсь больше артом и даже на такие беглые статьи не хватает времени.
Кому интересно, вот ссылки на меня. Здесь я выкладываю некоторые результаты по игре. Пока больше скетчами делюсь. Позже больше видео начну выкладывать ;) Подписывайтесь, это сильно стимулирует работать :)
https://twitter.com/CGAleksey
https://www.instagram.com/cgaleksey/
Немного о помехоустойчивом кодировании
Так случилось, что я обучаю студентов алгебре. И не редко, когда слышу вопрос "а зачем это нужно?" В данном посте будет приведен один простой пример, как линейная алгебра может использоваться передачи данных.
Допустим, Альберт передать Бенедикту сообщение, в котором будет или 0, или 1. Для этого он может передавать несколько раз символы 0 или 1. Но с некоторой вероятностью p, при передаче символ меняется на противоположный. То есть в канале передачи данных есть шумы. Логично считать, что p меньше половины, иначе просто будем передавать сразу 1 вместо 0.
Если мы хотим передавать только один символ, то тут проще послать то, что мы хотим. Вероятность ошибки будет p.
Если мы хотим повысить шансы того, что нас поймут, нужно посылать уже 2 символа. Но как кодировать сообщение? Если просто дублировать, например, для 0 посылать 00, для 1 посылать 11 не понять что делать с сообщениями 01 и 10, как их интерпретировать. Просто в силу симметрии они могут обозначать и то, и другое.
Тогда пойдем на хитрость, для 0 пошлем 00, а для 1 уже 01. Тогда если к нам приходит что-то из этого, то понятно, что скорей всего ошибки не было. Если придет 10, то с вероятностью p ошибка одна и это было 00, вероятность, что это было 01, то есть произошло 2 ошибки, уже p^2, то есть меньше. Аналогично, 11 мы будем интерпретировать как 1 с одной ошибкой (это тоже более вероятное событие). Таким образом мы можем увеличить вероятность расшифровки.
Аналогичное можно проделать и для трех, четырех и прочее символов. И тут как раз и появляется линейная алгебра. Ведь все сообщение это вектор, множество вариантов - это векторное пространство. При этом для нашего полученного вектора мы выбираем наиболее близкий вектор, которому что-то соответствует (метрика и норма такая длинна вектора это количество ненулевых элементов, а расстояние, соответственно, количество не совпадающих позиций). Это не единственный способ, возможно, присутствующие тут технари расскажут ещё вариации. Но это, как мне кажется, самый простой, в том числе и для понимания.
На этом пока все.
Кто нибудь знает как это решить?
Подскажите пожалуйста, как это решается?
Лента Экспертов: присоединяйтесь и делитесь опытом
Присоединяйтесь к обсуждению самых разных тем: как выбрать комплектующие для ПК, куда съездить на майские праздники, можно ли решить юридический вопрос и вернуть деньги, как спасти лимонное дерево или какой велосипед купить на весну–лето.