Тень - должен объект отрисовывать или лампа?
От: SergeyOsipov Россия  
Дата: 31.08.17 14:37
Оценка:
Есть 3D объект, и лампа. Они отрисовываются. А еще есть тень.
Тень должна знать про объект, чтобы отрисоваться, но она еще и должна знать про источник света, где он и какие у него характеристики.

Куда лучше по дизайну засунуть тень? В объект? Но тогда как привязать лампу? В лампу? Но тогда лампа должна знать про все объекты.

Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.
Re: Тень - должен объект отрисовывать или лампа?
От: neFormal Россия  
Дата: 31.08.17 14:44
Оценка: -2
Здравствуйте, SergeyOsipov, Вы писали:

SO>Куда лучше по дизайну засунуть тень?

SO>Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.

засунуть в объект, на который падает тень. он должен узнать знать про лампу и объекты на пути света.
...coding for chaos...
Re[2]: Тень - должен объект отрисовывать или лампа?
От: SergeyOsipov Россия  
Дата: 31.08.17 14:47
Оценка:
Здравствуйте, neFormal, Вы писали:

F>засунуть в объект, на который падает тень. он должен узнать знать про лампу и объекты на пути света.


Слишком много перекрестных пропихиваний линков. Можно конечно тупо всем объектам кидать указатель на сцену, а сцена уж все знает. Но как-то не красиво. Мож покрасивей можно?
Re[2]: Тень
От: Qbit86 Кипр
Дата: 31.08.17 14:50
Оценка:
Здравствуйте, neFormal, Вы писали:

F>засунуть в объект, на который падает тень. он должен узнать знать про лампу и объекты на пути света.


Может быть несколько объектов, принимающих тень от одного. И наоборот, на один объект могут кастить тени несколько других объектов. А ещё объект может кастить тень сам на себя, если он невыпуклый.
Глаза у меня добрые, но рубашка — смирительная!
Re: Тень - должен объект отрисовывать или лампа?
От: Stanislav V. Zudin Россия  
Дата: 31.08.17 14:51
Оценка: 1 (1) +7
Здравствуйте, SergeyOsipov, Вы писали:

SO>Есть 3D объект, и лампа. Они отрисовываются. А еще есть тень.

SO>Тень должна знать про объект, чтобы отрисоваться, но она еще и должна знать про источник света, где он и какие у него характеристики.

SO>Куда лучше по дизайну засунуть тень? В объект? Но тогда как привязать лампу? В лампу? Но тогда лампа должна знать про все объекты.


В сцену (либо в специально обученный для этого объект), которая знает и про лампу, и про объект.
_____________________
С уважением,
Stanislav V. Zudin
Re: Тень - должен объект отрисовывать или лампа?
От: Qulac Россия  
Дата: 31.08.17 14:51
Оценка:
Здравствуйте, SergeyOsipov, Вы писали:

SO>Есть 3D объект, и лампа. Они отрисовываются. А еще есть тень.

SO>Тень должна знать про объект, чтобы отрисоваться, но она еще и должна знать про источник света, где он и какие у него характеристики.

SO>Куда лучше по дизайну засунуть тень? В объект? Но тогда как привязать лампу? В лампу? Но тогда лампа должна знать про все объекты.


SO>Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.


А оно здесь надо ооп? Вообще по идее это не тень отрисовывается, а третий объект освещенный лампой.
Программа – это мысли спрессованные в код
Re[2]: Тень - должен объект отрисовывать или лампа?
От: SergeyOsipov Россия  
Дата: 31.08.17 14:55
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>В сцену (либо в специально обученный для этого объект), которая знает и про лампу, и про объект.


Это первое решение, которое приходит на ум. Хочется услышать предложения, мож кто чего нестандартное предложит.
Re[3]: Подвижные объекты и источники света
От: Qbit86 Кипр
Дата: 31.08.17 15:05
Оценка:
Здравствуйте, SergeyOsipov, Вы писали:

SO>Это первое решение, которое приходит на ум. Хочется услышать предложения, мож кто чего нестандартное предложит.


Зачем тебе нестандартное?

В общем случае источники света, объекты кастящие тень и объекты принимающие тень могут двигаться от кадра к кадру. Если у тебя каждый объект будет содержать коллекции всех источников света, всех объектов которые кастят на него тень, и/или всех объектов которые принимают от него тень, то в каждом кадре придётся обновлять эти коллекции.
Глаза у меня добрые, но рубашка — смирительная!
Re: Тень - должен объект отрисовывать или лампа?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 31.08.17 16:49
Оценка: +1 :)
Здравствуйте, SergeyOsipov, Вы писали:

SO>Есть 3D объект, и лампа. Они отрисовываются. А еще есть тень.

Всегда приятно слышать про объекты, которые рисуются, записываются в БД, про работа.Выполняйся(), банковскийСчет.Пополняйся(), пиво.Пейся(), земля.Копайся().

SO>Тень должна знать про объект, чтобы отрисоваться, но она еще и должна знать про источник света, где он и какие у него характеристики.


SO>Куда лучше по дизайну засунуть тень? В объект? Но тогда как привязать лампу? В лампу? Но тогда лампа должна знать про все объекты.

Немного имел дело с 3D в 2000-х. Мне кажется, что в задаче отрисовки тени вопросы о том, куда ее засунуть — не в первом десятке актуальности. Вообще не помню, что бы в 3D пакетах в сценах присутствовали объекты "тень" как таковые.

SO>Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.

С точки зрения букварного ООП, где тень — наследник объекта сцены, все как раз красиво. Т.е. если задача состоит в том, что бы сделать красивый ООП, тут вряд ли одно решение будет чем-то лучше другого. Но если ее все-таки надо нарисовать, то предлагаю от ООП дизайна перейти к методам.

Вообще вопрос из категории "кто будет рисовать дырку от бублика?, бублик, или то, что через него видно?".
Re: Тень - должен объект отрисовывать или лампа?
От: alpha21264 СССР  
Дата: 31.08.17 18:37
Оценка:
Здравствуйте, SergeyOsipov, Вы писали:

SO>Есть 3D объект, и лампа. Они отрисовываются. А еще есть тень.

SO>Тень должна знать про объект, чтобы отрисоваться, но она еще и должна знать про источник света, где он и какие у него характеристики.

SO>Куда лучше по дизайну засунуть тень? В объект? Но тогда как привязать лампу? В лампу? Но тогда лампа должна знать про все объекты.


SO>Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.


С точки зрения красоты ООП у тебя есть сцена с несколькими источниками света.
Сцена знает и про лампу и про предмет на пути света и про предмет, на который падает свет.

Течёт вода Кубань-реки куда велят большевики.
Re: Тень - должен объект отрисовывать или лампа?
От: Vladek Россия Github
Дата: 31.08.17 19:15
Оценка: +2
Здравствуйте, SergeyOsipov, Вы писали:

SO>Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.


В геймдеве свои специфические подходы: https://en.wikipedia.org/wiki/Entity%E2%80%93component%E2%80%93system

Там ООП не на первом месте, главное 60 раз и больше за секунду всё отработать (и если надо — тени отключить).
Отредактировано 31.08.2017 19:17 Vladek . Предыдущая версия .
Re: Тень - должен объект отрисовывать или лампа?
От: Слава  
Дата: 31.08.17 20:25
Оценка:
Здравствуйте, SergeyOsipov, Вы писали:

SO>Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.


Нет там никакого ООП и не нужно оно там. Всё правильно пишут про сцену. Лампа и объект — это данные, нечто пассивное, их обрабатывает сцена.
Re[3]: Тень - должен объект отрисовывать или лампа?
От: neFormal Россия  
Дата: 31.08.17 22:41
Оценка:
Здравствуйте, SergeyOsipov, Вы писали:

F>>засунуть в объект, на который падает тень. он должен узнать знать про лампу и объекты на пути света.

SO>Слишком много перекрестных пропихиваний линков. Можно конечно тупо всем объектам кидать указатель на сцену, а сцена уж все знает. Но как-то не красиво. Мож покрасивей можно?

для каждой точки нужно знать степень её затенения.
если точка тоже является объектом в смысле ООП, то надо знать, кем она закрыта от источника света и какие рефлексы получает. получить она это может от окружающей её сцены.

в принципе, каждый объект может оценивать область, которую он накрывает тенью и генерить по этому массиву точек какое-то событие. мол, "пересчитай освещение".
можно это делать даже через шину сообщений.
...coding for chaos...
Re[3]: Тень
От: neFormal Россия  
Дата: 31.08.17 22:43
Оценка:
Здравствуйте, Qbit86, Вы писали:

F>>засунуть в объект, на который падает тень. он должен узнать знать про лампу и объекты на пути света.

Q>Может быть несколько объектов, принимающих тень от одного.

поэтому каждый объект сам смотрит, кем он закрыт от света

Q>И наоборот, на один объект могут кастить тени несколько других объектов.


каждый объект находит все закрывающие его от источников света объекты

Q>А ещё объект может кастить тень сам на себя, если он невыпуклый.


с этим уже сложнее и тут работа передаётся точкам
...coding for chaos...
Re: Тень - должен объект отрисовывать или лампа?
От: andrey.desman  
Дата: 31.08.17 23:55
Оценка:
Здравствуйте, SergeyOsipov, Вы писали:

SO>Есть 3D объект, и лампа. Они отрисовываются.


Они не отрисовываются. Уж лампа-то (в смысле источника света) точно.

В принципе не возможно "отрисовать" какой-то объект. Можно только вычислить отражаемый свет, который исходит в частности и от этого объекта.

SO>А еще есть тень.


А тени нет.
Есть отраженный или не очень свет.

SO>Тень должна знать про объект, чтобы отрисоваться, но она еще и должна знать про источник света, где он и какие у него характеристики.

SO>Куда лучше по дизайну засунуть тень? В объект? Но тогда как привязать лампу? В лампу? Но тогда лампа должна знать про все объекты.

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

SO>Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.
Re[2]: Тень - должен объект отрисовывать или лампа?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 04.09.17 08:06
Оценка:
Здравствуйте, Vladek, Вы писали:

V>В геймдеве свои специфические подходы: https://en.wikipedia.org/wiki/Entity%E2%80%93component%E2%80%93system

V>Там ООП не на первом месте, главное 60 раз и больше за секунду всё отработать (и если надо — тени отключить).

Entity-Component-System это конкретный подход, можно сказать архитектурный паттерн и он нисколько не противоречит ООП.

ООП нужно не для наследования-инкапсуляции-полиморфизма, а для управления сложностью решения. Т.е. структурирование решения.
Как только ты решил задачу, её нужно перевести в код. Вот здесь и начинает работать ООП. А Entity-Component-System это уже конкретный вариант дизайна.

Собственно именно в геймдеве прижилось чистейшее ООП — объекты состоят из объектов, взаимодействуют с другими объектами посредством сообщений и тд. Частный случай взаимодействия — управление, так же делается посредством сообщений.

Отсюда ясно, что привязаны методы к самому объекту или не привязаны это для ООП дело десятое, как ни странно. То есть, takeDamege(entity) и entity.takeDamege() абсолютно эквивалентны.
Re[3]: Тень - должен объект отрисовывать или лампа?
От: ylem  
Дата: 04.09.17 11:45
Оценка:
I>Собственно именно в геймдеве прижилось чистейшее ООП — объекты состоят из объектов, взаимодействуют с другими объектами посредством сообщений и тд. Частный случай взаимодействия — управление, так же делается посредством сообщений.

I>Отсюда ясно, что привязаны методы к самому объекту или не привязаны это для ООП дело десятое, как ни странно. То есть, takeDamege(entity) и entity.takeDamege() абсолютно эквивалентны.


По всему остальному да, а вот по примеру -- нет (или переубедите, пожалуйста)
Для меня ООП это в основном не об инстансов объектов и о том, как они обмениваются, а о том, что "код рядом с данным", т.е. на самом деле "данных" нет, это все "инкапсулировано".
И вот тут между takeDamege(entity) и entity.takeDamege() разница приципиальная. Я не хочу сказать, что takeDamege(entity) это плохо, просто разница есть, и если в моей софтине "принимать повреждения" -- это "в природе" самого объекта (а не просто частный сценарий взаиможействия с ним), то я предпочту entity.takeDamege()
Отредактировано 04.09.2017 11:48 ylem . Предыдущая версия .
Re[4]: Тень - должен объект отрисовывать или лампа?
От: neFormal Россия  
Дата: 04.09.17 12:06
Оценка:
Здравствуйте, ylem, Вы писали:

I>>Отсюда ясно, что привязаны методы к самому объекту или не привязаны это для ООП дело десятое, как ни странно. То есть, takeDamege(entity) и entity.takeDamege() абсолютно эквивалентны.

Y>По всему остальному да, а вот по примеру -- нет (или переубедите, пожалуйста)
Y>Для меня ООП это в основном не об инстансов объектов и о том, как они обмениваются, а о том, что "код рядом с данным", т.е. на самом деле "данных" нет, это все "инкапсулировано".
Y>И вот тут между takeDamege(entity) и entity.takeDamege() разница приципиальная. Я не хочу сказать, что takeDamege(entity) это плохо, просто разница есть, и если в моей софтине "принимать повреждения" -- это "в природе" самого объекта (а не просто частный сценарий взаиможействия с ним), то я предпочту entity.takeDamege()

а если "в природе" самого объекта есть возможность изменять "здоровье", то ф-ция takeDamage(entity) будет делать entity.decreaseHp(n), а ф-ция heal(entity) будет делать entity.increaseHp(n)
...coding for chaos...
Re[5]: Тень - должен объект отрисовывать или лампа?
От: ylem  
Дата: 04.09.17 12:46
Оценка:
F>а если "в природе" самого объекта есть возможность изменять "здоровье", то ф-ция takeDamage(entity) будет делать entity.decreaseHp(n), а ф-ция heal(entity) будет делать entity.increaseHp(n)

И опять же, я бы предпочел не менять здоровье снаружи так явно, потому что, например, у каких-нибудь десептиконов вообще нет здоровья в обычном понимании или кого-нибудь лечи-нелечи, все бестолку.
Re[3]: Тень - должен объект отрисовывать или лампа?
От: Qulac Россия  
Дата: 04.09.17 12:54
Оценка:
Здравствуйте, Ikemefula, Вы писали:

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


V>>В геймдеве свои специфические подходы: https://en.wikipedia.org/wiki/Entity%E2%80%93component%E2%80%93system

V>>Там ООП не на первом месте, главное 60 раз и больше за секунду всё отработать (и если надо — тени отключить).

I> Entity-Component-System это конкретный подход, можно сказать архитектурный паттерн и он нисколько не противоречит ООП.


I>ООП нужно не для наследования-инкапсуляции-полиморфизма, а для управления сложностью решения. Т.е. структурирование решения.

I>Как только ты решил задачу, её нужно перевести в код. Вот здесь и начинает работать ООП. А Entity-Component-System это уже конкретный вариант дизайна.

I>Собственно именно в геймдеве прижилось чистейшее ООП — объекты состоят из объектов, взаимодействуют с другими объектами посредством сообщений и тд. Частный случай взаимодействия — управление, так же делается посредством сообщений.


Это реализация игровой бизнес-логики, а мы про отрисовку говорим.
Программа – это мысли спрессованные в код
Re[6]: Тень - должен объект отрисовывать или лампа?
От: neFormal Россия  
Дата: 04.09.17 19:06
Оценка: 2 (1)
Здравствуйте, ylem, Вы писали:

F>>а если "в природе" самого объекта есть возможность изменять "здоровье", то ф-ция takeDamage(entity) будет делать entity.decreaseHp(n), а ф-ция heal(entity) будет делать entity.increaseHp(n)

Y>И опять же, я бы предпочел не менять здоровье снаружи так явно, потому что, например, у каких-нибудь десептиконов вообще нет здоровья в обычном понимании или кого-нибудь лечи-нелечи, все бестолку.

это уже зависит от подхода.
ничто не мешает сделать пустую реализацию метода. а если там ещё и entity component system с HealthComponent, то только inc/dec и останутся.
...coding for chaos...
Re[7]: Тень - должен объект отрисовывать или лампа?
От: ylem  
Дата: 04.09.17 20:12
Оценка:
F>ничто не мешает сделать пустую реализацию метода. а если там ещё и entity component system с HealthComponent, то только inc/dec и останутся.

Все-таки пошел читать про ECS. Спасибо.
Re[4]: Тень - должен объект отрисовывать или лампа?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 05.09.17 10:50
Оценка:
Здравствуйте, Qulac, Вы писали:

V>>>В геймдеве свои специфические подходы: https://en.wikipedia.org/wiki/Entity%E2%80%93component%E2%80%93system

V>>>Там ООП не на первом месте, главное 60 раз и больше за секунду всё отработать (и если надо — тени отключить).

I>> Entity-Component-System это конкретный подход, можно сказать архитектурный паттерн и он нисколько не противоречит ООП.


I>>ООП нужно не для наследования-инкапсуляции-полиморфизма, а для управления сложностью решения. Т.е. структурирование решения.

I>>Как только ты решил задачу, её нужно перевести в код. Вот здесь и начинает работать ООП. А Entity-Component-System это уже конкретный вариант дизайна.

I>>Собственно именно в геймдеве прижилось чистейшее ООП — объекты состоят из объектов, взаимодействуют с другими объектами посредством сообщений и тд. Частный случай взаимодействия — управление, так же делается посредством сообщений.


Q>Это реализация игровой бизнес-логики, а мы про отрисовку говорим.


Отрисовка это частный случай System в этой архитектуре. Вся бизнес-логика всего лишь разные System, которые между собой взаимодействуют. Коллизии, движение, урон и тд — это все System. И отрисовка здесь ничем не выделяется.
Re: Тень - должен объект отрисовывать или лампа?
От: nekocoder США  
Дата: 08.09.17 20:05
Оценка:
Здравствуйте, SergeyOsipov, Вы писали:

SO>Есть 3D объект, и лампа. Они отрисовываются. А еще есть тень.


Тени как объекта нет. Есть разная освещенность разных фрагментов объектов, которая расчитывается в зависимости от многих факторов, в том числе и от прямой видимости источников света.

Некоторые алгоритмы теней требуют дополнительных объектов, таких как теневой буффер. Но это будет частью реализации алгоритма, а не объекта или источника света.
При рейтресинге никаких дополнительных объектов для теней не требуется, они получаются естественным образом.
Re: Тень - должен объект отрисовывать или лампа?
От: SergH Россия  
Дата: 16.09.17 21:57
Оценка: +2
Здравствуйте, SergeyOsipov, Вы писали:

SO>Есть 3D объект, и лампа. Они отрисовываются. А еще есть тень.

SO>Тень должна знать про объект, чтобы отрисоваться, но она еще и должна знать про источник света, где он и какие у него характеристики.

SO>Куда лучше по дизайну засунуть тень? В объект? Но тогда как привязать лампу? В лампу? Но тогда лампа должна знать про все объекты.


SO>Вопрос не в том, как сделать. А в том как по красоте с точки зрения ООП.


Зависит от алгоритма рисования. Если что-то хотя бы приблизительно фотореалистичное, то всё вообще не так.
Потому что кроме теней есть ещё блики и отражения. Их тоже отдельными объектами?
И не понятно, как объект у тебя может рисоваться, не зная про лампу -- у него же есть более освещенная сторона и менее и т.п.

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


Если же это что-то очень условное, где всё же объекты рисуют сами себя, а лампа нам нужна только чтобы задать направление теням... Я бы всё равно генерировал тени на лету, наверное. Как раз с точки зрения красоты, по производительности там х.з. что получится. Тень получается из объекта и источника света, т.е. при перемещении лампы нужно пересчитывать их все, а при перемещении объектов только от переместившихся. Может свойство объекта, запоминать, и пересчитывать потом.

Но от того, что для отрисовки сцена должна знать всё про все объекты всё равно никуда не деться. Например та же тень рисуется поверх каких-то других объектов, а значит должна про них "знать", ну или они про неё. Источник света часть сцены.
Делай что должно, и будь что будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.