|
3D-программирование Вопросы, касающиеся программирования 3D мира |
23.11.2006, 13:15
|
#1
|
ПроЭктировщик
Регистрация: 23.11.2006
Сообщений: 130
Написано 3 полезных сообщений (для 35 пользователей)
|
Вывод названий элементов загруженной модели
Доброе время суток, господа!
У меня появилась следующая проблема. Есть один 3ds (или .х или любой другой файл - непринципиально) содержащий в себе n-ое (большое) количество 3д элементов (например кубы, сферы или более сложные) с разными именами. Могу ли я с помощью пика мышкой получить исходное название элемента с цель последующего вывода присвоенного ему какого обозначения из базы (если энтити наме x then текст - "это объект X")
У меня выборка почему то поэлементно не пашет Чтото я не догоняю...
Если можно - то с примером.
|
(Offline)
|
|
23.11.2006, 15:21
|
#2
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Re: Вывод названий элементов загруженной модели
m=LoadAnimMesh(patch$)
PickModeMesh(m,2)
....
В цикле:
If MouseHit(1)
ent=CameraPick(camera,mouseX(),MouseY())
If ent
name$=EntityName(ent)
EndIf
EndIf
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
|
Только пообзывай объекты в максе перед экспортом
__________________
|
(Offline)
|
|
24.11.2006, 12:21
|
#3
|
ПроЭктировщик
Регистрация: 23.11.2006
Сообщений: 130
Написано 3 полезных сообщений (для 35 пользователей)
|
Re: Вывод названий элементов загруженной модели
Только пообзывай объекты в максе перед экспортом
|
это ессно - я выше указывал что названия как раз разные давал.
Блин вот в чем была фундаментальная загвоздка - в принципе моя идея была похожа - только не такая лаконичная и простая , но грузил loadmesh! Воистину, tormoz, вы второй раз Шикарнейшим образом помогаете мне - красиво и грамотно. Спасибо большое!!!
На сколько я понял только в таком варианте(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
Буду благодарен за помощь...
|
(Offline)
|
|
04.12.2006, 03:04
|
#4
|
ПроЭктировщик
Регистрация: 23.11.2006
Сообщений: 130
Написано 3 полезных сообщений (для 35 пользователей)
|
Re: Вывод названий элементов загруженной модели
1. энтити альфа приказала долго жить, как и энтитиколор, амбиэнтколор... да и вообще освещение перестало влиять на модель...
|
сделал через
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. и еще как лучше оформить список сейчас - так как моделей всего десяток пишу в цикле чтото вроде -
if name$="LAD_18" Then
name$="выбран LAD_18"
EndIf
|
сделал через name$ = Replace$(name$,"LAD_","объект - LAD номер - ") странно я вообще не помнил такую комманду раньше =) а то пытался посимвольно анализировать стороку и т.п. А все оказалось так просто...
как обычно - 2 вопроса
1. Если использовать эту альфу - то объект один раз выделенный (тоесть пока пикаем на нем) становится полупрозрачным навсегда. Как либо можно его в исходное состояние?
2. появилась идея выбранный чайлд выводить отдельно в окно второй камеры (классический пример - наводим на элемент - выезжает панелька/окошко в котором появляется только(!) сей объект, например в "проволочном виде" отделенный от всего остального ентити и крутится например) Никто не поделится общей идеей как это реализовать?
|
(Offline)
|
|
04.12.2006, 08:59
|
#5
|
|
Re: Вывод названий элементов загруженной модели
1) у тебя в EntityAnimAlpha второй параметр не юзается
|
|
|
05.12.2006, 01:40
|
#6
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Вывод названий элементов загруженной модели
Сообщение от Chuma
1. Если использовать эту альфу - то объект один раз выделенный (тоесть пока пикаем на нем) становится полупрозрачным навсегда. Как либо можно его в исходное состояние?
|
Думаю так:
oent=ent
ent=CameraPick(camera,mouseX(),MouseY())
if oent<>ent then entityalpha oent,1
Сообщение от Chuma
2. появилась идея выбранный чайлд выводить отдельно в окно второй камеры (классический пример - наводим на элемент - выезжает панелька/окошко в котором появляется только(!) сей объект, например в "проволочном виде" отделенный от всего остального ентити и крутится например) Никто не поделится общей идеей как это реализовать?
|
Создаем две камеры одну на весь экран, другую маленькую, маленькую
[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]
З.Ы. Писалось в браузере поэтому ХЗ.
|
(Offline)
|
|
05.12.2006, 02:40
|
#7
|
ПроЭктировщик
Регистрация: 23.11.2006
Сообщений: 130
Написано 3 полезных сообщений (для 35 пользователей)
|
Re: Вывод названий элементов загруженной модели
jimonточнее так
EntityAnimAlpha(ent,0.8 )
Function EntityAnimAlpha(m,a#)
If EntityClass$(m)="Mesh"
EntityAlpha m,a#
EndIf
For i=1 To CountChildren(m)
ww=GetChild(m,i)
EntityAnimAlpha(ww,1)
Next
End Function
|
HolyDel попробую-отпишусь спасибо большое
|
(Offline)
|
|
05.12.2006, 16:03
|
#8
|
ПроЭктировщик
Регистрация: 23.11.2006
Сообщений: 130
Написано 3 полезных сообщений (для 35 пользователей)
|
Re: Вывод названий элементов загруженной модели
Сообщение от HolyDel
Думаю так:
oent=ent
ent=CameraPick(camera,mouseX(),MouseY())
if oent<>ent then entityalpha oent,1
|
так и не понял куда вставлять,
вот мой цикл
[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]
Куда засовывать так и не понял...
Сообщение от HolyDel
Создаем две камеры одну на весь экран, другую маленькую, маленькую
[blitz]
;запихиваем куда нибудь подальше, например
cam2=CreateCamera()
PositionEntity cam2,100000,0,0
;и задаем ей область выода на экран
CAmeraViewport 700,500,100,100
;чтоб было в нижнем правом углу
[/blitz]
|
это понятно спс.
[quote=HolyDel]
там где рендер
[blitz]
;если не показывать модельку
........
endif
[/blitz]
с этим сорри - тоже не разобрался... не затруднит ли поподробнее ? Буду признателен...
|
(Offline)
|
|
06.12.2006, 01:28
|
#9
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
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].
|
(Offline)
|
|
06.12.2006, 01:29
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
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]
|
(Offline)
|
|
06.12.2006, 15:08
|
#11
|
ПроЭктировщик
Регистрация: 23.11.2006
Сообщений: 130
Написано 3 полезных сообщений (для 35 пользователей)
|
Re: Вывод названий элементов загруженной модели
Сообщение от HolyDel
с камерой будет сложно писать конкретный пример, без возможности его отладки, будет исходник (с моделькой), посмотрю.
или крепи его сюда или отправь на [email protected]
|
прикладываю!!!
http://www.boolean.name/attachment.p...d=116540326 4
|
(Offline)
|
|
07.12.2006, 02:48
|
#12
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
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(20 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]
|
(Offline)
|
|
08.12.2006, 05:00
|
#13
|
ПроЭктировщик
Регистрация: 23.11.2006
Сообщений: 130
Написано 3 полезных сообщений (для 35 пользователей)
|
Re: Вывод названий элементов загруженной модели
Супер!!! Спасибо огромное!
Все замечательно пашет
а это -
EntityAlpha ent,Abs(Sin(MilliSecs()*2))/2+0.6 - чтоб плавно моргало?? чтото у меня не понеслась EntityAlpha ent,0.6 - поставил.. наверное из за фпс счетчика.
Будет время посмотри как во второую камеру запихнуть еще модель. А то всетаки одного изменения альфы - маловато, наглядности не хватает.
Я пробовал создавать маштабиорванную копию чаилда*1.1 с те ме же координатами (как у тебя сделано) чтоб как то еще выделить текщую модель - но чет пока не получилось.
Там, кстати еще фунция есть (в исходнике)
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
|
она также как и альфа пашет - но если в альфе изначально объекты непрозрачные и их (с твоей помощью =)) легко можно вернуть в исходный вид, то для цвета надо както получить изначальный , потом перекрасить , потом снова в изначадьный. Все объекты разноцветные.
не мог бы ты сказать каким образом можно сделать (но вообще я так думаю надо просто порыться в хелпах)
А вообще спасибо тебе лично и форуму за поддержку - я бы месяц парился!!! Респект комьюнити!
|
(Offline)
|
|
09.12.2006, 01:04
|
#14
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Вывод названий элементов загруженной модели
пжста. Всегда обращайся
00000001) Цвет модели задавался в редакторе (максе там, или исчо где)?
если так то перекрасить в исходный цвет просто - EntityColor D5D3C9,255,255,255. Если цвет задавлся програмно то придется делать так как ты сказал.
00000010) Насчет камеры, теоретически доджно было б работать, но насколько надо отодвинуть модеь чтоб она вошла в камеру, хз.
11111111) Это действительно очень хорошее комьюнити, наверное лучшее.
|
(Offline)
|
|
12.12.2006, 11:42
|
#15
|
ПроЭктировщик
Регистрация: 23.11.2006
Сообщений: 130
Написано 3 полезных сообщений (для 35 пользователей)
|
Re: Вывод названий элементов загруженной модели
более-менее разобрался - а реально ли запросив, точнее введя имя объекта, например "shar 2" (из вышеуказанного аттача) высветить его - нет ли тут каких нить подводных камней?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:04.
|