Как рисовать в 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) все. задача была бы решена.
но как написать такую проекцию силуэта?! вот в чем вопрос!!!
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал 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) или игрового мира (потом легко преобразовать). как только решим эту проблему - все, будет ИДЕАЛЬНЫЙ скрипт!
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
Сообщение отредактировал KamiRonin - Понедельник, 14 Января 2013, 09:50 |
|
| |
EchoIT | Дата: Понедельник, 14 Января 2013, 13:24 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| Цитата во втором ректе от чего? откуда взял? Width и height - нужные тебе ширина и высота GUI-элемента.
Долгожданный анонсик: 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 элемента Я и не писал, как тебе их получить, я тебе написал ответ на вопрос, заданный тобой в заголовке темы. Если тебе это не нужно, то думай сам.
Долгожданный анонсик: 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 объектов. вешать плашку и включать рендер - придется программно. шило на мыло получается. и ЕЩЁ РАЗ - такой вариант можно рассмотреть в ОТДЕЛЬНОЙ теме, ок?! Добавлено (14.01.2013, 22:37) --------------------------------------------- по поводу #14 Если создаем из префаба гуитекстуру - то у ней координаты SCREENpoint, если вставляем на прямую - Viewpoint. так что сорри, там остается код как 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, Вы себе устраиваете геморой на ровном месте Даже если получится написать расчет всех смещений и т.п. фигню, то это будет жрать производительность гораздо больше чем самая обычная плашка и с 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Дшные шейдерные текстуры, плюс включаются и выключаются от удаленности, плюс меняются от попадания пуль.. утежелять игру только потому что ты не понимаешь слов "ЭТО, #%^@#, ДРУГАЯ ТЕМА!!" я не могу, понимаешь?!?! а?! ты умный парень! я уверен понимаешь!
Мыслю - значит программирую... Конструктивная критика - умных ведет к совершенству... Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
|
|
| |
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'ов! ... я был уверен что кому то тут это известно - как это сделано. Известно, конечно. Только Вы упорно не видите что Вам уже неделю это пытаются втолковать. ЭТО делается плашками! Атласами текстур (чтоб был один материал - один драукол). Но если Вы хотите гемор с встроенным ГУИ - пожалуйста - разбирайтесь. Извините за попытку наставить на путь истинный. Больше мешать не буду.
|
|
| |
|