Cubemap - Spiegelung ist falsch

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

barratator

Betreff: Cubemap - Spiegelung ist falsch

BeitragSo, März 22, 2009 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe ein kleines Problem mit den Cubemaps.
Objekte tauchen mal auf einer Cube-Seite auf und verschwinden wieder, aber...es ist schwer zu erklären...
Aber seht selbst:

Code: [AUSKLAPPEN]

Graphics3D 800,600,0,2
SetBuffer BackBuffer()

cube_cam=CreateCamera()
cube_tex=CreateTexture(256,256,1+128+256)

cam = CreateCamera():MoveEntity cam,0,2,0
lig = CreateLight()

mesh = CreateMesh()
surf = CreateSurface(mesh)
EntityTexture mesh,cube_tex

Dim vertex(21,21)

;Erstellt ein paar Umgebungsobjekte
For i = 1 To 100
  c=CreateCube():ScaleEntity c,.1,.1,.1
  PositionEntity c,Rnd(-10,10),Rnd(-10,10),Rnd(-10,10):EntityColor c,Rand(0,255),Rand(0,255),Rand(0,255)
  c=CreateSphere():ScaleEntity c,.1,.1,.1
  PositionEntity c,Rnd(-10,10),Rnd(-10,10),Rnd(-10,10):EntityColor c,Rand(0,255),Rand(0,255),Rand(0,255)
Next

CameraClsColor cam,60,120,200

Repeat
  ;Steuerung
    mouse_x# = mouse_x#+MouseXSpeed()
    mouse_y# = mouse_y#+MouseYSpeed()
    RotateEntity cam,mouse_y#/4,mouse_x#/-4,0
    MoveMouse 400,300
    If KeyDown(17) Then MoveEntity cam,0,0,.1
    If KeyDown(31) Then MoveEntity cam,0,0,-.1
    If KeyDown(30) Then MoveEntity cam,-.03,0,0
    If KeyDown(32) Then MoveEntity cam,.03,0,0

  ; Water
  ClearSurface(surf)
  For x = 0 To 19
    For y = 0 To 19
      vertex(x,y) = AddVertex(surf, x-10,0,y-10)
    Next
  Next
  For y = 0 To 19
    For x = 0 To 19
      AddTriangle(surf,vertex(x,y),vertex(x,y+1),vertex(x+1,y))
      AddTriangle(surf,vertex(x,y+1),vertex(x+1,y+1),vertex(x+1,y))
    Next
  Next
  UpdateNormals(mesh)
  UpdateCubemap(cube_tex,cube_cam,mesh)

  ;Rendering
  RenderWorld
  Flip
  Cls
Until KeyHit(1)
End

; Funktion aus der Hilfe
Function UpdateCubemap(tex,camera,entity)

   tex_sz=TextureWidth(tex)

   ; Show the camera we have specifically created for updating the cubemap
   ShowEntity camera
   
   ; Hide entity that will have cubemap applied to it. This is so we can get cubemap from its position, without it blocking the view
   HideEntity entity

   ; Position camera where the entity is - this is where we will be rendering views from for cubemap
   PositionEntity camera,EntityX#(entity),EntityY#(entity),EntityZ#(entity)

   CameraClsMode camera,False,True
   
   ; Set the camera's viewport so it is the same size as our texture - so we can fit entire screen contents into texture
   CameraViewport camera,0,0,tex_sz,tex_sz

   ; Update cubemap

   ; do left view   
   SetCubeFace tex,0
   RotateEntity camera,0,90,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   ; do forward view
   SetCubeFace tex,1
   RotateEntity camera,0,0,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   ; do right view   
   SetCubeFace tex,2
   RotateEntity camera,0,-90,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   ; do backward view
   SetCubeFace tex,3
   RotateEntity camera,0,180,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   ; do up view
   SetCubeFace tex,4
   RotateEntity camera,-90,0,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   ; do down view
   SetCubeFace tex,5
   RotateEntity camera,90,0,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   ; Show entity again
   ShowEntity entity
   
   ; Hide the cubemap camera
   HideEntity camera
   
   
End Function


Die Objekte werden immer nur auf einem Face gespiegelt, wenn man die Kamera bewegt laufen die Objekte aus einem Face wieder raus (wie es ja auch sein sollte), jedoch kommen die auf dem nächstem Face nicht wieder :S

Was mache ich falsch?

Vielen Dank im vorraus Smile



Gruß
Bastian

Xaymar

ehemals "Cgamer"

BeitragSo, März 22, 2009 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn das später wasser sein soll, wovon ich ausgehe habe ich den code ein wenig angepasst und nun geht dieser:)
UpdateCubeMap(cube_tex, cube_cam, cam) das wasser soll ja spielen oder nicht?

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

cube_cam=CreateCamera()
cube_tex=CreateTexture(256,256,1+128+256)

cam = CreateCamera():MoveEntity cam,0,2,0
lig = CreateLight()

mesh = CreateMesh():EntityFX mesh,1
surf = CreateSurface(mesh)
EntityTexture mesh,cube_tex
PositionEntity mesh,0,-10,0

Dim vertex(21,21)

;Erstellt ein paar Umgebungsobjekte
For i = 1 To 100
  c=CreateCube():ScaleEntity c,.1,.1,.1
  PositionEntity c,Rnd(-10,10),Rnd(-10,10),Rnd(-10,10):EntityColor c,Rand(0,255),Rand(0,255),Rand(0,255)
  c=CreateSphere():ScaleEntity c,.1,.1,.1
  PositionEntity c,Rnd(-10,10),Rnd(-10,10),Rnd(-10,10):EntityColor c,Rand(0,255),Rand(0,255),Rand(0,255)
Next

CameraClsColor cam,60,120,200

SetCubeMode cube_tex, 1

Repeat
  ;Steuerung
    mouse_x# = mouse_x#+MouseXSpeed()
    mouse_y# = mouse_y#+MouseYSpeed()
    RotateEntity cam,mouse_y#/4,mouse_x#/-4,0
    MoveMouse 400,300
    If KeyDown(17) Then MoveEntity cam,0,0,.1
    If KeyDown(31) Then MoveEntity cam,0,0,-.1
    If KeyDown(30) Then MoveEntity cam,-.03,0,0
    If KeyDown(32) Then MoveEntity cam,.03,0,0

  ; Water
  ClearSurface(surf)
  For x = 0 To 19
    For y = 0 To 19
      vertex(x,y) = AddVertex(surf, x-10,0,y-10)
    Next
  Next
  For y = 0 To 19
    For x = 0 To 19
      AddTriangle(surf,vertex(x,y),vertex(x,y+1),vertex(x+1,y))
      AddTriangle(surf,vertex(x,y+1),vertex(x+1,y+1),vertex(x+1,y))
    Next
  Next
  UpdateNormals(mesh)
  UpdateCubemap(cube_tex,cube_cam,cam)

  ;Rendering
  RenderWorld
  Flip
  Cls
Until KeyHit(1)
End

;selbst geschribene funktion, kürzer und unübersichtlich
Function UpdateCubemap(tex,camera,entity)
   SetBuffer BackBuffer()
   tex_sz=TextureWidth(tex)
   
   ShowEntity camera : HideEntity entity
   PositionEntity camera, EntityX#(entity), EntityY#(entity), EntityZ#(entity)
   CameraViewport camera,0,0,tex_sz,tex_sz
   
   SetCubeFace tex,0
   RotateEntity camera,0,90,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,1
   RotateEntity camera,0,0,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,2
   RotateEntity camera,0,-90,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,3
   RotateEntity camera,0,180,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,4
   RotateEntity camera,-90,0,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,5
   RotateEntity camera,90,0,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   ShowEntity entity : HideEntity camera
End Function


ich hatte mich mit dem problem schonmal rumgequält Smile
hatte mir dann ein paar funcs geschrieben.
Code: [AUSKLAPPEN]
;Water-----------------------------------------------------------------------
Function WATER()
End Function

Global UsedWater = 0

Global WTStt = 0, WHeight# = 1
Global WatSiz = 32, WatMshSiz = 64
Dim WaterH#(96, 96, 2)
Global WatMsh = CreateMesh()

Global WTex = CreateTexture(512, 512, 128+256)
Global WTex2= LoadAnimTexture("Gfx/Textures/Water.jpg", 2+256, 128, 128, 0, 25)
TextureBlend WTex2, 3

HideEntity WatMsh
EntityFX WatMsh, 16
EntityTexture WatMsh, WTex
EntityTexture WatMsh, WTex2, WStt, 1
MoveEntity WatMsh, 0, -1000, 0

Engine_InitWater()

Global WaterBank
Dim NormalPos(0,0,0)

Function Engine_InitWater()
   Dim WaterH#(WatSiz, WatSiz, 2)
   Dim NormalPos(WatSiz, WatSiz, 3)
   
   Local Surf = CreateSurface(WatMsh)
   MX = -WatSiz/2
   MY = -WatSiz/2
   
   OX = WatSiz-1
   OZ = WatSiz-1
   WaterBank = CreateBank((WatSiz+1) * (WatSiz+1) * 4)
   For X2 = 0 To OX
      TX# = X2/OX
      TX# = TX#*16
      For Y2 = 0 To OZ
         TY# = Y2/OZ
         TY# = TY#*16
         V1 = AddVertex(Surf, X2, WaterH#(X2 Mod WatSiz, Y2 Mod WatSiz, 0)*WHeight, Y2, TX#, TY#)
         PokeInt WaterBank, (Y2 * WatSiz + X2) * 4, V1
      Next
   Next
   
   For X2 = 0 To OX-1
      TX# = X2/OX
      TX# = TX#*16
      For Y2 = 0 To OZ-1
         TY# = Y2/OZ
         TY# = TY#*16
         V0 = PeekInt(WaterBank, (Y2 * WatSiz + X2) * 4)
         V1 = PeekInt(WaterBank, (Y2 * WatSiz + (X2+1)) * 4)
         V2 = PeekInt(WaterBank, ((Y2+1) * WatSiz + X2) * 4)
         V3 = PeekInt(WaterBank, ((Y2+1) * WatSiz + (X2+1)) * 4)
         AddTriangle(Surf, V2, V1, V0)
         AddTriangle(Surf, V1, V2, V3)
         
         VertexNormal Surf, V0, X2, 0, Y2
         NormalPos(X2, Y2, 0) = X2
         NormalPos(X2, Y2, 1) = WaterH#(X2 Mod WatSiz, Y2 Mod WatSiz, 0)
         NormalPos(X2, Y2, 2) = Y2
      Next
   Next
   
   UpdateNormals WatMsh
   
   ScaleEntity WatMsh, Float(WatMshSiz)/WatSiz, 1, Float(WatMshSiz)/WatSiz
End Function

Function Engine_CreateWater(WSizeX, WSizeZ, H#)
   Obj.Obj = New Obj
   Obj\Msh = CreatePivot()
   Obj\Typ = Wtr
   
   PositionEntity Obj\Msh, 0, H#, 0
   For X = 0 To WSizeX-1
      For Y = 0 To WSizeZ-1
         TEMP = CopyEntity(WatMsh, Obj\Msh)
         PositionEntity TEMP, X*WatMshSiz, 0, Y*WatMshSiz
         EntityFX TEMP, 1+16
         EntityType TEMP, 3
      Next
   Next
   
   UsedWater = 1
   Return Obj\Msh
End Function

Function Engine_UpdateWater()
   Local Surf = GetSurface(WatMsh, 1)
   ClearSurface Surf
   
   OX = WatSiz-1
   OZ = WatSiz-1
   Vertices = CreateBank()
   ;For X = 0 To W-1:For Y = 0 To H-1
   ;   V1 = AddVertex(Surf, X2, WaterH#(X2 Mod WatSiz, Y2 Mod WatSiz, 0), Y2, TX#, TY#)
   ;   PokeInt Vertices, (Y2 *WatSiz +X2) *4, V1
   ;Next:Next
   For X2 = 0 To OX
      TX# = X2/OX
      TX# = TX#*16
      For Y2 = 0 To OZ
         TY# = Y2/OZ
         TY# = TY#*16
         V0 = AddVertex(Surf, X2  , WaterH#(X2 Mod WatSiz      , Y2 Mod WatSiz       , 0)*WHeight, Y2  , TX#, TY#)
         V1 = AddVertex(Surf, X2  , WaterH#(X2 Mod WatSiz      , (Y2+1) Mod WatSiz   , 0)*WHeight, Y2+1, TX#, TY#)
         V2 = AddVertex(Surf, X2+1, WaterH#((X2+1) Mod WatSiz   , Y2 Mod WatSiz      , 0)*WHeight, Y2  , TX#, TY#)
         V3 = AddVertex(Surf, X2+1, WaterH#((X2+1) Mod WatSiz   , (Y2+1) Mod WatSiz   , 0)*WHeight, Y2+1, TX#, TY#)
         AddTriangle(Surf, V2, V1, V0)
         AddTriangle(Surf, V1, V2, V3)
         VertexNormal Surf, V0, X2, 0, Y2
      Next
   Next
   
   UpdateNormals(WatMsh)
   
   For X = 0 To WatSiz-1
      For Y = 0 To WatSiz-1
         If WaterH#(X, Y, 1) = 0 And WaterH#(X, Y, 0) < WaterH#(X, Y, 2)
            WaterH#(X, Y, 0) = WaterH#(X, Y, 0) + Rnd(.005, .01)
         Else
            WaterH#(X, Y, 1) = 1
            WaterH#(X, Y, 2) = Rnd(.05, .3)
         EndIf
         If WaterH#(X, Y, 1) = 1 And WaterH#(X, Y, 0) > -WaterH#(X, Y, 2)
            WaterH#(X, Y, 0) = WaterH#(X, Y, 0) - Rnd(.005, .01)
         Else
            WaterH#(X, Y, 1) = 0
            WaterH#(X, Y, 2) = Rnd(.05, .3)
         EndIf
      Next
   Next
   
   For X = 0 To WatSiz
      WaterH#(X, WatSiz, 0) = WaterH#(X, 0, 0)
   Next
   For Y = 0 To WatSiz
      WaterH#(WatSiz, Y, 0) = WaterH#(0, Y, 0)
   Next
   
   WTStt = (WTStt + 1) Mod 24
End Function

Function UpdateCubemap(tex,camera,entity)
   SetBuffer BackBuffer()
   tex_sz=TextureWidth(tex)
   
   ShowEntity camera : HideEntity entity
   PositionEntity camera, EntityX#(entity), EntityY#(entity), EntityZ#(entity)
   CameraViewport camera,0,0,tex_sz,tex_sz
   
   SetCubeFace tex,0
   RotateEntity camera,0,90,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,1
   RotateEntity camera,0,0,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,2
   RotateEntity camera,0,-90,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,3
   RotateEntity camera,0,180,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,4
   RotateEntity camera,-90,0,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   SetCubeFace tex,5
   RotateEntity camera,90,0,0
   
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   
   ShowEntity entity : HideEntity camera
End Function


~EDITIERT~

Codezeile gekürzt, hat das Layout zerschossen.
hamZta

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group