Как сымитировать тело вращения?
От: Varavva  
Дата: 19.10.15 10:20
Оценка:
Как на 2D плоскости рисования наиболее просто сымитировать быстро 3D тело вращения? То есть без реального построения 3D поверхности, а просто некий обман, игра света и тени, чтоб было как будто рисуемый на 2D контур сразу же вращается в 3D. Никаких учетов перспектив не надо, разумеется, ортогональная перспектива.

Например, человек редактирует сплайн, который является контуром вазы. И сразу видит сбоку эту самую вазу, но иммитацию на самом деле, без построения меша вазы
Re: Как сымитировать тело вращения?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 19.10.15 11:19
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Например, человек редактирует сплайн, который является контуром вазы. И сразу видит сбоку эту самую вазу, но иммитацию на самом деле, без построения меша вазы


А вазы по-разному выглядят в профиль и фас?
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: Как сымитировать тело вращения?
От: Varavva  
Дата: 19.10.15 11:26
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, Varavva, Вы писали:


V>>Например, человек редактирует сплайн, который является контуром вазы. И сразу видит сбоку эту самую вазу, но иммитацию на самом деле, без построения меша вазы


DR>А вазы по-разному выглядят в профиль и фас?


Вазы по-разному выглядят сбоку и сверху. Вот нужен вид сбоку.
Есть идея рисовать линии от точки сплайна цветом, зависящим от угла касательной к сплайну.
Но мож иначе можно? Масками там какими-нибудь.
Re: Как сымитировать тело вращения?
От: watchmaker  
Дата: 19.10.15 12:02
Оценка:
Здравствуйте, Varavva, Вы писали:


V>Например, человек редактирует сплайн, который является контуром вазы. И сразу видит сбоку эту самую вазу

Это должно выглядеть как на второй минуте этого видео, или как?

V>Как на 2D плоскости рисования наиболее просто сымитировать быстро 3D тело вращения? То есть без реального построения 3D поверхности,

Ну, создать 3D модель — это, действительно, один из самых простых способов. Недостатка в готовых библиотеках, которые потом отрисуют полученную поверхность, нет. Почему не этот путь?
Re[2]: Как сымитировать тело вращения?
От: Varavva  
Дата: 19.10.15 12:04
Оценка:
Здравствуйте, watchmaker, Вы писали:


V>>Например, человек редактирует сплайн, который является контуром вазы. И сразу видит сбоку эту самую вазу

W>Это должно выглядеть как на второй минуте этого видео, или как?

Так, но немного не так. РИсование линии идет непрерывно, а не кусочками, Поэтому перестаивать 3D придется слишком часто.
И вид трехмерного тела нужен просто сбоку — потому и ищу более простые методы, без построения самого тела
Re: Как сымитировать тело вращения?
От: velkin Удмуртия https://kisa.biz
Дата: 19.10.15 12:05
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Например, человек редактирует сплайн, который является контуром вазы. И сразу видит сбоку эту самую вазу, но иммитацию на самом деле, без построения меша вазы


Как самый примитивный вариант — градиент.
Re[2]: Как сымитировать тело вращения?
От: Varavva  
Дата: 19.10.15 12:06
Оценка:
Здравствуйте, velkin, Вы писали:

V>Как самый примитивный вариант — градиент.


Во, типа такого и надо. Но как именно градиент?
Re[3]: Как сымитировать тело вращения?
От: velkin Удмуртия https://kisa.biz
Дата: 19.10.15 12:15
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Здравствуйте, velkin, Вы писали:

V>>Как самый примитивный вариант — градиент.
V>Во, типа такого и надо. Но как именно градиент?

К примеру, в том же Qt просто залить по пути градиент одного из видов.



Какой именно можно понять проведя опыты практически в любом редакторе векторной графики. Лично я думаю хорошо подходит радиальный градиент, если его правильно настроить. Хотя можно попробовать и линейный, но это в основном для схем.

Re: Как сымитировать тело вращения?
От: Кодт Россия  
Дата: 19.10.15 13:18
Оценка:
Здравствуйте, Varavva, Вы писали:

V>Как на 2D плоскости рисования наиболее просто сымитировать быстро 3D тело вращения? То есть без реального построения 3D поверхности, а просто некий обман, игра света и тени, чтоб было как будто рисуемый на 2D контур сразу же вращается в 3D. Никаких учетов перспектив не надо, разумеется, ортогональная перспектива.


Самый простой способ — хотя и не самый красивый — это яркость как функция z-координаты.
— монотонно (чем дальше, тем темнее)
— зеброй

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

Усложняем: помещаем поток света под углом к направлению зрения (но, для простоты, можем оставить его пенпердиклярным оси вращения).
Яркость как функция
— z-координаты в направлении источника света (в том числе зебра, что соответствует освещению через полосатый светофильтр)
— углов наклона к источнику и зрителю
— — матовая поверхность: косинусоидальная диаграмма освещённости, помножить на косинусоидальную диаграмму излучения
— — отражающая поверхность: диаграмма направленности, с максимумом по углу отражения

Для функции 2d-кривой Y(x) получаем 3d-тело Z(x,y) = Y(x)*C(Y(x),y)
где C(r,y) = sqrt(r^2-y^2) для |y|<|r| или 0.

Яркость
H(x,y) = Zmax — Z(x,y)
H(x,y) = Z(x,y) mod Zebra

Наклон — мнэээ, тут надо матан вспоминать и геометрию.
Перекуём баги на фичи!
Bump Mapping
От: watchmaker  
Дата: 19.10.15 13:41
Оценка:
Здравствуйте, Varavva, Вы писали:

V>>>Например, человек редактирует сплайн, который является контуром вазы. И сразу видит сбоку эту самую вазу

W>>Это должно выглядеть как на второй минуте этого видео, или как?

V>Так, но немного не так. РИсование линии идет непрерывно, а не кусочками, Поэтому перестаивать 3D придется слишком часто.

Ну не чаще чем раз в кадр. Да и незачем перестраивать — нужно лишь добавлять к уже построенному.

V>И вид трехмерного тела нужен просто сбоку

А это «не сбоку» что-ли? :)
Или ты имеешь ввиду, что ось зрения камеры расположена перпендикулярно плоскости на которой нарисован сплайн, да?

Для честной визуализации лет этак 35 назад описали bump mapping. Собственно, для такой проекции все формулы там получаются крайне простыми. Так что такие изображения строятся легко даже на очень слабых процессорах безо всяких gpu ускорителей (можно найти примеры в старой demoscene, например). Причём это даже для произвольного тела, а уж для поверхности вращения можно сделать ещё кучу оптимизаций: так одна производная будет константой для целой строки изображения, а две другие для тела вращения можно эффективно считать через алгоритм Брезенхема. В целом, на CPU получится супер-быстро и при этом с достаточно честным освещением (всё, кроме теней от тела). И никакого 3d, настоящий old-school безо всякой новомодной арифметики с плавающей точкой (и это уж не говоря об полном отсутствии тригонометрии) :)

Выглядит результат так:

Исходный сплайн справа, а результат bump mapping слева.
Или то же самое в анимации с меняющимся сплайном:



V>- потому и ищу более простые методы, без построения самого тела

Так если тебя интересует простота кода — то делай в 3d. Да, это неэффективно с точке зрения расхода памяти и времени процессора. Но зато код короткий, простой, и пишется быстро. Bump mapping с Брезенхемом работает, конечно, быстрее и тратит намного меньше тактов. Но оно тупо проиграет по количеству строчек кода. Это лет 20 назад ситуация была бы обратной.
Отредактировано 20.10.2015 17:54 watchmaker . Предыдущая версия .
Re: Bump Mapping
От: watchmaker  
Дата: 24.10.15 21:22
Оценка:
W> целом, на CPU получится супер-быстро и при этом с достаточно честным освещением

А впрочем можно и ещё быстрее, если отказаться от универсальности и потребовать чтобы функция затенения зависела лишь от нормали к поверхности.
В этом случае достаточно предподсчитать значение освещённости в зависимости от угла поворота φ (в цилиндрических координатах) и от значения производной к сплайну k и занести результат в таблицу.
Тогда рендеринг изображения сведётся к интерполяции данных из этой таблицы. А если рассматривать, например, координаты (cos(φ), arctan(k)), то задача фактически сведётся к линейной интерполяции (можно, и метод ближайшего соседа использовать, либо наоборот билинейную интерполяцию, в зависимости от желаемого соотношения между памятью, сложностью и качеством; а вместо arctan также подойдёт любая другая похожая монотонная функция R->[0,1]).
А так как вышеприведёрнные рисунки и так уже построены с использованием модели Блинна-Фонга для бесконечно удалённых источников, то на них это ограничение не скажется никак.
Получается забавная ситуация: bumpmapping для тел вращения работает даже быстрее, чем, например, заливка контура радиальным градиентом из совета из соседнего сообщения
Автор: velkin
Дата: 19.10.15
:) (и это ещё без учёта того, что в куче чипов есть аппаратная поддержка (би-)линейной интерполяции изображений).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.