AnaglyphLib Version 1.1 - 3D Brillen - Stereoskopie
Übersicht

![]() |
ChriseBetreff: AnaglyphLib Version 1.1 - 3D Brillen - Stereoskopie |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
läuft einwandfrei. auch bei höheren auflösungen(1600x1200 @ 60fps)
nur der treppeneffekt auf 1ß24,768 ist ein wenig heftig |
||
Warbseite |
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group