|
3D-программирование Вопросы, касающиеся программирования 3D мира |
11.10.2011, 20:58
|
#1
|
ПроЭктировщик
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
|
Как сделать в 3ds MAX карту с настроенной физикой и партиклами?
Подскажите пожалуйста, как он так всё заскриптовал http://uart.nxt.ru/ZQCODEDEMO.rar
как мне также сделать, чтобы через 3d max сделал карту для игры, и оп она уже с физикой
и со всеми примочками типа партикли.
|
(Offline)
|
|
11.10.2011, 21:25
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Подскажите пожалуйста
В названии мешей в 3дМаксе пишешь что ты от них хочешь(например эмиттер огня или боди-коробка). А потом расшифровываешь это в блитце и применяешь нужные команды.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.10.2011, 21:33
|
#3
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Подскажите пожалуйста
Используй тэги в названиях объектов.
Function CheckTag$(var$,tag$)
Local tmp_l1,tmp_l2
If Not Instr(var,"["+tag+"]") Then Return "0"
If Not Instr(var,"[/"+tag+"]") Then
Return "1"
Else
tmp_l1 = Instr(var,"["+tag+"]") + Len("["+tag+"]")
tmp_l2 = Instr(var,"[/"+tag+"]") - tmp_l1
Return Mid(var,tmp_l1,tmp_l2)
End If
End Function
Понимает тэги вида [test] (возвращает "0" или "1") и [test]10[/test] (возвращает то, что внутри тэга)
|
(Offline)
|
|
11.10.2011, 21:37
|
#4
|
ПроЭктировщик
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
|
В названии мешей в 3дМаксе пишешь что ты от них хочешь(например эмиттер огня или боди-коробка). А потом расшифровываешь это в блитце и применяешь нужные команды.
|
это я понял, а вот скрипы как сделаны я не понял и как он команды размножает?
Enter_JointBall]Auto]Celind1]Celind2]0]-1]0]
\\
Enter_JointBall]Auto]Celind2]Celind3]0]-1]0]
\\
Enter_JointBall]Auto]Celind3]Celind4]0]-1]0]
как это вообще работает “скрипы”
UPD:
Используй тэги в названиях объектов. что это?
|
(Offline)
|
|
11.10.2011, 21:51
|
#5
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Ответ: Подскажите пожалуйста
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.10.2011, 22:02
|
#6
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Подскажите пожалуйста
Я поясню так (человеческими, детскими понятиями):
Допустим ты в 3ДМаксе нарисовал пол (назвал его Plane)
Добавил 30 шариков (назвал их Ball)
В Blitz3D предоставленным кодом можно, например, закрасить как хочешь.
Ищешь в загруженной модели своей игры:
Plane - закрашиваешь зелёным цветом (это будет пол, земля)
Ищешь все шарики:
Ball - закрашиваешь серым цветом (это будут камни)
Можно также применять текстуры на них. Можно что угодно.
|
Дата рождения:
1 January 1965
Возраст:
46
Хотя я наверное это зря... детскими...
Я хотел вот что спросить.. Входит ли в полномочия модераторов - переименовывать названия тем на более подходящее к вопросу темы?
Или это уже вроде как "нарушение конституционных прав пользователей" или "за каждой темой следить - запаришься"?
|
(Offline)
|
|
11.10.2011, 22:09
|
#7
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Ответ: Подскажите пожалуйста
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
11.10.2011, 22:12
|
#8
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Подскажите пожалуйста
Сообщение от Randomize
|
Ну не знаю.. Каждый ли осилит (с 2мя сообщениями, скорее всего новичок) такое вот:
Рекурсивный пробег по чилдам:
2-3 года назад я бы оXY..
|
(Offline)
|
|
11.10.2011, 22:13
|
#9
|
ПроЭктировщик
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
|
Ответ: Подскажите пожалуйста
То есть мне надо делать так
Function ApplyChild(child)
Local name$=Lower(EntityName(child))
If Instr(name$,"startplaer")>0 Then
filein = ReadFile("startpaer.dat")
x# = ReadFloat( filein )
y# = ReadFloat( filein )
z#= ReadFloat( filein )
PositionEntity plaer,x#,y#,z#
CloseFile( filein )
EndIf
If Instr(name$,"shield")>0 Then
; ставим броню в месте этого чилда
EndIf
If Instr(name$,"enemy")>0 Then
; ставим врага в месте этого чилда
EndIf
End Function
|
(Offline)
|
|
11.10.2011, 22:19
|
#10
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Ответ: Подскажите пожалуйста
Примерно так:
; Тут грузим модель твоего уровня ; Обрати внимание что тут используется LoadAnimMesh ; Если грузить через LoadMesh то у нас весь уровень будет единой моделью, а нам надо другое Global LEVEL = LoadAnimMesh("MyLevel.b3d") ; Наш уровень загружен и теперь можно пробежаться по его кускам (Чилдам) SeekChilds(LEVEL) ; Эта ф-ция перебирает все куски уровня Function SeekChilds(ent) Local i, child For i=1 To CountChildren(ent) child=GetChild(ent,i) If child<>0 If CountChildren(child)>0 Then SeekChilds(child) ; Выполняем операции над чилдом ; То есть вызывается та самая нужная нам ф-ция ApplyChild ; Которая ставит броню, оружие и тд ApplyChild(child) EndIf Next End Function ; Вот сама эта ф-ция Function ApplyChild(child) Local name$=Lower(EntityName(child)) If Instr(name$,"startplaer")>0 Then filein = ReadFile("startpaer.dat") x# = ReadFloat( filein ) y# = ReadFloat( filein ) z# = ReadFloat( filein ) PositionEntity plaer,x#,y#,z# CloseFile( filein ) EndIf If Instr(name$,"shield")>0 Then ; ставим броню в месте этого чилда EndIf If Instr(name$,"enemy")>0 Then ; ставим врага в месте этого чилда EndIf End Function ; Всё это делаем до главного цикла
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.10.2011, 23:15
|
#11
|
Мастер
Регистрация: 27.01.2008
Адрес: Россия, СКФО, ЧР, Грозный
Сообщений: 1,144
Написано 578 полезных сообщений (для 2,207 пользователей)
|
Ответ: Подскажите пожалуйста
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Hurrit за это полезное сообщение:
|
|
12.10.2011, 01:14
|
#12
|
ПроЭктировщик
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
|
Ответ: Как сделать в 3ds MAX карту с настроенной физикой и партиклами?
Конечно же, метод описанный мною выше не является лучшим
|
Как психолог могу сказать, что принижение самооценки присуще всем программистам, что на практике противоречит реальному положению дел.
Hurrit
Я тебя понял, к этому ко всему ещё бы парсер хороший найти на чистом Blitze написанный.
|
(Offline)
|
|
12.10.2011, 07:22
|
#13
|
ПроЭктировщик
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
|
Ответ: Как сделать в 3ds MAX карту с настроенной физикой и партиклами?
Я вижу это вот так:
Type LoadMap
Field ChildMaps
Field ChildName$
End Type
Global Maps
Function LoadMap(Maps_File$)
Maps=LoadAnimMesh(Maps_File$)
For ChildN=1 To CountChildren(Maps)-1
LM.LoadMap=New LoadMap
Getemp=GetChild(Maps,ChildN)
LM\ChildName$=EntityName(Getemp)
LM\ChildMaps=FindChild(Maps,LM\ChildName$)
Next
End Function
Graphics3D 640,480,32,2
SetBuffer BackBuffer()
camera=CreateCamera()
light=CreateLight()
LoadMap("MapsZ4.b3d")
For LM.LoadMap=Each LoadMap
If LM\ChildName$="Celind1_Sfera_Body_0_1"
PositionEntity camera,EntityX(LM\ChildMaps),EntityY(LM\ChildMaps),EntityZ(LM\ChildMaps)-150
EndIf
Next
While Not KeyDown( 1 )
For LM.LoadMap=Each LoadMap
If LM\ChildName$="Celind1_Sfera_Body_0_1"
EntityColor LM\ChildMaps,Rnd(255),0,0
EndIf
Next
RenderWorld
Flip
Wend
End
Карта та же у меня нечем в .b3d конвертировать.
|
(Offline)
|
|
16.10.2011, 11:35
|
#14
|
ПроЭктировщик
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений (для 218 пользователей)
|
Ответ: Как сделать в 3ds MAX карту с настроенной физикой и партиклами?
Пообщавшись с автором выше изложенной демки, я понял, что мало чего понимаю в оптимизации кода, но он дал мне парсер тот самый который он сам использовал в демке.
Function parser$(txt$,index,delim$=" ")
Local search$
Local searched
Local lendelim%
txt$=txt$+delim$
lendelim=Len(delim$)
For i=1 To index
searched=Instr(txt$,delim$)
If searched<>0 Then
If i = index Then
txt$=Mid(txt$,1,searched-1)
Return txt$
Else
txt$=Mid(txt$,searched+lendelim)
EndIf
Else
Return ""
EndIf
Next
End Function
Я его сразу задействовал в своём проекте, вот полный исходный код:
; Graphics3D Example
; ------------------
Global FL_Pitch2#,FL_Yaw2#,FL_Roll2#,FL_XSpeed2#,FL_YSpee d2#,FL_ZSpeed2#,pp1$,aa1,p1$,Trik2$,Forror=1,gRAVI TY#=-1.6
Function FreeLook2(FL_Cam2)
FL_Pitch2#=FL_Pitch2#-(-MouseYSpeed()*0.02) : FL_Pitch2#=FL_Pitch2#/1.2
FL_Yaw2#=FL_Yaw2#+-(MouseXSpeed()*0.02) : FL_Yaw2#=FL_Yaw2#/1.2
MoveMouse (GraphicsWidth()/2,GraphicsHeight()/2)
FL_ZSpeed2#=FL_ZSpeed2#+Float(KeyDown(17)-KeyDown(31))*0.12 : FL_ZSpeed2#=FL_ZSpeed2#/1.14; w & s
FL_XSpeed2#=FL_XSpeed2#+Float(KeyDown(32)-KeyDown(30))*0.12 : FL_XSpeed2#=FL_XSpeed2#/1.14 ; a & d
FL_YSpeed2#=FL_YSpeed2#+Float(KeyDown(19)-KeyDown(33))*0.12 : FL_YSpeed2#=FL_YSpeed2#/1.14 ; r & f
FL_Roll2#=(FL_Yaw2#*1.1)-(FL_XSpeed2#*2.3)
MoveEntity FL_Cam2,FL_XSpeed2#,FL_YSpeed2#+Abs(FL_Roll2#*FL_X Speed2#)/50,FL_ZSpeed2#
Local cp2#=EntityPitch(FL_Cam2,True)+FL_Pitch2#
If cp2<-89 Then cp2=-89
If cp2>89 Then cp2=89
RotateEntity FL_Cam2,cp2,EntityYaw(FL_Cam2)+FL_Yaw2#,FL_Roll2#
End Function
Global fpsindex#, fpstime#, fpsfold_millisecs#, fpsfps#, fpsfold2_Millisecs#
Function fps2#(time=1000)
fpsindex=fpsindex+1
fpstime=fpstime+MilliSecs()-fpsfold_millisecs
If fpstime=>time
fpsfps=fpsindex
fpstime=0
fpsindex=0
EndIf
fpsfold_Millisecs=MilliSecs()
Return fpsfps
End Function
Function parser$(txt$,index,delim$=" ")
Local search$
Local searched
Local lendelim%
txt$=txt$+delim$
lendelim=Len(delim$)
For i=1 To index
searched=Instr(txt$,delim$)
If searched<>0 Then
If i = index Then
txt$=Mid(txt$,1,searched-1)
Return txt$
Else
txt$=Mid(txt$,searched+lendelim)
EndIf
Else
Return ""
EndIf
Next
End Function
Global Maps,delet,deletStart,Start
Type LoadM
Field ChildMaps
Field ChildName$
Field AutoHide$
End Type
Function LoadMap(Maps_File$)
Maps=LoadAnimMesh(Maps_File$)
For ChildN=1 To CountChildren(Maps)
LM.LoadM=New LoadM
Getemp=GetChild(Maps,ChildN)
LM\ChildName$=EntityName(Getemp)
LM\ChildMaps=FindChild(Maps,LM\ChildName$)
LM\AutoHide$=parser(LM\ChildName$,1,".");Âûäèëÿåì òî÷üêè ñòàðòà èç îáùåãî èìåíè ÷èëäà. ÷èëäû äåéñòâèÿ Pick, GizmoBox...
EntityPickMode LM\ChildMaps,2
If LM\AutoHide$="Start" Or LM\AutoHide$="Exid" Or LM\AutoHide$="Pick" Or LM\AutoHide$="GizmoBox" Then HideEntity LM\ChildMaps;Ñêðûâàåì ÷èëäû ñòàðòà è äåéñòâèÿ
If Not Instr(RSet(LM\ChildName$,1),"@")>0 Then Delete LM;Óäàëÿåì èç ñïèñêà ÷èëäîâ íå èñïîëüçóåìûå èìåíà ÷èëäîâ
Next
End Function
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
Global camera=CreateCamera()
light=CreateLight()
MapsStarted$="Testmap.b3d|Start.@|";Ïðîãðàììíûé ñêðèïò
LoadMap(parser(MapsStarted$,1,"|"))
For LM.LoadM=Each LoadM
If Instr(LM\ChildName$,parser(MapsStarted$,2,"|"))>0 Then
PositionEntity camera,EntityX(LM\ChildMaps),EntityY(LM\ChildMaps) +20,EntityZ(LM\ChildMaps)
EndIf
Next
deletStart=1
While Not KeyDown( 1 )
FreeLook2(camera)
Mouse_Hit1=MouseHit(1)
pick=CameraPick(camera,MouseX(),MouseY())
For LM.LoadM=Each LoadM
;Îáðàáîòêà ïðîãðàììíîãî ñêðèïòà
If Instr(LM\ChildName$,"Pick.DoorLabEnt@")>0
If PickedEntity()=LM\ChildMaps And Mouse_Hit1
MapsStarted$="Testmap2.b3d|Start.Lab@|"
delet=1
EndIf
EndIf
If Instr(LM\ChildName$,"Pick.DoorLab@")>0
If PickedEntity()=LM\ChildMaps And Mouse_Hit1
MapsStarted$="Testmap.b3d|Exid.Lab@|"
delet=1
EndIf
EndIf
If Instr(LM\ChildName$,"Pick.DoorLab1@")>0
If PickedEntity()=LM\ChildMaps And Mouse_Hit1
MapsStarted$="Testmap.b3d|Start.|"
delet=1
EndIf
EndIf
Next
If Start=1
LoadMap(parser(MapsStarted$,1,"|"))
For LM.LoadM=Each LoadM
If Instr(LM\ChildName$,parser(MapsStarted$,2,"|"))>0 Then
PositionEntity camera,EntityX(LM\ChildMaps),EntityY(LM\ChildMaps) +20,EntityZ(LM\ChildMaps)
EndIf
Next
deletStart=1
Start=0
EndIf
For LM.LoadM=Each LoadM
If Instr(LM\AutoHide$,"Pick")>0
;EntityAlpha LM\ChildMaps,0
Dis#=EntityDistance(camera,LM\ChildMaps)
If Dis#<9
ShowEntity LM\ChildMaps
Else
HideEntity LM\ChildMaps
EndIf
EndIf
Next
If deletStart=1
For LM.LoadM=Each LoadM
If LM\AutoHide$="Start" Or LM\AutoHide$="Exid" Then Delete LM;Óäàëÿåì èç ñïèñêà èìåíà òî÷åê ñòàðòà, ïîñëå ñòàðòà îíè íàì áîëüøå íå íóæíû!
Next
deletStart=0
EndIf
If delet=1 ;Óäàëÿåì âñ¸ ïåðåä çàãðóçêîé ñëåäóþùåé êàðòû
For LM.LoadM=Each LoadM
Delete LM
Delete Each LoadM
Next
FreeEntity Maps
Start=1
delet=0
EndIf
UpdateWorld()
RenderWorld()
;For LM.LoadM=Each LoadM
;Print LM\ChildName$
;Next
Text 0,0,"Current FPS: "+fps2#(1000)
Flip
Wend
For LM.LoadM=Each LoadM
Delete LM
Delete Each LoadM
Next
FreeEntity Maps
End
Если я буду делать так переход с карты на карту, это будет правильно?
или лучше использовать команды Handle() и Object ну типа
If Mouse_Hit1 Then
CurrObj=Object.LoadM(EntityName(pick))
If PickedEntity()=CurrObj\ChildMaps And Mouse_Hit1
MapsStarted$="Testmap2.b3d|Start.Lab@|"
delet=1
EndIf
EndIf
Вот для наглядности с тест картами, подлетаем к двери, кликаем по кваду, переходим.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:23.
|