Cubemapping - Kamera falsch?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

NightPhoenix

Betreff: Cubemapping - Kamera falsch?

BeitragSa, Sep 16, 2006 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich versuch jetzt mal alles richtig zu machen was ich hier im Forum so beachten sollte. Wink
Ich habe jetzt einfach von Cubewater_demo die water.3ds als Wasser geladen, weil jemand so freundlich war und mir gesagt hat, dass Cubemappin nicht mit Planes funktioniert.
Jetzt sehe ich falsch angeordnete Bilder im Wasser (also Umrisse des Würfels mit falschen Bildern)
Ist jemand so freundlich und kann mir sagen, ob nicht vielleicht die Cubemapping-Kamera oder so falsch eingestellt ist?
Danke Very Happy

>Edit:< Ich kniffle daran bereits schon 2 tage und finde keine Lösung.

Mein Code:

Code: [AUSKLAPPEN]

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()



light=CreateLight()
TurnEntity light,45,45,0
PositionEntity light,0,10000,0



CamPivo=CreatePivot(); Pivot für die Gravitation

cam1=CreateCamera(CamPivo)
CameraFogMode cam1,1
CameraRange cam1,1,26000
CameraFogRange cam1,10000,25000
CameraFogColor cam1,100,150,255
CameraClsColor cam1,100,150,255
RotateEntity cam1,0,0,0
PositionEntity cam1,0,10,-100
EntityRadius cam1,50
EntityType cam1,1
MoveEntity cam1,17500,1400,17500
CameraProjMode cam1,1


cube_cam=CreateCamera()
HideEntity cube_cam
CameraProjMode cube_cam,0
CameraRange cube_cam,1,26000


Isle=LoadTerrain ("IsleTerrain.bmp")
ScaleEntity Isle,100,2500,100
TerrainDetail Isle,5000,False
IsleTexture=LoadTexture ("TerrainTex1.bmp")
EntityTexture Isle,IsleTexture
EntityFX Isle,16
ScaleTexture IsleTexture,500,500
EntityType Isle,2


water=LoadMesh("water.3ds")
PositionEntity water,30000,800,250000
ScaleEntity water,2000,1,2000
EntityAlpha water,1
EntityFX water,16



Himmel=CreateSphere(20)
ScaleEntity Himmel,70000,70000,8000
RotateEntity Himmel,90,0,0
EntityFX Himmel,16
HT=LoadTexture("Wolken1.bmp")
EntityTexture Himmel,HT
ScaleTexture HT,0.1,0.1



tex=CreateTexture(256,256,1+128+256); erstellen der Cubemode Texture

EntityTexture water,tex; legen der Cubemode-Textur auf das Wasser

cube_mode=1; Spiegelungsverhalten




Collisions (1,2,2,3)
Collisions (2,1,2,3)



While Not KeyHit(1)



RotateTexture HT,MilliSecs()*0.00005


MoveEntity CamPivo,0,0,0; Pivot wird durch Gravitation heruntergezogen und die Kamera dadurch mit -> damit Grav. nicht an Richtung der Kamera gebunden ist



      ; >>Kamera Kontrolle<<
   
      ; Maussteuerung
   
      RotateEntity cam1,EntityPitch(cam1)+MouseYSpeed(),EntityYaw(cam1)-MouseXSpeed(),0
      MoveMouse 512,384


      ; Bewegt die Kamera mit den Kursortasten Vorwärts, Rückwärts, etc.
   
      If KeyDown(200)=True Then MoveEntity cam1,0,0,10.2
      If KeyDown(208)=True Then MoveEntity cam1,0,0,-10.2
      If KeyDown(205)=True Then MoveEntity cam1,10.2,0,0
      If KeyDown(203)=True Then MoveEntity cam1,-10.2,0,0
   
      ; Wenn M gedrückt wird ändert sich SetCubeMode um +1
         If KeyHit(50)
         cube_mode=cube_mode+1
         If cube_mode=4 Then cube_mode=1
         SetCubeMode tex,cube_mode
      EndIf


   HideEntity cam1

   UpdateCubemap(tex,cube_cam,water)

   ShowEntity cam1



UpdateWorld
RenderWorld

Flip
Wend





;Die Function hab ich aus der Hilfe für SetCubeFace kopiert

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



ClearWorld
End


Sorry wegen meinem letzten Thema, kommt nicht wieder vor Wink [/code]
 

Dreamora

BeitragSa, Sep 16, 2006 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Sicher das das Positionieren der Cam stimmt?

Denn das was du dort angibst ist 0,0,0 des Wassermeshes und das macht nur dann sinn, wenn der 0,0,0 Punkt des Wassers in der Mitte liegt und nicht in einer Ecke. Sonst könnte das ziemlich unschöne, ungewollte grafische Konsequenzen haben Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

NightPhoenix

BeitragSa, Sep 16, 2006 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle Antwort, aber welche Positionierung meinst du genau? Bei CreateCamera cube_cam (am Anfang) oder bei der Kamera-Rotation, wo die 6 Texturen auf den Würfel gelegt werden?
 

Dreamora

BeitragSa, Sep 16, 2006 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
PositionEntity camera,EntityX#(entity),EntityY#(entity),EntityZ#(entity)


diese Position

Denn EntityX ist am 0 Punkt im Model und wenn dieser 0 Punkt nicht in der Mitte der Wasserfläche war bekommst du die Reflektion aus sicht einer der Ecken und das dürfte ziemlich schief aussehen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

NightPhoenix

BeitragSa, Sep 16, 2006 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich ein totaler Noob in Cubemapping bin, vermute ich jetzt einfach mal ich muss nur hinter: "EntityX#(entity)" bzw. Y,Z ein + oder - "Zahl" oder sowas für Koordinaten setzen bis es passt?
Kannst du versuchen mir das ganze nochmal in "Noobish" zu erklären? Wink
Ich habe sowas verstanden wie dass die Kamera an einer Ecke des Objektes sitzt und deshlab verzerte Bilder an die Cubemap gibt? Deshalb dann diese unsauberen übergänge? (d.h. würfelumrisse erkennbar)
Kannste mir bissl helfen das Kamera Dingens richtig einzustellen?
Sorry dass ich dir so ne Mühe mache Wink
Danke!

Edit: Ganz vergessen: Immer wenn ich nach unten schaue ins Wasser wird alles tief Schwarz.
Wenn ich die Cubemapping texture auf 1024,1024 stelle dann sehe ich Programm-fremde texturen von meinen anderen Blitz 3D Projekten+Schwarz wenn ich nach unten sehe. Dieses Cubemapping ist von ner anderen Dimension Very Happy

Hat jemand ein Rat für mich?
 

Dreamora

BeitragSa, Sep 16, 2006 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Edit ergibt ziemlich genau 0 Sinn, da das nie passieren dürfte.
Auch sollte es nicht tiefschwarz werden, wenn du nach unten guckst, ausser dein Himmel wäre schwarz (-> keine Skybox)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

NightPhoenix

BeitragSa, Sep 16, 2006 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein eine Skybox ist vorhanden (siehe Code) Vielleicht sollte ich FlipMesh machen anstatt nur beide Seiten zu texturieren (mit EntityFX 16). Das könnte klappen...
Ja das mit den fremden Texturen ist taurig aber war... Ich hatte darüber schonmal gelesen... moment.... da: https://www.blitzforum.de/foru...ubemapping

Wie man auf dem Screenshot sehen kann und in der dazugehörigen Beschreibung unten im ersten Beitrag.

Jetzt weiß ich aber immernoch nicht wie ich dieses blöde:
PositionEntity camera,EntityX#(entity),EntityY#(entity),EntityZ#(entity)
verändern muss, damit ich schöne spiegelungen hinbekomme.
Hängt die Kamera nun zu niedrig? zu hoch? .. Rolling Eyes kein plan << NOOBY Wink

Jemand eine Idee zur Lösung des Problems? Question Question

Danke Dreamora für alle Antworten bis hierhin Smile
 

Dreamora

BeitragSa, Sep 16, 2006 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Solange ich nicht weiss wo der 0,0,0 Punkt in deinem Mesh hängt kann ich dir das nicht mit sicherheit sagen.

Aber vermutlich wird ein +MeshWidth(entity)/2 / meshheight/2 / meshdepth/2 tun.


Was Sky betrifft: ist eventuell unten schwarz? falls ja wärs auch möglich das du das die cam renders falsch kopierst also in die falschen cubefaces.
Das schwarz könnte übrigens auch an der grösse der Skybox liegen. (siehe letztes posting in genanntem Thread bzw. der thread allgemein für ideen was hier das problem sein könnte)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

NightPhoenix

BeitragSo, Sep 17, 2006 9:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Tipp =)
Das Entity müsste in meinem Code das eigentliche Wasser sein. Denn als Entity in der Function unten wurde ja das wasser ausgewählt. Ich vermute mal es ist besser die Cube_cam unter wasser zu bringen damit nicht die spiegelung selbst nochmal gespiegelt wird ^^
Ich werds mal versuchen.

Zu dem Schwarz: Problem gelöst!
Hate vergessen auf das wasser eine textur zu machen die mit EntityFX 1 leuchtend wirkt. Jetzt ists kein schwarz mehr.. .sondern gelb wie die blöde insel ^^
D.h. meine Cam ist immernoch falsch auf die 6 Würfelseiten der Cubemap gelegt.
Ich werds mit herumexperimentieren weiter versuchen...
Danke Dreamora

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group