forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   1 окно, 2 камеры (http://forum.boolean.name/showthread.php?t=2671)

Chuma 11.02.2007 23:41

1 окно, 2 камеры
 
Добрый день господа!

Позвольте задать Вам вопрос.

1. Как можно ли наложить окно первой камеры на окно второй с полупрозрачностью? Тоесть есть основная карта - а в углу показывается в отдельном окне 3-я камера, причем с точки зрения дизайна это окно должно быть полупрозрачным (иначе место теряется)
На ум приходит рендер в текстуру (но не уверен в качестве и скорости)

2. Как сделать так чтобы 2 камеры работая одновременно рендерили по разному, одна - солидом, вторая - WireFrame'ом

Заранее спасибо за ответ.

Platon 11.02.2007 23:59

Re: 1 окно, 2 камеры
 
1) Не стоит делать дополнительные камеры - это дополнительные проходы рендера и соотвественно меньшая производительность. Поэтому карту делать квадом перед камерой с рендером в его текстуру, для высокой скорости юзай либу FastImage на форуме blitz.pp.ru в разделе "исходники"
2) Включай первую камеру, рендерь как обычно, включай вторую и рендерь с файрфреймом:
Код:

CameraProjMode(Камера2, 0)
CameraProjMode(Камера1, 1)
WireFrame(True)
RenderWorld()

CameraProjMode(Камера1, 0)
CameraProjMode(Камера2, 1)
WireFrame(False)
RenderWorld()

Возможно есть другой путь, для чего тебе это надо?

Chuma 12.02.2007 01:24

Re: 1 окно, 2 камеры
 
Цитата:

Сообщение от Cyan
1) Не стоит делать дополнительные камеры - это дополнительные проходы рендера и соотвественно меньшая производительность. Поэтому карту делать квадом перед камерой с рендером в его текстуру, для высокой скорости юзай либу FastImage на форуме blitz.pp.ru в разделе "исходники"
2) Включай первую камеру, рендерь как обычно, включай вторую и рендерь с файрфреймом:
Код:

CameraProjMode(Камера2, 0)
CameraProjMode(Камера1, 1)
WireFrame(True)
RenderWorld()

CameraProjMode(Камера1, 0)
CameraProjMode(Камера2, 1)
WireFrame(False)
RenderWorld()

Возможно есть другой путь, для чего тебе это надо?

Спасибо. Надо.. такс сейчас пример придумаю...

Во. Есть группа объектов (зданий, танков), выбранный объект(без окружения) дополнительно крутится в углу экрана с какими нибудь статсами (названия свойства) и доп эффектами (проволока + целшейдер). Это надо для пущей визуализации. Делается по совету холидела копированием его куда нить далеко(за границы мира) и установкой перед ним второй камеры.

Если просто врубать окно - то идет определенный диссонанс с имеющимся ГУИ и общим стилем.... Вот и пытаюсь как нибудь это безобразие подрехтовать.

собственно моделька низкополигональная так что 2-я камера много ресурсов кушать не должна.

Platon 12.02.2007 02:19

Re: 1 окно, 2 камеры
 
Эм, непонял - зачем вторая камера? Ну скопируй ты этот мешь, отскаль его и помести его перед камерой (первой и единственной) и все дела. А делать "копированием его куда нить далеко" со второй камерой - это уже извращение чистой воды.
Еще лучше будет заранее наделать картинок (можно анимированных) и вместо меша выводить картинки с этим типом обьекта.

Chuma 12.02.2007 12:38

Re: 1 окно, 2 камеры
 
Цитата:

Сообщение от Cyan
Эм, непонял - зачем вторая камера? Ну скопируй ты этот мешь, отскаль его и помести его перед камерой (первой и единственной) и все дела. А делать "копированием его куда нить далеко" со второй камерой - это уже извращение чистой воды.
Еще лучше будет заранее наделать картинок (можно анимированных) и вместо меша выводить картинки с этим типом обьекта.

Спасибо за ответ!

по поводу 2 камеры. Ну это был самый простой вариант. И вполне укладывающийся в мои познания =)
А с рендерингом... хм, а пример есть какой нибудь? Точнее думается что он как то пересекается с вышеуказанным кодом... Боюсь начудить.

А вот картинки увы не катят, ибо в принципе отображаться должен ЛЮБОЙ объект, например только добавленный.

ЛысыЙ_Чук-Иванчук 12.02.2007 17:57

Re: 1 окно, 2 камеры
 
А если делать карту текстурой, тогда в 2Д неполучится(потомучто при повороте текстуры будет ГГлючить!!), прейдется делать 3Д(ну там спрайт вроде самый простой вариант), Так вот как сделать чтобы в углу показывался круг(небольшой, ну как в обычных играх), ну короче карта ведь большая, и её надо какбы этим кругом обрезать:)
;)
ЗЫ. надеюсь вы поймете очем я, а есшо лутше если знаете как это сделать:)

Chuma 12.02.2007 21:28

Re: 1 окно, 2 камеры
 
Цитата:

Сообщение от vlad
А если делать карту текстурой, тогда в 2Д неполучится(потомучто при повороте текстуры будет ГГлючить!!), прейдется делать 3Д(ну там спрайт вроде самый простой вариант), Так вот как сделать чтобы в углу показывался круг(небольшой, ну как в обычных играх), ну короче карта ведь большая, и её надо какбы этим кругом обрезать:)
;)
ЗЫ. надеюсь вы поймете очем я, а есшо лутше если знаете как это сделать:)

ну... если честно разговор не шел о карте...

но коль надо делать карту то самый простой вариант что приходит в голову:

Ты грузишь террейн из текстурки, так?. Берешь эту же текстуру и накладываешь на куб (короче любой мех, припивоченный к камере), сверху на него же альфа+бленд текстуру кружка = получаем круглую карту в углу экрана. Потом привязываем ее к осям (чтоб крутилась) и передаем координаты (чтобы скроллилась при перемещении)

Chuma 15.02.2007 16:07

Re: 1 окно, 2 камеры
 
дабы закрыть тему - код, нашел в семплах у себя.

Код:

Graphics3D 800,600
SetBuffer BackBuffer()

cone=CreateCone(6)
cube=CreateCube()

EntityColor cube,255,128,128
EntityColor cone,128,128,64

effectlight=CreateLight(1)
PositionEntity effectlight,40,30,40
PointEntity effectlight,cube

topcam=CreateCamera()
CameraViewport topcam,0,300,400,300
CameraProjMode topcam,2

sidecam=CreateCamera()
CameraViewport sidecam,0,0,400,300
CameraProjMode sidecam,2

frontcam=CreateCamera()
CameraViewport frontcam,400,0,400,300
CameraProjMode frontcam,2

rendercam=CreateCamera()
CameraViewport rendercam,400,300,400,300

PositionEntity cone,50,0,50

PositionEntity cube,52,0,50

PositionEntity topcam, 51,10,50
PositionEntity sidecam, 61,0,50
PositionEntity frontcam, 51,0,60
PositionEntity rendercam, 56,5,55

PointEntity topcam,cone
TurnEntity topcam,0,0,180
PointEntity sidecam,cone
PointEntity frontcam,cone
PointEntity rendercam,cone

EntityParent topcam,cone
EntityParent sidecam,cone
EntityParent frontcam,cone
EntityParent rendercam,cone

While Not KeyDown(1)

TranslateEntity cone,(KeyDown(208)-KeyDown(200)),0,0
TranslateEntity cone,0,0,(KeyDown(203)-KeyDown(205))
WireFrame True

HideEntity rendercam
ShowEntity sidecam
ShowEntity topcam
ShowEntity frontcam

RenderWorld
Flip

WireFrame False

ShowEntity rendercam
HideEntity sidecam
HideEntity topcam
HideEntity frontcam

RenderWorld
Flip

Wend


и для vlad'а примерчик карты в углу....

Код:

Graphics3D 800,600
SetBuffer BackBuffer()


Global camera = CreateCamera()
CameraRange camera,0.1,1000

Global light = CreateLight()

Global radar = CreateSphere(5)
EntityParent radar,camera
ScaleEntity radar,0.2,0.2,0.01
PositionEntity radar,0.7,-0.3,1
EntityFX radar,1
EntityColor radar,100,100,255

Global player_radar_ent = CreateSphere()
EntityParent player_radar_ent,radar
ScaleEntity player_radar_ent,0.05,0.05,0.05
PositionEntity player_radar_ent,0,0,-2
EntityFX player_radar_ent,1

Type entity
        Field ent
        Field radar_ent
        Field e_type ; 0 = player, 1 = enemy
End Type


For loop = 1 To 20
        e.entity = New entity
        e\ent = CreateCube()
        e\radar_ent = CreateCube()
        EntityParent e\radar_ent,radar
        EntityFX e\radar_ent,1
        ScaleEntity e\radar_ent,0.05,0.05,0.05
        PositionEntity e\ent,Rnd(-20,20),0,Rnd(-20,20)
        HideEntity e\radar_ent
Next



While Not KeyHit(1)



        If KeyDown(200) Then MoveEntity camera,0,0,0.1
        If KeyDown(208) Then MoveEntity camera,0,0,-0.1
        If KeyDown(203) Then TurnEntity camera,0,1,0
        If KeyDown(205) Then TurnEntity camera,0,-1,0
       
        updateradar()
        UpdateWorld
        RenderWorld
        Flip
Wend
End

Function updateradar()

        For e.entity = Each entity
                If EntityDistance#(e\ent,camera) < 10 Then
                        ShowEntity e\radar_ent
                        x_dif# = EntityX(e\ent,True) - EntityX(camera,True)
                        z_dif# = EntityZ(e\ent,True) - EntityZ(camera,True)
                        PositionEntity e\radar_ent,x_dif/10,z_dif/10,-1
                Else
                        HideEntity e\radar_ent
                End If
        Next
       
End Function


HolyDel 16.02.2007 01:38

Re: 1 окно, 2 камеры
 
собсно можно и две текстуры на объект наложить.
нижнюю карту
верхнюю - круг, с блендом 2.
а потом PositionTexture нижнюю.
хотя сам не пробовал, но должно работать. 2 текстуры аппаратно поддерживают почти все видюхи (даже моя).

Chuma 18.02.2007 01:14

Re: 1 окно, 2 камеры
 
Во - вообще 1 в 1....
Код:

AppTitle "Minimap"

Dim GFX(3)
  GFX(0) = 800
  GFX(1) = 600
  GFX(2) = 16
  GFX(3) = 1
     
Graphics3D GFX(0),GFX(1),GFX(2),GFX(3)
SetBuffer BackBuffer()

Global FPS = MilliSecs()
Global player = CreateSphere()
  PositionEntity player,0,2,0
Global cam1p = CreatePivot(Player)
  TurnEntity cam1p,30,0,0
Global cam1 = CreateCamera(cam1p)
  MoveEntity cam1,0,0,-5
Global l1 = CreateLight(cam1)
Global Boden = CreatePlane()
Global Boden_tex = CreateTexture(16,16)
  SetBuffer TextureBuffer(Boden_tex) : Color 155,155,155 : Rect 0,0,16,16 : Color 255,0,0 : Rect 4,4,8,8 : Line 0,0,15,15 : Line 0,15,15,0 : Color 0,0,0 : Rect 0,0,16,16,0 : SetBuffer BackBuffer()
  ScaleTexture Boden_tex,8,8
  EntityTexture Boden,Boden_tex
   
;-man ben?igt fr diesen abschnitt die Media-datein--------
;-die man im Samples Order "/castle/castle" finden----------
;-diese einfach in einen "media"-order speichern und--------
;-den im Order abspeichern in dem sich diese Datei befindet-
Global world = CreateCone();  LoadMesh("media/castle1.x")
  ScaleEntity world,0.2,0.2,0.2
  PositionEntity world,0,-0.5,0
   
  ScaleEntity player,2,2,2
  PositionEntity player,0,2,-30
   
  EntityType player,1
  EntityType world,2
  EntityType Boden,3
  EntityRadius player,2
  Collisions 1,2,2,3
  Collisions 1,3,2,3
;-In der Hauptschleife folgt ein 2.Teil den man nicht------
;-ben?igt wenn man die Media-Dateien nicht haben----------

Const minimap_size = 250
Global minimap = CreateImage(minimap_size,minimap_size) : MaskImage minimap,10,20,30
Global minimap_cam = CreateCamera()
  CameraViewport minimap_cam,GFX(0)-minimap_size,0,minimap_size,minimap_size
Global minimap_alpha = CreateImage(minimap_size,minimap_size) : MaskImage minimap_alpha,0,0,255
  SetBuffer ImageBuffer(minimap_alpha) : Color 10,20,30 : Rect 0,0,minimap_size,minimap_size : Color 0,0,255 : Oval 0,0,minimap_size,minimap_size : Color 255,0,0 : Oval 0,0,minimap_size,minimap_size,0 : Oval 1,1,minimap_size-2,minimap_size-2,0 : Color 0,0,0 : Oval Minimap_size/2-4,minimap_size/2-4,8,8 : Rect minimap_size/2-2,minimap_size/2-7,4,3 : SetBuffer BackBuffer()

Repeat

  If KeyDown(17) Then MoveEntity Player,0,0,+0.5
  If KeyDown(31) Then MoveEntity Player,0,0,-0.5
  If KeyDown(30) Then MoveEntity Player,-0.5,0,0
  If KeyDown(32) Then MoveEntity Player,+0.5,0,0
   
  PositionEntity minimap_cam,EntityX(player),100,EntityZ(player)
  RotateEntity minimap_cam,90,EntityYaw(player),EntityRoll(player)

;-2.Teil l?chen wer keine Media-Datein will-
;-forsetzun von eben-------------------------
  PositionEntity player,EntityX(player),EntityY(player)-0.2,EntityZ(player)
   
  mxs = MouseXSpeed()
  mys = MouseYSpeed()
   
  TurnEntity player,0,-mxs,0
  TurnEntity cam1p,mys,0,0
  MoveMouse GFX(0)/2,GFX(1)/2
  MouseXSpeed() : MouseYSpeed()
;--------------------------------------------


UpdateWorld

  EntityOrder minimap_cam,-1
  EntityOrder player,1
RenderWorld
  CopyRect GFX(0)-minimap_size,0,minimap_size,minimap_size,0,0,BackBuffer(),ImageBuffer(minimap)
  SetBuffer ImageBuffer(minimap) : DrawImage minimap_alpha,0,0 : SetBuffer BackBuffer()
  EntityOrder minimap_cam,1
  EntityOrder player,0
RenderWorld
   
  DrawImage minimap,10,10
  Color 255,255,255
      Text 10,GFX(1)-30,"TrisRendered() = " + TrisRendered()
      Text 10,GFX(1)-15,"F(rames)P(er)S(econd) = " + FPS_return()
   

Flip
Until KeyHit(1)

End

Function FPS_return()
   
  If FPS < MilliSecs() Then currentframes = 1000/(MilliSecs() - FPS)
  FPS = MilliSecs()
  Return currentframes

End Function



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

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