forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   КАМЕРЫ (http://forum.boolean.name/showthread.php?t=409)

Akima 09.12.2005 10:46

Здравстуйте товарищи трудящиеся :lol:
B) Объявляется общий сбор, цель которого помощь в
испровлении ошибок описанного ниже кода. :)
теперь серьезно:
Помогите с прогой пишу ее для тестирования тура,
чтобы с разных видов смотреть и выявлять ошибки в туре
но как видете ,если уже посмотрели, не очень .

Описание: один игрок двигается, а камеры других игроков
отоброжаются на экране
(код проецирования позаимствован из сампла 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

impersonalis 09.12.2005 15:19

ResizeImage texture ,180,120
это зло
Сразу задай размер изображения для камеры через
CameraViewport camera,x,y,width,height

impersonalis 09.12.2005 16:58

Ну если кортенько, то вот:
Код:

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

Тут ещё бы оптимизацию переключения камер и т.п.
:rolleyes:

alex-mad 09.12.2005 17:01

а разрулил то не плохо! :super:

SubZer0 09.12.2005 17:54

мммда, а я хотел через cameraviewport сделать - нифига не получилось.

есть в блице один недостаток, нельзя определить порядок рендера камер, камеры рендерятся в порядке или их создания, или тогда, когда реендерится родительский объект камеры, который в свою очередь рендерится в своем порядке создания объектов... :unsure:

2 Imp

Rulezzz!

Diplomat 09.12.2005 19:17

2Akima: Подход к решению вопроса ИМХО изначально неверный. См. код ниже.
2Imp: Проще надо быть, проще!.. Обрати внимание на изменение ФПС. B)

Сори, комменты при копировании кода превратились в крякозябры и я их перебивал наскоро...
Код:

;инициализация
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


impersonalis 09.12.2005 20:45

Согласен - но твой код более конкретный, я же надеюсь на использование кода в дальнейшем.


Часовой пояс GMT +4, время: 11:31.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot