![]() |
Вывод названий элементов загруженной модели
Доброе время суток, господа!
У меня появилась следующая проблема. Есть один 3ds (или .х или любой другой файл - непринципиально) содержащий в себе n-ое (большое) количество 3д элементов (например кубы, сферы или более сложные) с разными именами. Могу ли я с помощью пика мышкой получить исходное название элемента с цель последующего вывода присвоенного ему какого обозначения из базы (если энтити наме x then текст - "это объект X") У меня выборка почему то поэлементно не пашет :''(( Чтото я не догоняю... Если можно - то с примером. |
Re: Вывод названий элементов загруженной модели
Цитата:
|
Re: Вывод названий элементов загруженной модели
Цитата:
Цитата:
На сколько я понял только в таком варианте(LoadAnimMesh) можно нормально искать чаилды? Сразу правда вылезло 2 проблемы 1. энтити альфа приказала долго жить, как и энтитиколор, амбиэнтколор... да и вообще освещение перестало влиять на модель... На сколько я понял теперь необходимо полупрозрачность и цвет задавать только в максе изначально? Потому как я придполагаю что можно задавать цвет конкретному чаилдентити, например для его подсветки при наведении камеры (кстати как, если не сложно?), но раскрашивать в программе все 200 элементов довольно сложно. 2. и еще как лучше оформить список сейчас - так как моделей всего десяток пишу в цикле чтото вроде - if name$="LAD_18" Then name$="выбран LAD_18" EndIf If name$="LAD_20" Then name$="выбран LAD_20" EndIf If name$="LAD_22" Then name$="выбран LAD_22" EndIf UpdateWorld RenderWorld Text 40,40,name$ Flip Буду благодарен за помощь... |
Re: Вывод названий элементов загруженной модели
Цитата:
Function EntityAnimAlpha(m,a#) If EntityClass$(m)="Mesh" EntityAlpha m,1 EndIf For i=1 To CountChildren(m) ww=GetChild(m,i) If CountChildren(m)>0 EntityAnimAlpha(ww,1) EndIf Next End Function Цитата:
как обычно - 2 вопроса 1. Если использовать эту альфу - то объект один раз выделенный (тоесть пока пикаем на нем) становится полупрозрачным навсегда. Как либо можно его в исходное состояние? 2. появилась идея выбранный чайлд выводить отдельно в окно второй камеры (классический пример - наводим на элемент - выезжает панелька/окошко в котором появляется только(!) сей объект, например в "проволочном виде" отделенный от всего остального ентити и крутится например) Никто не поделится общей идеей как это реализовать? |
Re: Вывод названий элементов загруженной модели
1) у тебя в EntityAnimAlpha второй параметр не юзается
|
Re: Вывод названий элементов загруженной модели
Цитата:
oent=ent ent=CameraPick(camera,mouseX(),MouseY()) if oent<>ent then entityalpha oent,1 Цитата:
[blitz] ;запихиваем куда нибудь подальше, например EntityPosition cam2,100000,0,0 ;и задаем ей область выода на экран CAmeraViewport 700,500,100,100 ;чтоб было в нижнем правом углу [/blitz] там где рендер [blitz] ;если не показывать модельку if showmodel=0 ;собсно рендер Wireframe 0 CameraProjmode cam2,0 RenderWorld ; убираем копию, если она была if copymodel<>0 then freeentity copymodel:copymodel=0 else ;если копии небыло, то делаем if copymodel=0 copymodel=copyentity(ent) positionentity copymodel,100000,0,-10 endif ;рендерим мир, предварительно отрубив мелкую камеру wireframe 0 CameraPrroMOde cam2,0 RenderWorld ;крутим модель turnentity copymodel,1,0,0.2 ;врубаем мелкую, отрубаем основную CameraProjMOde cam2,1 CamerProjMOde cam,0 Wireframe 1 RenderWorld CameraProjMode cam,1 endif [/blitz] З.Ы. Писалось в браузере поэтому ХЗ. |
Re: Вывод названий элементов загруженной модели
jimonточнее так
Цитата:
|
Re: Вывод названий элементов загруженной модели
Цитата:
вот мой цикл [blitz] PickModeMesh(sp,2) While Not KeyHit(1) If MouseHit(1) ent=CameraPick(camera,MouseX(),MouseY()) If ent name$=EntityName(ent) EntityAnimAlpha(ent,0.8 ); функция в предыдущем моем посте EndIf If KeyDown(200) Then ... управление камерой короче If KeyDown(205) TurnEntity player,0,-1,0 UpdateWorld RenderWorld Text 40,40,name$ Flip Wend End [/blitz] Куда засовывать так и не понял... Цитата:
[quote=HolyDel] там где рендер [blitz] ;если не показывать модельку ........ endif [/blitz] с этим сорри - тоже не разобрался... не затруднит ли поподробнее ? Буду признателен... |
Re: Вывод названий элементов загруженной модели
лутче б ты прикрепил архив с исходником (если он небольшой).
так х.з. опять пишу в браузере (не в блитзе, не в протеане), опять могут быть ощибки. [blitz] перед while oent=0; на всякий случай If MouseHit(1) ent=CameraPick(camera,MouseX(),MouseY()) If ent name$=EntityName(ent) if oent<>ent and oent<>0 then EntityAnimAlpha(ent,1) EntityAnimAlpha(ent,0.8 ); функция в предыдущем моем посте oent=ent endif EndIf [/blitz] с камерой будет сложно писать конкретный пример, без возможности его отладки, будет исходник (с моделькой), посмотрю. или крепи его сюда или отправь на mailto:[email protected]. |
Re: Вывод названий элементов загруженной модели
лутче б ты прикрепил архив с исходником (если он небольшой).
так х.з. опять пишу в браузере (не в блитзе, не в протеане), опять могут быть ощибки. [blitz] перед while oent=0; на всякий случай If MouseHit(1) ent=CameraPick(camera,MouseX(),MouseY()) If ent name$=EntityName(ent) if oent<>ent and oent<>0 then EntityAnimAlpha(ent,1) EntityAnimAlpha(ent,0.8 ); функция в предыдущем моем посте oent=ent endif EndIf [/blitz] с камерой будет сложно писать конкретный пример, без возможности его отладки, будет исходник (с моделькой), посмотрю. или крепи его сюда или отправь на [email protected] |
Re: Вывод названий элементов загруженной модели
Вложений: 2
Цитата:
http://www.boolean.name/attachment.p...d=116540326 4 |
Re: Вывод названий элементов загруженной модели
вот, с альфой разобрался, с камерой лажа какая-то, может позже разберусь (если разьерусь вообще)
[blitz] Graphics3D 800,600,16,1 SetBuffer=BackBuffer() ;-globals- Global fntArial, fntA Global camera=CreateCamera() ; create camera (!!!) cam2=CreateCamera() PositionEntity cam2,-100000,0,0 CameraViewport cam2,0,500,100,100 AmbientLight 226,225,226 ;общий свет ;создаем эээ... машинку Global player=CreateCube() ; create simple player MoveEntity player,0,0,0 EntityType player,type_camera EntityAlpha player,0 EntityRadius player,10,2 ; грузим шрифты fntArial=LoadFont("Arial cyr",20) ;главная модель sp =LoadAnimMesh("21.3ds") PositionEntity sp,0,-5,-5 ScaleEntity sp,0.0001,0.0001,0.0001 EntityColor sp,255,255,255 MoveEntity sp,-260,-20,150 PickModeMesh(sp,2) ;юзаем пикентити HidePointer ;прячем мышку SetBuffer BackBuffer() oent=0 While Not KeyHit(1) ; If MouseHit(1) ; Отрубить если отрубить клик мыши ent=CameraPick(camera,MouseX(),MouseY()) If oent<>ent And oent<>0 Then EntityAnimAlpha(oent,1) If ent If showmodel=0 Then showmodel=CopyEntity(ent) name$=EntityName(ent) ;EntityAnimAlpha(ent,Abs(Sin(MilliSecs()*2))/2+0.6) EntityAlpha ent,Abs(Sin(MilliSecs()*2))/2+0.6 Else If showmodel<>0 Then FreeEntity showmodel:showmodel=0 EndIf oent=ent If KeyDown(200) Then MoveEntity player,0,0,.2 End If If KeyDown(208) Then MoveEntity player,0,0,-.2 End If If KeyDown(203) TurnEntity player,0,1,0 If KeyDown(205) TurnEntity player,0,-1,0 SuperCam(camera,player,.02,18,4,40,2) SetCameraFOV(Camera, 100) ;SuperCam(camera,player,.02,18,4,40,2) SetCameraFOV(Cam2, 100) UpdateWorld If showmodel=0 CameraProjMode cam2,0 CameraProjMode camera,1 RenderWorld Else CameraClsColor cam2,Rnd(40),0,0 CameraProjMode cam2,1 CameraProjMode camera,1 PositionEntity showmodel,-100000,0,-150 TurnEntity showmodel,1,0,0.1 EntityAlpha showmodel,1 PointEntity cam2,showmodel RenderWorld EndIf SetFont fntArial If Not name$="" Color 32,32,32 OutlineText mx+20,my,"объект: "+name$ Color 255,255,255 Text mx+20,my,"объект: "+name$ EndIf ;; курсор мыши mx=MouseX() my=MouseY() Color 32,32,32 For tx=-1 To 1 For ty=-1 To 1 Line mx+tx,my+ty,mx+6+tx,my+6+ty Line mx+tx,my+ty,mx+tx,my+8+ty Next Next Color 255,255,255 Line mx,my,mx+6,my+6 Line mx,my,mx,my+8 ; скриншоты If KeyDown (59) SaveBuffer FrontBuffer (), "grab" + grab + ".bmp" grab = grab + 1 EndIf Flip Wend End FreeFont fntArial FreeFont fntA Function SetCameraFOV(Camera, FOV#) CameraZoom Camera, 1.0 / Tan(FOV#/2.0) End Function Function SuperCam(cam,ent,cspeed#,dist#,hite#,xrot#,tilt#) TFormPoint 0,hite#,-dist#,ent,0 cx#=(TFormedX()-EntityX(cam))*cspeed# cy#=(TFormedY()-EntityY(cam))*cspeed# cz#=(TFormedZ()-EntityZ(cam))*cspeed# TranslateEntity cam,cx,cy,cz PointEntity cam,ent RotateEntity cam,xrot#,EntityYaw(cam),tilt# End Function Function PickModeMesh(entity,t_ype) For i=1 To CountChildren(entity) child=GetChild(entity,i) EntityPickMode child,t_ype If CountChildren(child)>0 PickModeMesh(child,t_ype) EndIf Next End Function Function EntityAnimColor(m,r,g,b) If EntityClass$(m)="Mesh" EntityColor m,r,200,b EndIf For i=1 To CountChildren(m) ww=GetChild(m,i) EntityAnimColor(ww,r,200,b) Next End Function Function EntityAnimAlpha(m,a#) If EntityClass$(m)="Mesh" EntityAlpha m,a# EndIf For i=1 To CountChildren(m) ww=GetChild(m,i) EntityAnimAlpha(ww,a#) Next End Function Function OutlineText(TextX,TextY,TextTxt$,TextCenter=False, TextVertical=False) For tx=-1 To 1 For ty=-1 To 1 Text TextX+tx,TextY+ty,TextTxt$,TextCenter,TextVertical Next Next End Function [/blitz] |
Re: Вывод названий элементов загруженной модели
Супер!!! Спасибо огромное!
Все замечательно пашет а это - EntityAlpha ent,Abs(Sin(MilliSecs()*2))/2+0.6 - чтоб плавно моргало?? чтото у меня не понеслась EntityAlpha ent,0.6 - поставил.. наверное из за фпс счетчика. Будет время посмотри как во второую камеру запихнуть еще модель. А то всетаки одного изменения альфы - маловато, наглядности не хватает. Я пробовал создавать маштабиорванную копию чаилда*1.1 с те ме же координатами (как у тебя сделано) чтоб как то еще выделить текщую модель - но чет пока не получилось. Там, кстати еще фунция есть (в исходнике) Цитата:
не мог бы ты сказать каким образом можно сделать (но вообще я так думаю надо просто порыться в хелпах) А вообще спасибо тебе лично и форуму за поддержку - я бы месяц парился!!! Респект комьюнити! |
Re: Вывод названий элементов загруженной модели
пжста. Всегда обращайся ;)
00000001) Цвет модели задавался в редакторе (максе там, или исчо где)? если так то перекрасить в исходный цвет просто - EntityColor D5D3C9,255,255,255. Если цвет задавлся програмно то придется делать так как ты сказал. 00000010) Насчет камеры, теоретически доджно было б работать, но насколько надо отодвинуть модеь чтоб она вошла в камеру, хз. 11111111) Это действительно очень хорошее комьюнити, наверное лучшее. |
Re: Вывод названий элементов загруженной модели
более-менее разобрался - а реально ли запросив, точнее введя имя объекта, например "shar 2" (из вышеуказанного аттача) высветить его - нет ли тут каких нить подводных камней?
|
Re: Вывод названий элементов загруженной модели
я думаю надо делать через списки. типа:
type my_element field ent end type ================================================= Function PickModeMesh(entity,t_ype) For i=1 To CountChildren(entity) child=GetChild(entity,i) me.my_element=new my_element me/ent=child EntityPickMode child,t_ype If CountChildren(child)>0 PickModeMesh(child,t_ype) EndIf Next End Function ================================================== === name$=input("ddtlbnt ccasf:") for me.my_element=each my_element if lower(entityname(me\ent))=lower(name$) then // ета часть выбрана next |
Re: Вывод названий элементов загруженной модели
сенкс огромный - попробую...
только попозже, работы много. Обязательно отпишусь - а вообще HolyDel, огромный тебе респект. Ибо, увы, мой мозг, наверное, уже просто не воспринимает ни понятие типа ни простейшие логические операции. Пытаюсь въехать уже в готовый код - очень со скрипом получается, молодежи как то смотрю попроще. |
Re: Вывод названий элементов загруженной модели
Я абсолютно дико извиняюсь =)
Но опять вопрос, очень надеюсь на помощь. Вернее 2 вопроса. Ибо наконец удалось из предыдущего поста HolyDel'а найти второй элемент второй камерой - парился всю ночь (EntityInView(showmodel,cam2) - помог найти пропажу) - только вот надо этот мех как-то привязывать ко второй камере по ее центру - а то каждая выбранная ентити появляется в разных ее углах. Можно ли камеру другим способом "привязать" к этому элементу (посадить в центр экрана, на строго определенном расстоянии - просто попытки подгона вручную координат увы ничего не дали) Объект перемещается относительно каких то своих координат так? 2-й вопрос по поводу поиска: при выборе нормального эл-та - вылетает...расположил код так - Цитата:
Цитата:
в цикле - if keyhit(57) then Цитата:
а вот с этой частью полный тупняк - пробую сделать ентити выделенным - вылет с ненайденым... Цитата:
|
Re: Вывод названий элементов загруженной модели
А че с ней зделать то нада. указатель на ентити есть, далее с етой ентити можете делать че захотите. Можно еще добавить поле selected и присаввать ему еденичку, а потом перебирать все елементы списка и когда найден выбранный заставить его моргать, хотя тогда будут проблемы с выделением мышью, короче, чтоб работало и то и то придется делать глобальную перестройку кода, если скините новую версию (архив) посмотрю.
|
Re: Вывод названий элементов загруженной модели
Цитата:
Исходные данные. Итак есть модель, содержащая кучу элементов (более сотни), ну.. например, игровая карта а-ля варкрафт... ну или фалаут... или ГТА1-2 или да все что угодно. Все объекты на ней (дома/строения/области) имеют заранее указанные оригинальные названия. текстур пока на элементах нет. Камера тупо летает над картой. Задача. Используя блитц сделать своеобразный вьювер. 1) сделать выбор объекта мышкой (благодаря Вам - готово, объект не мигает (косяк при клике) - но зато выделяется другим цветом, хотя для некоторых элементов не очень наглядно... может флажек рисовать? или в рамочку обводить? ;) ) 2) для большей наглядности создать отдельную камеру2 для показа определенного (выбранного на данный момент) элемента в 3д, причем только его без остальных элементов (просто тупо крутить его перед камерой выводя поверх информацию о объекте - напр. "здание - магазин оружия" или "пещера драконов" - текст вбить по желанию (я просто делаю - при указании на элемент я подменяю его имя заданное в редакторе на "виртуальное" name$ = Replace$(name$,"NOVA_2","<Имперская база - Nova 2!") работает... правда вбивать сотню элементов в код - сурово... А они же еще меняются... ) 3) организовать поиск по элементом с их выделением и передачей во камеру2 и причем камера 1 (основная) должна .... эээ... подъзжать к этому зданию/сооружению (центроваться на ней). тоесть по сути это пункт 2 набранный с клавиатуры. 4) Теоретически еще хотелось бы реализовать текстурирование опр. элементов из общего списка(имеющих например имена - "пещера *" из блитца определенными текстурами) - но это не особо горит... Короче классический пример стратегии или top/down RPG типа Fallout... =) Очень сам их люблю - но попытался ткнутся - оказлось все довольно заморочено. ЗЫ. - Проект ТОЧНО не коммеческий, а чисто любительский =) (мозгов всеравно не хватит) - Я НЕ пытаюсь выехать на чужем горбе - просто поставил себе цель - очень бы хотелось ее реализовать - надоело тупо скатывать и переделывать какието демки и просто менять в них значения, захотелось мааааленький такой проект где есть определенная цель=))) - я тут подумал, что можно использовать например для поэлементного просмотра сложных агрегатов (узлов/движков и т.д.) нарисованных в автокаде/максе. ЗЫЗЫ HolyDel, спасибо еще раз за помощь! СОрцы пошлю позже, но по сути я там ничего после тебя не изменял координально... поиск не прикрутил.... отмаштабировал только модель да и "нащупал" с грехом пополам второй камерой отдельный меш. Ну там косметика еще - скайбокс, фог, лампочки повесил... |
Re: Вывод названий элементов загруженной модели
HolyDel, выслал исходник тебе на мыло!:-)
посмотри пожалуйста... Если что непонятно - стучись, хотя думаю в основном будет непонятно мне. (комментируй свой код пожалуйста, ибо цель то не просто результат, а его понимание и осознание =))) - а я неоторые фишки не сразу схватываю... Но быстро учусь... |
Re: Вывод названий элементов загруженной модели
собсно:
[blitz] If KeyDown(57) Then name$=Input("Имя объекта:") ;- внимание после нажатия пробела - появляется лишний пробел в строке запроса...АККУРАТНО ИСКАТЬ For me.my_element=Each my_element If Lower(EntityName(me\ent))=Lower(name$) Then ;AmbientLight 16,15,26 ;общий свет ;showmodel=CopyEntity(ent) ;не пашет ... =( If oent<>0 And oent<>me\ent Then EntityAnimColor(oent,255,255,255) EntityAnimColor(me\ent,15,205,155) oent=me\ent PlaySound (sndPlayerDie) EndIf Next End If [/blitz] теперь объясню: в циклу перебераем все объекты, если нушелся объект с заданным именем то: 1) развыделяем тот объект, который был выделен 2) выделяем найденый объект 3) запоминаем ссылку на вновь выделенный объект, чтоб его можно было потом развыделить 4) играем звук ;) все. |
Re: Вывод названий элементов загруженной модели
я в шоке. :lol: Ты не поверишь как я тебе благодарен с поиском...
эх всегда говорил что программер - это призвание! Попробую завтра прикрутить. Эх - будешь в питере с меня ... хм.. много чего. эх... посмотрел я на все это... может мне забить на карту аля варик,она загибатся стала - 100000 поликов модель, и никакие фоги не помогут - модель то одна....тормозит. Зато мне тут один конструктор модель двигателя принес автокадовскую - поколдовал над кодом - такое заглядение, каждый узел выделяется - ляпота! может карту родного города слепить? там же одни кубы-хрущевки :). короче как чувствовал - в этом что-то есть. И главное более-менее понятно. Ище вопрос HolyDel, ты вторую камеру относил на 20000 единиц для того чтоб она основную модель не захватывала? Ограничение на дальность как я понял. |
Re: Вывод названий элементов загруженной модели
Спасибо за слова добрые.
насчет модели: попробуй ставить EntityParent child,0 (!!! d gjcktly.. jxthtlm). так удастся разбить одну модель на несколько. и будет работать FOG, хотя 100 к.п. для сцены ето много. насчет камеры: так точно, именно для этого. |
Re: Вывод названий элементов загруженной модели
Поиск пашет - я пищу... Я правда не знаю нафик это мне пока надо - но чтото в этом есть! :lol: до флюшкея вот допер =)
Цитата:
и что должно случится - ну отрубаем мы родителя... гм... фог только на 1 элемент и действует получается? я просто чутка логику потерял... Единственное что возможно это поможет эээ энтитям/дубликатам во вторую камеру иметь одну и ту же координату а не смещатся относительно центра, тоесть так же как они и находятся в исходной позиции... или лучше кидать в центр высчитывая центральную координту ентити.. ну эт я придумаю... аниммеш центровать понял как, а уж обычный тоже придумаю =) |
Re: Вывод названий элементов загруженной модели
Гм.. очередной вопрос -
используя вышеуказанные операции находим ентити... а вот теперь хочу чтобы над ними висел Labelentity или чтою после поиска камера подъезжала к найденому объекту (тоесть названия либо над всеми ентитями в камере, либо над выбраным...) Только вот никак координаты не пойму как находить у oent (выделеной)... классический код я так понимаю чтото вроде ... Function Label3D_Label(camera, entity, label$, offx#=0, offy#=0, offz#=0) ;-; camera - which camera is being used to display the world. ; entity - which entity to draw a label over ; label$ - text to show as the label ; offx# - world X offset position of the center of the label ; offy# - world Y offset position of the center of the label ; offz# - world Z offset position of the center of the label If EntityInView (entity, camera) CameraProject camera, EntityX#(entity, True) +offx#, EntityY#(entity, True) +offy#, EntityZ#(entity, True) +offz# w = StringWidth (label$) h = StringHeight (label$) x = ProjectedX () - (w / 2) - 1 y = ProjectedY () - (h / 2) - 1 Color 0, 0, 0 Rect x, y, w + 2, h + 2, 1 Color 255, 255, 255 Text x, y, label$ EndIf End Function только вот для элементов анимеха он не катит - а мммм... стыдно признаться, я так и не понял даже читая как находим нужный... |
Часовой пояс GMT +4, время: 19:14. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot