|
3D-программирование Вопросы, касающиеся программирования 3D мира |
09.12.2005, 10:46
|
#1
|
Бывалый
Регистрация: 22.10.2005
Сообщений: 701
Написано 7 полезных сообщений (для 5 пользователей)
|
Здравстуйте товарищи трудящиеся
Объявляется общий сбор, цель которого помощь в
испровлении ошибок описанного ниже кода.
теперь серьезно:
Помогите с прогой пишу ее для тестирования тура,
чтобы с разных видов смотреть и выявлять ошибки в туре
но как видете ,если уже посмотрели, не очень .
Описание: один игрок двигается, а камеры других игроков
отоброжаются на экране
(код проецирования позаимствован из сампла tex_render.bb)
по типу как в играх RAINBOW SIX,
как сделать чтобы не тормозило.
Graphics3D 640,480,32,2
Global af$
af=LoadFont("arial cyr",18,True)
SetFont af
Global C_ind;номер активной камеры
;ставим объекты
Dim Obj(10)
Dim cam(10)
Global C_Count=3 ;колво объектов
For i=1 To c_count
obj(i)=CreateCube()
cam(i)=CreateCamera (obj(i))
PositionEntity obj(i),i*10,1,0
EntityColor obj(i),Rnd(255),Rnd(255),Rnd(255)
PositionEntity cam(i),0,2,-15
Next
;----------------------------------------
;нарисуем поле в клетачку
grid_tex=CreateTexture( 16,16,8,2 )
ScaleTexture grid_tex,10,10
SetBuffer TextureBuffer( grid_tex )
ClsColor 255,255,255:Cls:ClsColor 0,0,0
Color 192,192,192:Rect 0,0,8,8:Rect 8,8,8,8
SetBuffer BackBuffer()
plane=CreatePlane()
EntityTexture plane,grid_tex
;--------------------------------------
c_ind=2
While Not KeyHit(1)
;устанавливаем номер активной камеры
If KeyDown(59) c_ind=1
If KeyDown(60) c_ind=2
If KeyDown(61) c_ind=3
For i=1 To c_count;переключаем камеры
If i=c_ind ShowEntity cam(c_ind) Else HideEntity cam(i)
Next
If KeyDown( 205 )=True Then TurnEntity obj(c_ind),0,-2,0
If KeyDown( 203 )=True Then TurnEntity obj(c_ind),0,2,0
If KeyDown( 208 )=True Then MoveEntity obj(c_ind),0,0,-0.5
If KeyDown( 200 )=True Then MoveEntity obj(c_ind),0,0,0.5
ScreenCamera c_ind,3,340,0
UpdateWorld
RenderWorld
Text 20,20,c_ind,True,True
Text 320,400,"F1~F3 - переключение между объектами",True,True
Text 320,430,"стрелки - движение",True,True
Flip
Wend
End
Function ScreenCamera(ind,plan_cam,xc,yc)
;Описание: ind -активная камера
; plan_cam- номер камеры которая ваводится о окне
; xc,yc -позиция окна
;
texture=CreateImage( 640,480)
;UpdateWorld
;RenderWorld
HideEntity cam(ind)
ShowEntity cam(plan_cam)
UpdateWorld
RenderWorld
CopyRect 0,0,640,480,0,0,0,ImageBuffer( texture )
ResizeImage texture ,180,120
Cls
ShowEntity cam(ind)
HideEntity cam(plan_cam)
DrawImage texture,xc,yc
Flip
End Function
|
(Offline)
|
|
09.12.2005, 15:19
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
ResizeImage texture ,180,120
это зло
Сразу задай размер изображения для камеры через
CameraViewport camera,x,y,width,height
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
09.12.2005, 16:58
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ну если кортенько, то вот:
Graphics3D 640,480,32,2
Global C_ind=2;номер активной камеры
Type iCamera
Field cam
Field preview_cam
Field obj
End Type
Function Create_iCamera.iCamera(Iparam)
iC.iCamera= New iCamera
iC\obj=CreateCube()
iC\cam=CreateCamera (iC\obj)
iC\preview_cam=CreateCamera (iC\obj)
CameraViewport iC\preview_cam,0,0,180,120
PositionEntity iC\obj,Iparam*10,1,0
EntityColor iC\obj,Rnd(255),Rnd(255),Rnd(255)
PositionEntity iC\cam,0,2,-15
PositionEntity iC\preview_cam,0,2,-15
Return iC
End Function
;ставим объекты
Global Preview_Image=CreateImage(180,120)
Const C_Count=3;колво объектов
Local CMas.iCamera[C_Count]
For i=1 To C_Count
CMas[i]=Create_iCamera(i)
Next
;нарисуем поле в клетачку
grid_tex=CreateTexture( 16,16,8,2 )
ScaleTexture grid_tex,10,10
SetBuffer TextureBuffer( grid_tex )
ClsColor 255,255,255:Cls:ClsColor 0,0,0
Color 192,192,192:Rect 0,0,8,8:Rect 8,8,8,8
plane=CreatePlane()
EntityTexture plane,grid_tex
;--------------------------------------
SetBuffer BackBuffer()
While Not KeyHit(1)
;устанавливаем номер активной камеры
If KeyDown(59) c_ind=1
If KeyDown(60) c_ind=2
If KeyDown(61) c_ind=3
For i=1 To c_count;переключаем камеры
If i=c_ind
CameraProjMode CMas[c_ind]\cam,1
CameraProjMode CMas[c_ind]\preview_cam,1
Else
CameraProjMode CMas[i]\cam,0
CameraProjMode CMas[c_ind]\preview_cam,0
EndIf
Next
ScreenCamera(CMas[c_ind],CMas[3])
RenderWorld
DrawImage Preview_Image,0,0
Flip
Wend
End
Function ScreenCamera(ind.iCamera,plan_cam.iCamera)
;Описание: ind -активная камера
; plan_cam- номер камеры которая ваводится о окне
CameraProjMode ind\cam,0
CameraProjMode plan_cam\preview_cam,1
RenderWorld()
CopyRect 0,0,180,120,0,0,FrontBuffer(),ImageBuffer( Preview_Image )
CameraProjMode ind\cam,1
CameraProjMode plan_cam\preview_cam,0
End Function
Тут ещё бы оптимизацию переключения камер и т.п.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
09.12.2005, 17:01
|
#4
|
Модератор
Регистрация: 13.09.2005
Сообщений: 1,835
Написано 6 полезных сообщений (для 10 пользователей)
|
а разрулил то не плохо!
|
(Offline)
|
|
09.12.2005, 17:54
|
#5
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
мммда, а я хотел через cameraviewport сделать - нифига не получилось.
есть в блице один недостаток, нельзя определить порядок рендера камер, камеры рендерятся в порядке или их создания, или тогда, когда реендерится родительский объект камеры, который в свою очередь рендерится в своем порядке создания объектов...
2 Imp
Rulezzz!
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
09.12.2005, 19:17
|
#6
|
Дэвелопер
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений (для 164 пользователей)
|
2Akima: Подход к решению вопроса ИМХО изначально неверный. См. код ниже.
2Imp: Проще надо быть, проще!.. Обрати внимание на изменение ФПС.
Сори, комменты при копировании кода превратились в крякозябры и я их перебивал наскоро...
;инициализация
Graphics3D 640,480,32,1
;создаем камеры
Global MainCam=CreateCamera()
Global PrevCam=CreateCamera()
CameraViewport PrevCam,0,0,256,256
CameraClsColor PrevCam,100,100,250
Global C_ind=0;номер обьекта, на который смотрит гл.камера
Global C_prev_ind=0;... на который смотрит доп.камера
;создаем экран для вывода доп.камеры
Global Preview_Texture=CreateTexture(256,256,256)
Global Screen=CreateSprite()
EntityTexture Screen,Preview_Texture
PositionEntity Screen,-1.5,1,3
EntityParent Screen,MainCam
;создаем обьекты
Const C_Count=2;(кол-во обьектов +1)
Dim Obj(C_Count)
For i=0 To C_Count
obj(i)=CreateCube()
PositionEntity obj(i),I*10,1,0
EntityColor obj(i),Rnd(255),Rnd(255),Rnd(255)
Next
;небо в клеточку...
grid_tex=CreateTexture( 16,16,8,2 )
ScaleTexture grid_tex,10,10
SetBuffer TextureBuffer( grid_tex )
ClsColor 255,255,255:Cls:ClsColor 0,0,0
Color 192,192,192:Rect 0,0,8,8:Rect 8,8,8,8
plane=CreatePlane()
EntityTexture plane,grid_tex
SetBuffer BackBuffer()
;--------------------------------------
;MAIN LOOP
While Not KeyHit(1)
;выбираем обьект для гл.камеры ([F1]-[F10])
For q=0 To C_Count
If KeyHit(q+59) Then c_ind=q
Next
;...для доп.камеры ([1]-[10])
For q=0 To C_Count
If KeyHit(q+2) Then c_prev_ind=q
Next
;расставляем камеры к обьектам
PositionEntity MainCam,EntityX(obj(c_ind)),EntityY(obj(c_ind))+1,EntityZ(obj(c_ind))-15
PositionEntity PrevCam,EntityX(obj(c_prev_ind)),EntityY(obj(c_prev_ind))+1,EntityZ(obj(c_prev_ind))-15
;рендер в экран
CameraProjMode MainCam,0
CameraProjMode PrevCam,1
EntityAlpha Screen,0
RenderWorld()
CopyRect 0,0,256,256,0,0,BackBuffer(),TextureBuffer(Preview_Texture)
;главный рендер
CameraProjMode MainCam,1
CameraProjMode PrevCam,0
EntityAlpha Screen,1
RenderWorld()
;подсчет ФПС
FPS=FPS+1
If mFPS<MilliSecs() Then
mFPS=MilliSecs()+1000
CurrentFPS=FPS
FPS=0
EndIf
Text 10,10,"FPS: "+CurrentFPS
Flip(0)
;--------------------
;MAIN LOOP END
Wend
End
|
(Offline)
|
|
09.12.2005, 20:45
|
#7
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Согласен - но твой код более конкретный, я же надеюсь на использование кода в дальнейшем.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
FoV камеры |
HolyDel |
3D-программирование |
1 |
01.08.2008 15:56 |
Эффекты камеры)))))))) |
AndruXa |
Blitz3D |
12 |
21.11.2007 00:01 |
Тип Камеры |
jimon |
2D-программирование |
4 |
18.10.2007 22:07 |
Баг камеры |
Wins Vega |
3D-программирование |
1 |
08.05.2007 04:14 |
1 окно, 2 камеры |
Chuma |
3D-программирование |
9 |
18.02.2007 01:14 |
Часовой пояс GMT +4, время: 18:57.
|