Пятница, 19 Апреля 2024, 11:19

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Как рисовать в GUI изображение - точно над объектом 3D мира? (как значки флага над бойцом в Call of Duty MF)
Как рисовать в GUI изображение - точно над объектом 3D мира?
KamiRoninДата: Воскресенье, 13 Января 2013, 20:46 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Доброго времени суток всем!

облазил больше 300 страниц в нэте... и вот пишу вопрос!

нужен алгоритм (хотя бы) или скрипт как в Unity повесить 2D текстуру в гуе над строго определенной точкой 3Д мира?!?!
при удалении от этой точки на 100 "метров" она размером 100Х100 при приближении - увеличивается до полного, при движении в разных направлениях по 3Д миру она указывает на помеченную точку смещаясь по 2Д экрану..

ну неужели никто с этим не сталкивался?

что нашел:
GUI текст над объектом
2D координата 3D точки
Полоска здоровья над объектом
преобразование 3D координаты в экранные 2D/ Direct3D
Как нарисовать фрэйм вокруг объекта -- самая удачная версия (имхо)

Переписал скрипты (где были) проверил - самая большая проблема это при отходе Player'а от объекта - надписи или рисунок смещается так, что перестает с ним соотносится нормально.. короче нет ни одной ГЛАДКОЙ технологии...
про матрицы (перемножит четыре матрицы в трех преобразованиях) я так и не разобрался.. оставил на потом. возможно осилю на днях.
но...
Мы имеем - например машина стоит на нашем уровне в 150 метрах от героя, над ней висит 2D метка к которой нужно дойти через улицы, дома и тп. все с разных высот.
(3D объект вешать - это будет другая тема!! я сейчас конкретно по этому вопросу).
вешаю над машиной текст (картинку) и при небольшом смещении в сторону персонажа, с подъемом на другую высоту - все! уже указатель съехал куда то в другую сторону.
это происходит потому что высота машины под этим углом теперь не соответствует ортогональной точке куда я прикреплял (расчет точки ведется со смещением на размер надписи и тп.)!!! плюс ещё объект в сцене - имеет неравномерные очертания, и что самое тяжкое - НЕРАВНОМЕРНЫЙ scale!! да все это под разными углами...
и все. занавес просто!!! алгоритм в сети есть (4 матрицы умножаются на друг друга) но реализации так и не попалось!
а между тем это повсеместно используемый механизм - во всех играх от стратегий до стрелялок!!!
а у меня над объектом появляется маркер и справо-над - появляется спец информация. смещение вычислять критично. чтобы было цивильно!

самым идеальным вариантом считаю такой:
мысленно делаем стопкадр игры, во время него делаем силуэтную проекцию 3D объекта как бы он лег на экран если бы его снизу-сзади подсветили. получаем силуэт с шириной и высотой! все. очень тупо рисуем над силуэтом по формуле - х = (ширина силуэта / 2) - ширина картинки / 2; у = (высота силуэта / 2 + 10 пикселей престижа) + вся высота картинки. (плюс выс. карт. потому что так в Unity)
все. задача была бы решена.

но как написать такую проекцию силуэта?! вот в чем вопрос!!! sad


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Воскресенье, 13 Января 2013, 20:51
basistДата: Воскресенье, 13 Января 2013, 20:55 | Сообщение # 2
пациент Flight Dream Studio
Сейчас нет на сайте
ССЫЛЬ вот должно подойти.
EchoITДата: Воскресенье, 13 Января 2013, 21:15 | Сообщение # 3
старожил
Сейчас нет на сайте
Цитата
Как рисовать в GUI изображение - точно над объектом 3D мира?

C#:
Код
new Vector3 pos1=Camera.main.WorldToScreenPoint(transform.position);
GUITexture.pixelInset=new Rect(pos1.x,pos1.y,width,height);


Долгожданный анонсик: State of War

Сообщение отредактировал EchoIT - Воскресенье, 13 Января 2013, 21:48
IIyxMASTERДата: Воскресенье, 13 Января 2013, 21:43 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Чем не устраивает первый вариант? Текстура висит ровно над объектом, что еще надо то?
KamiRoninДата: Воскресенье, 13 Января 2013, 23:48 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
Цитата (EchoIT)
C#:
Код
new Vector3 pos1=Camera.main.WorldToScreenPoint(transform.position);
GUITexture.pixelInset=new Rect(pos1.x,pos1.y,width,height);


во втором ректе width,height от чего? откуда взял?

Добавлено (13.01.2013, 23:46)
---------------------------------------------
Цитата (basist)
ССЫЛЬ вот должно подойти.


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

Добавлено (13.01.2013, 23:48)
---------------------------------------------
Цитата (IIyxMASTER)
Чем не устраивает первый вариант? Текстура висит ровно над объектом, что еще надо то?


я писал в начале - у меня ДВА вывода (один постоянный, один при наведении). и второй выше-правее основного тела.

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


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Понедельник, 14 Января 2013, 16:37
IIyxMASTERДата: Понедельник, 14 Января 2013, 06:34 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Домой приду - скринов наделаю, вроде вертел камеру как угодно - стрелка(текстура) всегда была над объектом
KamiRoninДата: Понедельник, 14 Января 2013, 08:57 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
главная проблема при подготовке отрисовки - это вычислить ВИДИМУЮ ШИРИНУ И ВЫСОТУ объекта относительно вьюпорта (т.е. в координатах от 0 до 1) или игрового мира (потом легко преобразовать). как только решим эту проблему - все, будет ИДЕАЛЬНЫЙ скрипт! smile

Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Понедельник, 14 Января 2013, 09:50
EchoITДата: Понедельник, 14 Января 2013, 13:24 | Сообщение # 8
старожил
Сейчас нет на сайте
Цитата
во втором ректе от чего? откуда взял?

Width и height - нужные тебе ширина и высота GUI-элемента. smile


Долгожданный анонсик: State of War
KamiRoninДата: Понедельник, 14 Января 2013, 16:42 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
Цитата (EchoIT)
Width и height - нужные тебе ширина и высота GUI-элемента.


мне не нужна ширина моего же GUI элемента (выводимой текстуры) - её я хорошо знаю.
мне нужен width,height "силуэта" 3D объекта на вьюпорте в каждый тик времени и с любого ракурса.
тогда я смогу позицию моего GUI элемента вычислять совершенно точно!

и ещё вопрос: можешь разъяснить про "GUITexture.pixelInset" для чего он?
я так понял из трех строчек в справке что он устанавливает правильный размер пикселя выводимой текстуры. и ещё там было что я при этом могу установить мой камень преткновения - localScale моего объекта в zero для того чтобы размер пикселя был одинаковый... но смысл ускользнул... зачем мне это?!?!


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Понедельник, 14 Января 2013, 16:47
SnakeRДата: Понедельник, 14 Января 2013, 18:34 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
KamiRonin, возможно глупый вопрос, но все же.
Почему вы не хотите над объектом вешать обычную плашку с текстурой, которая всегда ортогональна камере?


Unity3D Developer
Ваш лучший помощник при разработке в Unity3D
EchoITДата: Понедельник, 14 Января 2013, 18:43 | Сообщение # 11
старожил
Сейчас нет на сайте
KamiRonin, guiTexture.pixelInset для того, чтобы задавать координаты и размеры guiTexture.
Цитата
мне не нужна ширина моего же GUI элемента

Я и не писал, как тебе их получить, я тебе написал ответ на вопрос, заданный тобой в заголовке темы. Если тебе это не нужно, то думай сам. smile


Долгожданный анонсик: State of War
KamiRoninДата: Понедельник, 14 Января 2013, 19:56 | Сообщение # 12
почти ветеран
Сейчас нет на сайте
Цитата (SnakeR)
над объектом вешать обычную плашку с текстурой, которая всегда ортогональна камере?

Скрипт займет 30 строк, а 500 плашек в 3D утяжелят игру - текстуры будут рендериться, плашки будут перекрываться другими объектами... и тп.


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
seamanДата: Понедельник, 14 Января 2013, 20:20 | Сообщение # 13
старожил
Сейчас нет на сайте
Цитата
500 плашек в 3D утяжелят игру

У Вас в кадре сразу 500 объектов с надписями? Нет ведь. Тогда зачем у всех выводить эту плашку? Включайте рендерер только у тех, что надо. И не забудьте на плашку повесить скрипт, превращающий ее в билборд.
KamiRoninДата: Понедельник, 14 Января 2013, 22:37 | Сообщение # 14
почти ветеран
Сейчас нет на сайте
Цитата (EchoIT)
ответ на вопрос, заданный тобой в заголовке темы


ок, я попробовал это на практике. и вышла ПОЛНАЯ ФИГНЯ.

1. PixelInset - это настройки размещения GUITextur'ы в пространстве гуя. ок, с этим разобрались. содержит он позицию Х, У --- ВЬЮПОРТА в котором и отображается гуйтекстура.
2. в твоем примере позиция объекта над которым мне нужно нарисовать В GUI (т.е. во вьюпорте камеры) преобразовывается функцией wordtoSCREEENpoint - т.е. вместо координат в рамках вьюпорта (-1..1) - мы получили координаты скрина (0..1980..) .. что привело к выводу текстуры за пределы видимого поля.

ну и где ответ на заданный мною в заголовке вопрос?!?!

да, если поменять там поменять на wordToViewPoint ещё что то и получается..

готов учиться - смотреть варианты полного скрипта

Добавлено (14.01.2013, 21:08)
---------------------------------------------
Цитата (seaman)
У Вас в кадре сразу 500 объектов с надписями

у меня в сцене 500 объектов. вешать плашку и включать рендер - придется программно. шило на мыло получается.
и ЕЩЁ РАЗ - такой вариант можно рассмотреть в ОТДЕЛЬНОЙ теме, ок?! wink

Добавлено (14.01.2013, 22:37)
---------------------------------------------
по поводу #14
Если создаем из префаба гуитекстуру - то у ней координаты SCREENpoint, если вставляем на прямую - Viewpoint. sad
так что сорри, там остается код как EchoIT указал! лично ему ещё раз спасибо.. жаль сразу не разобрался.

итог по поводу pixelInset - это просто способ разместить за одну строку текстуру где то на экране.
преобразование точки привязки в 3Д объекта к нужной системе координат там тоже верно (для префаба/Instantiate).

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


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Понедельник, 14 Января 2013, 22:28
seamanДата: Понедельник, 14 Января 2013, 23:25 | Сообщение # 15
старожил
Сейчас нет на сайте
Цитата
включать рендер - придется программно

Код
void OnBecameVisible() {renderer.enabled = true;}
void OnBecameInvisible() {renderer.enabled  = false;)

Неужели это так сложно? Две то строчки кода?
Отредактировал названия функций.


Сообщение отредактировал seaman - Понедельник, 14 Января 2013, 23:31
SnakeRДата: Вторник, 15 Января 2013, 01:26 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
KamiRonin, Вы себе устраиваете геморой на ровном месте happy
Даже если получится написать расчет всех смещений и т.п. фигню, то это будет жрать производительность гораздо больше чем самая обычная плашка и с 10-20 строчек кода для управления ими всеми.
Я вот пол дня думал и так и не смог понять зачем создавать себе такие проблемы)


Unity3D Developer
Ваш лучший помощник при разработке в Unity3D
KamiRoninДата: Вторник, 15 Января 2013, 10:01 | Сообщение # 17
почти ветеран
Сейчас нет на сайте
Цитата (SnakeR)
Даже если получится написать расчет всех смещений и т.п. фигню, то это будет жрать производительность гораздо больше чем самая обычная плашка и с 10-20 строчек кода для управления ими всеми.


ага, лучше залипухи лепить на коленке лишь бы попонятнее было.. попривычнее.
да и откуда ты знаешь что будет "гораздо больше"?!? с какой пальмы упала такая информация?!?!

расчет смещений - простая математика .. в одной из найденных мной ссылок она есть - скрипт на С++ занимает 4 строки. Просто перевести его не могу - две причины: аналогов в Unity не нашел и с алгеброй матриц у меня напряги... никаких особых "жрать производительностей" там не ожидается а результат будет - просто такой как должен быть в нормальной игре - гладкий, цивильный и правильный.

кто хочет добиться то ищет способы, а кто не хочет - причины...

Добавлено (15.01.2013, 10:01)
---------------------------------------------

Цитата (seaman)
Неужели это так сложно? Две то строчки кода?


мда.. видать про то что это другая тема - ты пропустил..

ок. специально для тебя - чтобы включать или выключать рендер - нужны ещё несколько строк кода - определять когда его включать и выключать.
и ещё раз - в моей игре будет очень много предметов к которым будет прилагаться визуальная вывеска - представь толпу зомби штук 30-100 скелетно-анимированных высокотекстурированных персов и над каждым - вывеска - с health'ом, агрессий и тп. и все эти вывески - 3Дшные шейдерные текстуры, плюс включаются и выключаются от удаленности, плюс меняются от попадания пуль.. утежелять игру только потому что ты не понимаешь слов "ЭТО, #%^@#, ДРУГАЯ ТЕМА!!" я не могу, понимаешь?!?! а?! ты умный парень! я уверен понимаешь! wink


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
IIyxMASTERДата: Вторник, 15 Января 2013, 11:01 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
Цитата (KamiRonin)
и ещё раз - в моей игре будет очень много предметов к которым будет прилагаться визуальная вывеска - представь толпу зомби штук 30-100 скелетно-анимированных высокотекстурированных персов и над каждым - вывеска - с health'ом, агрессий и тп. и все эти вывески - 3Дшные шейдерные текстуры, плюс включаются и выключаются от удаленности, плюс меняются от попадания пуль.. утежелять игру только потому что ты не понимаешь слов "ЭТО, #%^@#, ДРУГАЯ ТЕМА!!" я не могу, понимаешь?!?! а?! ты умный парень! я уверен понимаешь!

У вас лять сотня анимированных мобов. СОТНЯ. А вы тут из за гребанных табличек устроили. Сто табличек над головой это 1 drawcall и 200 полигонов на все про все. 1 ваш моб сожрет в десять раз больше ресурсов, чем 100 табличек. Вы явно не видите узких мест. 100 текстур выведенных через стандартный гуй юнити - уже 100 drawcall, в сотню раз больше чем при использовании плашек.
Поворот таблички - 1 строчка кода(хотя какого хрена вы производительность кода измеряете его объемом?)
Выключение:Включение таблички - еще пара строчек.
И далеко не факт, что матричный рассчет видимости 100 мобов обойдется вам дешевле, чем поворот плашки.
Серьезно, вы как тот гражданин с юнити3д, который искренне волновался наносекундной разнице в производительности между циклами for и foreach


Сообщение отредактировал IIyxMASTER - Вторник, 15 Января 2013, 11:09
KamiRoninДата: Вторник, 15 Января 2013, 12:05 | Сообщение # 19
почти ветеран
Сейчас нет на сайте
Цитата (IIyxMASTER)
100 мобов


ДРУ-ГА-Я ТЕМА! ВНЯТНО?!? ДР-У-ГА-Я!!!!!!!!!

Это как если бы я спросил - как сделать суши? А мне в ответ - "зачем вам суши? вы хотите кушать? есть таки чудная кура и совсем не дорого! а с суши в три раза больше возни да и опасно это! давайте я научу вас делать куру! итак берете ..."!!!!!!
Я просто хочу уметь делать суши! Хочу именно их. Не курицу, не круасаны, а именно суши. ЧТО?! Что тут не понятного?! Почему вместо конструктивных предложений по изготовлению суши со мной спорят - хотеть их или не хотеть, готовить или не готовить, интересно это или нет?! Просто - есть рецепт - выкладываем. Нет - можно перелистнуть страницу!

Я вообще хочу заменить GUI ВЕСЬ! Чтобы на экран выдавались 2Д изображения по моему желанию и да, без лишних drawcall'ов! Мне нужно динамическое GUI - в котором есть мерцание, блендинг, рисование линий от объекта к картинке в 2Д и чтобы это все было привязано к 3Д миру, накладывалось и ПРАВИЛЬНО с ним взаимодействовало!!
Это есть во многих играх. И я был уверен что кому то тут это известно - как это сделано. Но вместо этого лять упорство в уводе куда то к себе!! НАФИГА?!
Просто я начал с этого - расположите 2Д текстуру точно над объектом без особых затрат, динамически смещайте её так чтобы это было внятно и все. Но. Это просто начало. Мне нужен динамический HUD-GUI с прямым (!!!) и правильным (!!!) взаимодействием с 3Д сценой и объектами в ней, да, без лишнего drawcall'а. ок?!

Добавлено (15.01.2013, 12:05)
---------------------------------------------
IIyxMASTER,
я предлагаю Вам создать полностью рабочий пример на 3Д плашках - с размещением, вкл/выкл при удалении (или уменьшении размера в зависимости от приближения-удаления, т.к. есть необходимость показывать это сквозь 3Д объекты как цель для мува персонажа по улицам), со сменой или изменением текстуры (уменьшение полоски жизни на плашке).

и дать на него ссылку - "альтернативный способ вывода health'а над 3Д объектом" - я буду рад иметь её в этой теме.

если вы не хотите даром делать лишние движения - скажите, я всю черновую работу сделаю сам. с вас будут только скрипты - поворот, показ-скрытие, позиционирование, изменение. я с удовольствием поучаствую в меру своих сил.

это конструктивно?!


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.


Сообщение отредактировал KamiRonin - Вторник, 15 Января 2013, 12:07
seamanДата: Вторник, 15 Января 2013, 12:06 | Сообщение # 20
старожил
Сейчас нет на сайте
Цитата
нужны ещё несколько строк кода - определять когда его включать и выключать

Специально для тебя - ничего дополнительного не надо. Почитай хотя бы мануал по функциям приведенным мной выше.
Цитата
на экран выдавались 2Д изображения по моему желанию и да, без лишних drawcall'ов! ... я был уверен что кому то тут это известно - как это сделано.

Известно, конечно. Только Вы упорно не видите что Вам уже неделю это пытаются втолковать.
ЭТО делается плашками! Атласами текстур (чтоб был один материал - один драукол).
Но если Вы хотите гемор с встроенным ГУИ - пожалуйста - разбирайтесь.
Извините за попытку наставить на путь истинный. Больше мешать не буду.
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Как рисовать в GUI изображение - точно над объектом 3D мира? (как значки флага над бойцом в Call of Duty MF)
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг