AnaglyphLib Version 1.1 - 3D Brillen - Stereoskopie

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Chrise

Betreff: AnaglyphLib Version 1.1 - 3D Brillen - Stereoskopie

BeitragSo, Jan 04, 2009 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe meinen Code noch einmal etwas überarbeitet und mich mal wieder etwas mit 3D-Rot Grün bzw. Rot-Cyan 3D Bilder auseinandergesetzt.

Dabei sind drei Funktionen entstanden, die sich, wie ich finde sehr leicht in das eigene Projekt integrieren lassen und kaum Funktionen einschränken.

So kann man weiterhin Cameraproject(),Camerapick() und derartige Funktionen verwenden und erhält weiterhin richtige Werte.

Code: [AUSKLAPPEN]

;Anaglyph-3D Lib
Function Create3DCamera(size=1024,a#=0.25,gb=1)
   Local scale#
   camera3D = CreateCamera()
   NameEntity camera3D,Str$(size)
   camera_left = CreateCamera()
   camera_right = CreateCamera()
   
   CameraRange camera3D,0.1,3000
   CameraRange camera_left,0.1,3000
   CameraRange camera_right,0.1,3000
   CameraViewport camera_left,0,0,size,size
   CameraViewport camera_right,0,0,size,size
   MoveEntity camera_left,-a#/2,0,0
   MoveEntity camera_right,a#/2,0,0
   EntityParent camera_left,camera3D
   EntityParent camera_right,camera3D
   
   screen_left_tex = CreateTexture(size,size)
   screen_left = CreateCube()
   NameEntity screen_left,Str$(screen_left_tex)
   EntityFX screen_left,1
   EntityTexture screen_left,screen_left_tex
   PositionEntity screen_left,0,0,2
   EntityOrder screen_left,-1001
   EntityParent screen_left,camera3D
   EntityColor screen_left,255,0,0
   EntityBlend screen_left,3
   
   screen_right_tex = CreateTexture(size,size)
   screen_right = CreateCube()
   NameEntity screen_right,Str$(screen_right_tex)
   EntityFX screen_right,1
   EntityTexture screen_right,screen_right_tex
   PositionEntity screen_right,0,0,2
   EntityOrder screen_right,-1000
   EntityParent screen_right,camera3D
   If gb=1 Then EntityColor screen_right,0,255,255
   If gb=0 Then EntityColor screen_right,0,255,0
   
   Return camera3D   
End Function
Function Render3DWorld(camera3D)
   size = Int(EntityName(camera3D))
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   screen_left = GetChild(camera3D,3)
   screen_left_tex = Int(EntityName(screen_left))
   screen_right = GetChild(camera3D,4)
   screen_right_tex = Int(EntityName(screen_right))
   
   HideEntity screen_left
   HideEntity screen_right
   
   CameraProjMode camera3D,0
   
   CameraProjMode camera_left,1
   CameraProjMode camera_right,0
   RenderWorld
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(screen_left_tex)
   CameraProjMode camera_left,0
   CameraProjMode camera_right,1
   RenderWorld
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(screen_right_tex)
   
   ShowEntity screen_left
   ShowEntity screen_right
   CameraProjMode camera_left,0
   CameraProjMode camera_right,0
   CameraProjMode camera3D,1
   RenderWorld
End Function
Function Free3DCamera(camera3D)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   screen_left = GetChild(camera3D,3)
   screen_left_tex = Int(EntityName(screen_left))
   screen_right = GetChild(camera3D,4)
   screen_right_tex = Int(EntityName(screen_right))
   FreeEntity camera_left
   FreeEntity camera_right
   FreeEntity screen_left
   FreeEntity screen_right
   FreeTexture screen_left_tex
   FreeTexture screen_right_tex
   FreeEntity camera3D
End Function



Hier ein Beispielcode, der die Benutzung verdeutlichen wird:

Code: [AUSKLAPPEN]
Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

gw = GraphicsWidth()
gh = GraphicsHeight()

autosize = 2048
Repeat autosize = autosize/2
Until (autosize <= gh And autosize <= gw)

camera = Create3DCamera(autosize,0.5) ;Einfach die 3D Kamera erstellen und wie eine gewöhnliche Camera (wie mit Createcamera()) erstellt verwalten.
;Create3DCamera([größe der Textur 1024,512,256,usw.],[Augenabstand#],[0=rot-grün;1=rot-cyan])

light = CreateLight()
RotateEntity light,90,0,0

Dim cube(20)
For i=1 To 20
   cube(i) = CreateCube()
   PositionEntity cube(i),i*2-5,0,3+i*2
   RotateEntity cube(i),30,30,0
   EntityPickMode cube(i),2,1
Next

While Not KeyHit(1)
   entity = CameraPick(camera,MouseX(),MouseY())
   For i=1 To 20
      If entity = cube(i) Then
         EntityColor cube(i),50,50,50
      Else
         EntityColor cube(i),255,255,255
      EndIf
      PositionEntity cube(i),EntityX(cube(i),1),Sin(w+i*30)*3,EntityZ(cube(i),1)
   Next
   w=w+1
   
   Render3DWorld(camera,1) ;Dieser Befehl wird statt Renderworld verwendet.

   ;Create3DCamera(3DCamera,[Animationsschritt])
   
   fpscount = fpscount+1
   If MilliSecs()-timer >= 1000 Then
   timer = MilliSecs()
   fps=fpscount
   fpscount=0
   EndIf

   Text 50,50,fps
   Flip
Wend
Free3DCamera(camera)
End

Function Create3DCamera(size=1024,a#=0.25,gb=1)
   Local scale#
   camera3D = CreateCamera()
   NameEntity camera3D,Str$(size)
   camera_left = CreateCamera()
   camera_right = CreateCamera()
   
   CameraRange camera3D,0.1,3000
   CameraRange camera_left,0.1,3000
   CameraRange camera_right,0.1,3000
   CameraViewport camera_left,0,0,size,size
   CameraViewport camera_right,0,0,size,size
   MoveEntity camera_left,-a#/2,0,0
   MoveEntity camera_right,a#/2,0,0
   EntityParent camera_left,camera3D
   EntityParent camera_right,camera3D
   
   screen_left_tex = CreateTexture(size,size)
   screen_left = CreateCube()
   NameEntity screen_left,Str$(screen_left_tex)
   EntityFX screen_left,1
   EntityTexture screen_left,screen_left_tex
   PositionEntity screen_left,0,0,2
   EntityOrder screen_left,-1001
   EntityParent screen_left,camera3D
   EntityColor screen_left,255,0,0
   EntityBlend screen_left,3
   
   screen_right_tex = CreateTexture(size,size)
   screen_right = CreateCube()
   NameEntity screen_right,Str$(screen_right_tex)
   EntityFX screen_right,1
   EntityTexture screen_right,screen_right_tex
   PositionEntity screen_right,0,0,2
   EntityOrder screen_right,-1000
   EntityParent screen_right,camera3D
   If gb=1 Then EntityColor screen_right,0,255,255
   If gb=0 Then EntityColor screen_right,0,255,0
   
   Return camera3D   
End Function
Function Render3DWorld(camera3D,s=1)
   size = Int(EntityName(camera3D))
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   screen_left = GetChild(camera3D,3)
   screen_left_tex = Int(EntityName(screen_left))
   screen_right = GetChild(camera3D,4)
   screen_right_tex = Int(EntityName(screen_right))
   
   HideEntity screen_left
   HideEntity screen_right
   
   CameraProjMode camera3D,0
   
   CameraProjMode camera_left,1
   CameraProjMode camera_right,0
   RenderWorld s
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(screen_left_tex)
   CameraProjMode camera_left,0
   CameraProjMode camera_right,1
   RenderWorld s
   CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(screen_right_tex)
   
   ShowEntity screen_left
   ShowEntity screen_right
   CameraProjMode camera_left,0
   CameraProjMode camera_right,0
   CameraProjMode camera3D,1
   RenderWorld s
End Function
Function Free3DCamera(camera3D)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   screen_left = GetChild(camera3D,3)
   screen_left_tex = Int(EntityName(screen_left))
   screen_right = GetChild(camera3D,4)
   screen_right_tex = Int(EntityName(screen_right))
   FreeEntity camera_left
   FreeEntity camera_right
   FreeEntity screen_left
   FreeEntity screen_right
   FreeTexture screen_left_tex
   FreeTexture screen_right_tex
   FreeEntity camera3D
End Function


Zur Performance kann ich leider nicht viel sagen. Bei mir läufts einwandfrei flüssig. Nur bei Auflösungen mit Höhe > 1024 beginnt es zu ruckeln. Ist aber auch absehbar meiner Meinung nach.

Ich würde mich über Verbesserungstipps wirklich freuen!
  • Zuletzt bearbeitet von Chrise am Di, Jan 06, 2009 15:00, insgesamt einmal bearbeitet

Xaymar

ehemals "Cgamer"

BeitragSo, Jan 04, 2009 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
läuft einwandfrei. auch bei höheren auflösungen(1600x1200 @ 60fps)

nur der treppeneffekt auf 1ß24,768 ist ein wenig heftig
Warbseite

Chrise

BeitragSo, Jan 04, 2009 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Cgamer hat Folgendes geschrieben:
läuft einwandfrei. auch bei höheren auflösungen(1600x1200 @ 60fps)

nur der treppeneffekt auf 1ß24,768 ist ein wenig heftig


Hey, danke! Smile
Hmmm.... also bei der Auflösung 1024x768 wird eine Textur von 512x512 verwendet.
Stell mal bei der Funktion Create3DCamera() den Parameter Size auf 1024 (1024 statt Autosize), also:
camera = Create3DCamera(1024,0.5)

Ich merk das nämlich nicht, weil ich bei meiner Grafikkarten Antialias angeschaltet hab und der das nochmal paar mal rendert ^^

Chrise

BeitragDi, Jan 06, 2009 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hab jetzt alle Befehle, bei denen noch Parameter gefehlt haben ergänzt.
Das ist die komplette Lib:
Code: [AUSKLAPPEN]

;unveränderte Befehle:
;-CameraPick
;-CameraProject
;-CameraViewport
;-ProjectedX
;-ProjectedY
;-ProjectedZ
;neue Befehle:
;-Camera3DClsColor(camera,r,g,b)
;-Camera3DClsMode(camera,color,zbuffer)
;-Camera3DFogColor(camera,r,g,b)
;-Camera3DFogMode(camera,0-1)
;-Camera3DFogRange(camera,start#,end#)
;-Camera3DProjMode(camera,0-2)
;-Camera3DRange(camera,start#,end#)
;-Camera3DZoom(camera,zoom#)
;-Create3DCamera(tex_size[0=auto],eye_distance#,0=red-green or 1=red,[parent])
;-Camera3DEyeDistance(camera,eye_distance#)
;-Render3DWorld(camera,[animationstep] standarr=1)
;-Free3DCamera(camera)

;3D Anaglyph - Lib. by Chrise 4. Jan 2009

Function Create3DCamera(size=1024,a#=0.25,gb=1,parent=0)
   Local gw,gh
   If size=0 Then
      gw = GraphicsWidth()
      gh = GraphicsHeight()
      size = 2048
      Repeat size = size/2
      Until (size <= gh And size <= gw)
   EndIf
   If parent <> 0 Then camera3D = CreateCamera(parent)
   If parent = 0 Then camera3D = CreateCamera()
   NameEntity camera3D,Str$(size)
   camera_left = CreateCamera()
   camera_right = CreateCamera()
   
   CameraProjMode camera3D,1
   CameraProjMode camera_left,0
   CameraProjMode camera_right,0
   
   CameraRange camera3D,0.1,1000
   CameraViewport camera_left,0,0,size,size
   CameraViewport camera_right,0,0,size,size
   MoveEntity camera_left,-a#/2,0,0
   MoveEntity camera_right,a#/2,0,0
   EntityParent camera_left,camera3D
   EntityParent camera_right,camera3D
   
   screen_left_tex = CreateTexture(size,size)
   screen_left = CreateCube()
   NameEntity screen_left,Str$(screen_left_tex)
   EntityFX screen_left,1
   EntityTexture screen_left,screen_left_tex
   PositionEntity screen_left,0,0,2
   EntityOrder screen_left,-1001
   EntityParent screen_left,camera3D
   EntityColor screen_left,255,0,0
   EntityBlend screen_left,3
   
   screen_right_tex = CreateTexture(size,size)
   screen_right = CreateCube()
   NameEntity screen_right,Str$(screen_right_tex)
   EntityFX screen_right,1
   EntityTexture screen_right,screen_right_tex
   PositionEntity screen_right,0,0,2
   EntityOrder screen_right,-1000
   EntityParent screen_right,camera3D
   If gb=1 Then EntityColor screen_right,0,255,255
   If gb=0 Then EntityColor screen_right,0,255,0
   HideEntity screen_left
   HideEntity screen_right
   
   NameEntity camera_left,Str$(1)
   NameEntity camera_right,Str$(1.0)
   
   Return camera3D   
End Function
Function Render3DWorld(camera3D,s=1)
   size = Int(EntityName(camera3D))
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   screen_left = GetChild(camera3D,3)
   screen_left_tex = Int(EntityName(screen_left))
   screen_right = GetChild(camera3D,4)
   screen_right_tex = Int(EntityName(screen_right))
   mode = Int(EntityName(camera_left))
   zoom# = Float(EntityName(camera_right))
   
   HideEntity screen_left
   HideEntity screen_right
   
   If mode = 1 Then
      CameraZoom camera_left,zoom#
      CameraZoom camera_right,zoom#
   Else If mode = 2 Then
      CameraZoom camera_left,zoom#/10
      CameraZoom camera_right,zoom#/10
   EndIf
   
   If mode > 0 Then
      CameraProjMode camera3D,0
      CameraProjMode camera_left,mode
      CameraProjMode camera_right,0
      Cls
      RenderWorld s
      CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(screen_left_tex)
      CameraProjMode camera_right,mode
      CameraProjMode camera_left,0
      Cls
      RenderWorld s
      CopyRect 0,0,size,size,0,0,BackBuffer(),TextureBuffer(screen_right_tex)
      
      ShowEntity screen_left
      ShowEntity screen_right
      CameraProjMode camera_left,0
      CameraProjMode camera_right,0      
      CameraProjMode camera3D,1
      CameraZoom camera3D,1
      RenderWorld s
      CameraProjMode camera3D,mode
      If mode = 1 Then
         CameraZoom camera3D,zoom#
      Else If mode = 2 Then
         CameraZoom camera3D,zoom#/10
      EndIf
      If mode = 0 Then CameraProjMode camera3D,0
      If mode <> 0 Then CameraProjMode camera3D,mode
      HideEntity screen_left
      HideEntity screen_right
   Else
      RenderWorld s
   EndIf
End Function
Function Camera3DClsColor(camera3D,r,g,b)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   CameraClsColor camera_left,r,g,b
   CameraClsColor camera_right,r,g,b
End Function
Function Camera3DClsMode(camera3D,c=1,z=1)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   CameraClsMode camera_left,c,col
   CameraClsMode camera_right,c,col
End Function
Function Camera3DFogColor(camera3D,r,g,b)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   CameraFogColor camera_left,r,g,b
   CameraFogColor camera_right,r,g,b
End Function
Function Camera3DFogMode(camera3D,mode)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   CameraFogMode camera_left,mode
   CameraFogMode camera_right,mode
End Function
Function Camera3DFogRange(camera3D,start#=1,ende#=1000)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   CameraFogRange camera_left,start#,ende#
   CameraFogRange camera_right,start#,ende#
End Function
Function Camera3DProjMode(camera3D,mode)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   CameraProjMode camera3D,mode
   CameraProjMode camera_left,mode
   CameraProjMode camera_right,mode
   NameEntity camera_left,Str$(mode)
End Function
Function Camera3DRange(camera3D,start#=1,ende#=1000)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   CameraRange camera3D,0.1,ende#
   CameraRange camera_left,start#,ende#
   CameraRange camera_right,start#,ende#
End Function
Function Camera3DZoom(camera3D,zoom#=1)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   mode = Int(EntityName(camera_left))
   If mode = 1 Then
      CameraZoom camera3D,zoom#
      CameraZoom camera_left,zoom#
      CameraZoom camera_right,zoom#
   Else If mode = 2 Then
      CameraZoom camera3D,zoom#/10
      CameraZoom camera_left,zoom#/10
      CameraZoom camera_right,zoom#/10
   EndIf
   NameEntity camera_right,Str$(zoom#)
End Function
Function Camera3DEyeDistance(camera3D,a#)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   PositionEntity camera_left,-a#/2,0,0
   PositionEntity camera_right,a#/2,0,0
End Function
Function Camera3DMode(camera3D,mode)
   screen_right = GetChild(camera3D,4)
   If mode=1 Then EntityColor screen_right,0,255,255
   If mode=0 Then EntityColor screen_right,0,255,0
End Function
Function FreeCamera3D(camera3D)
   camera_left = GetChild(camera3D,1)
   camera_right = GetChild(camera3D,2)
   screen_left = GetChild(camera3D,3)
   screen_left_tex = Int(EntityName(screen_left))
   screen_right = GetChild(camera3D,4)
   screen_right_tex = Int(EntityName(screen_right))
   FreeEntity camera_left
   FreeEntity camera_right
   FreeEntity screen_left
   FreeEntity screen_right
   FreeTexture screen_left_tex
   FreeTexture screen_right_tex
   FreeEntity camera3D
End Function


Das ganze funktioniert jetzt ziemlich einfach. D.h. man muss z.b. Createcamera() nur durch Create3Dcamera() ersetzen (die Parameter natürlich nicht vergessen)
Und statt Renderworld() Reneder3DWorld(3Dcamera) verwenden. Ggf. noch Nebeleffekte durch neue 3Dcamera Befehle austauschen.

Damit habe ich es in weniger als 3 Minuten geschafft, im Cubewaterbeispiel die 3DBrillen Funktion zum laufen zu bringen:

user posted image

Hier noch zu guter letzt ein weiterer Beispielcode (ich denke vll nur für Neulinge interessant):
Code: [AUSKLAPPEN]

include "AnaglyphLib.bb"
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

camera = Create3DCamera(0,0.32,1)

light = CreateLight()
RotateEntity light, 90, 0, 0

cube = CreateCube()
RotateEntity cube, 20, 50, 50
PositionEntity cube, 0, 0, 5

While Not KeyHit(1)
   Render3DWorld(camera)
   Flip
Wend

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group