Echter Wandspiegel

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Midimaster

Betreff: Echter Wandspiegel

BeitragMo, Okt 19, 2009 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe nirgendwo ein Code-Schnipsel für einen Echtzeit-Wandspiegel gefunden. Die Beispiele auf blitzbasic.com haben alle nicht wirklich funktioniert. Deshalb erstelle ich einen möglichst realistischen Wandspiegel. Hat hier jemand Erfahrungen und möchte mitmachen?

Ein erstes, schon gut arbeitendes Prog-Beispiel habe ich hier:

user posted image

(Anmerkung zur Bildqualität: Sämtliche Objekte und Texturen werden in diesem Demo nur durch Code erzeugt. Dient ja nur der Veranschaulichung. In einem tollen Raum gibt es natürlich ein tolles Spiegelbild)


der Effekt sieht schon sehr realistisch aus, funktioniert momentan nur realistisch, wenn der Spiegel senkrecht auf dem Boden steht. Dies dürfte aber für viele Anwendung genau so gebraucht werden.

Hier ist der Code dazu:

Code: [AUSKLAPPEN]


; Definitionin des Spiegels
Global Mirror
Global MirrorCamera
Global MirrorTexture
Global MirrorPlan






; dieser teil dient nur zum Erstellen des beliebigen Raums

   Graphics3D 1024,768,32,2
   
   AntiAlias 1
   
   ; Licht
      AmbientLight 111,111,111
      Licht= CreateLight(1)
      MoveEntity licht, -5,10,10 
      RotateEntity licht, 45,45,0
      LightColor Licht, 255,222,222
      Licht2= CreateLight(1)
      MoveEntity licht2, 5,10,10 
      RotateEntity licht2, 45,-45,0
      LightColor Licht2, 222,222,252
      
      
      ;licht3=CreateLight(3)
      ;LightRange licht3,1090
      ;RotateEntity licht3,90,270,0
      ;MoveEntity licht3,-2,-2,-4
   
   ;Camera
      Global Camera=CreateCamera()
      kommode=CreatePivot()
      SeedRnd MilliSecs()
      MaterialBreite#=0.02
      MoveEntity kommode, 0,0,0
      PositionEntity Camera, -2,1,-5
      RotateEntity Camera, 0,0,0
      CameraViewport Camera,20,20,620,620
      
   
   
   ; Der Raum
      Raum=CreateCube()
      FlipMesh raum
      EntityColor Raum,115,82,42
      MoveEntity raum, 1,2.82,-4.47
      ScaleEntity raum,6,4,5
   
   
   ; Die Kommode
      Dim Wand(99)
      Dim Fuss(99)
      Dim Schub(99)
      
      TexName$="hollz.png"
      Holz=LoadTexture(TexName)
      If holz=0 Then
         Holz=CreateTexture(256,256,0)
         SetBuffer TextureBuffer(holz)
         Color 102,61,4
         Rect 0,0,256,256
         Color 112,71,24
         For i=0 To 1000
            Oval Rand(0,255),Rand(0,255),2,50
         Next
         SetBuffer BackBuffer()
         
      EndIf
      RotateTexture Holz, 90
      
      ScaleTexture  Holz,1,0.3
      ; linke wand
      Wand(0)=CreateCube (Kommode)
      ScaleEntity wand(0),MaterialBreite,1,0.5
      MoveEntity wand(0), -1.5,0,0
      EntityColor Wand(0),211,211,211
      EntityTexture Wand(0),Holz
      
      ; rechte wand
      Wand(1)=CreateCube (Kommode)
      ScaleEntity wand(1),MaterialBreite,1,0.5
      MoveEntity wand(1), 1.5,0,0
      EntityColor Wand(1),191,191,191
      EntityTexture Wand(1),Holz
      
      ; oben
      Wand(2)=CreateCube (Kommode)
      ScaleEntity wand(2),1.6,2*MaterialBreite,0.55
      MoveEntity wand(2), 0,1,-0.05
      EntityTexture Wand(2),Holz
      
      
      ; unten
      Wand(3)=CreateCube (Kommode)
      ScaleEntity wand(3),1.55,MaterialBreite,0.51
      MoveEntity wand(3), 0,-1,0
      ;EntityColor Wand(3),Rand(100,255),Rand(100,255),Rand(100,255)
      EntityColor Wand(3),111,111,111
      EntityTexture Wand(3),Holz
      
      
      ; hinten
      Wand(4)=CreateCube (Kommode)
      ScaleEntity wand(4),1.50,0.97,MaterialBreite
      MoveEntity wand(4), 0,0,0.5
      ;EntityColor Wand(3),Rand(100,255),Rand(100,255),Rand(100,255)
      EntityColor Wand(4),11,11,11
      ;EntityTexture Wand(3),Holz
      
      
      
      ; fuss
      fuss(0)=CreateSphere (8,Kommode)
      ScaleEntity fuss(0),0.1,0.1,0.1
      MoveEntity fuss(0), -1.4,-1.1,-0.4
      EntityColor fuss(0),48,33,24
      Fuss(1)=CopyEntity(Fuss(0),Kommode)
      MoveEntity fuss(1), +2.8,0,0
      Fuss(2)=CopyEntity(Fuss(0),Kommode)
      MoveEntity fuss(2), 0,0,0.8
      Fuss(3)=CopyEntity(Fuss(0),Kommode)
      MoveEntity fuss(3), +2.8,0,0.8
      
      ; Schublade
      ;holz=LoadTexture(TexName)
      ScaleTexture  holz,1,0.4
      RotateTexture holz, 90
      Schub(0)=CreatePivot(Kommode)
      MoveEntity Schub(0),-0.76,0.625,-0.55
      ;
      SchubZier=CreateCube(Schub(0))
      ScaleEntity SchubZier,0.75,0.3,MaterialBreite
      MoveEntity SchubZier, 0,0,0
      EntityTexture SchubZier,holz
      ;EntityColor SchubZier,Rand(100,255),Rand(100,255),Rand(100,255)
      ;
      SchubKnopf=CreateCylinder(16,True,Schub(0))
      ScaleEntity SchubKnopf, 0.1,0.03,0.02
      MoveEntity SchubKnopf,0,0,-0.1
      TurnEntity SchubKnopf,90,0,0
      EntityColor SchubKnopf,155,155,155
      EntityColor SchubKnopf,48,33,24
      EntityShininess SchubKnopf,1
      ;
      SchubWangeL=CreateCube(Schub(0))
      ScaleEntity SchubWangeL,MaterialBreite,0.25,0.5
      MoveEntity SchubWangeL, -0.65,0,0.5
      EntityColor SchubWangeL,211,211,211
      EntityTexture SchubWangeL,holz
      
      ;
      ;HideEntity SchubWangel
      SchubWangeR=CopyEntity (Schubwangel,Schub(0))
      MoveEntity SchubWangeR, 1.3,0,0
      EntityColor SchubWangeR,169,169,188
      ;
      SchubBoden=CreateCube(Schub(0))
      ScaleEntity SchubBoden,0.65,MaterialBreite,0.5
      MoveEntity SchubBoden, 0,-0.25,0.5
      EntityColor SchubBoden,151,151,151
      EntityTexture SchubBoden,holz
      
      ;
      SchubRueck=CreateCube(Schub(0))
      ScaleEntity SchubRueck,0.65,0.25,MaterialBreite
      MoveEntity SchubRueck, 0,0,1
      EntityColor SchubRueck,111,111,91
      EntityTexture SchubRueck,holz
      
      
      For I=1 To 6
         ;EntityColor SchubZier,Rand(100,255),Rand(100,255),Rand(100,255)
         Schub(i)=CopyEntity (Schub(0),Kommode)
      Next
      MoveEntity Schub(1),1.52,0,0
      MoveEntity Schub(2),0,-0.63,0
      MoveEntity Schub(3),1.52,-0.63,0
      MoveEntity Schub(4),0,-1.26,0
      MoveEntity Schub(5),1.52,-1.26,0
      ;Kommode2=CopyEntity(Kommode)
      ;MoveEntity kommode2,4,0,-2
      
   
   ; restliches Mobiliar
      Wuerfel=CreateCube()
      ScaleEntity wuerfel,0.5,1,0.5
      MoveEntity wuerfel, 0,-1,-4
      EntityColor wuerfel, 0,0,55
      
      Lampe=CreateSphere(8)
      ;ScaleEntity Lampe, 0.5,0.5,0.5
      MoveEntity Lampe, 0,4,-2
      EntityColor lampe,55,213,222
      
      Saeule=CreateCylinder(8,0)
      ScaleEntity Saeule,0.5,5,0.5
      EntityColor Saeule, 111,111,111
      MoveEntity Saeule, -4,2,0
      EntityShininess Saeule,1
      
      
      Teppich=CreateCube()
      ScaleEntity Teppich, 8,0.001,8
      MoveEntity teppich, 3,-1.15,-6
      EntityColor teppich, 55,0,0
      r=1
      X=100
      
      Dim Regal(9)
      Regal(0)=CreateCube()
      ScaleEntity regal(0) ,0.5,0.05,2
      EntityColor Regal(0), 111,211,111
      MoveEntity Regal(0),6.6,0,-4
      EntityShininess Regal(0),1
      For i= 1 To 4
         Regal(i)=CopyEntity(Regal(0))
         MoveEntity regal(i),0,i*0.5,0
      Next


; Spiegel Init !!!!!!!!!!!!!!!!

      InitMirror


; Hauptschleife

Repeat
      PointEntity camera, wand(2)
      ScaleEntity Kommode, 1,1,1

      RenderMirror Camera, MirrorCamera
      UpdateWorld
      RenderWorld


      Color 202,161,114
   
      Text 700,400,"W A L L   M I R R O R    D E M O "
      
      Text 700,460,"<E> and <R> to rotate Mirror"
      Text 700,490,"<+> and <-> to up/down camera"
      Text 700,520,"<curosr keys>  to move camera"
      Text 700,580,"<ESC>  to Quit"
      Text 100,680,"(C)   M I D I M A S T E R   M U S I C   E D U C A T I O N   S O F T W A R E   www.midimaster.de "
      Flip
   
      ; Schublade auf/zu
         If (x>100) And (r=1) Then
            r=-1.0
      
         Else If (x<0) Then
            r=1
         EndIf
         x=x+r
         MoveEntity schub(3),0,0,r*0.007
         ;DebugLog x + " " + r


      ;Steuerung
      a%=GetKey()
      If a>0 Then
            DebugLog "Key: " + a
      ;      EndIf
            If a=31 Then
               MoveEntity camera,0.3,0,0
            EndIf
            If a=30 Then
               MoveEntity camera,-0.3,0,0
            EndIf
            If a=28 Then
               MoveEntity camera,0,0,0.3
            EndIf
            If a=29 Then
               MoveEntity camera,0,0,-0.3
            EndIf
            If a=45 Then
               MoveEntity camera,0,-0.3,0
            EndIf
            If a=43 Then
               MoveEntity camera,0,0.3,0
            EndIf
            If a=114 Then
               TurnEntity camera,0,3,0
            EndIf
            If a=108 Then
               TurnEntity camera,0,-3,0
            EndIf
            If a=101 Then
               TurnEntity mirror,0,-3,0
            EndIf
            If a=114 Then
               TurnEntity mirror,0,3,0
            EndIf
            
            If a=27 Then
               End
            EndIf
      EndIf
Forever







; Spiegel-Funktionen



Function InitMirror()

      mirror = CreatePivot()
      MirrorCamera = CreateCamera()
      ;   ScaleEntity MirrorCamera, 0.02,0.02,0.02
      CameraViewport MirrorCamera,700,100,256,256

      PositionEntity mirror, 3,1,-1
      RotateEntity mirror,0,90,0

      ; die Scheibe:
      MirrorPlan=CreateCube(mirror)
      ScaleEntity mirrorPlan,1,1,0.0003
      MirrorTexture = CreateTexture(256,256,256)
      ScaleTexture MirrorTexture,1,1
      EntityFX mirrorPlan,9
      EntityTexture mirrorPlan,MirrorTexture      
      
      ; nur schöner Rahmen:
      SpiegelRahmen=CreateCube(mirror)
      ScaleEntity Spiegelrahmen,1.05,0.05,0.05
      MoveEntity SpiegelRahmen,0,1,0
      EntityColor SpiegelRahmen, 65,25,0
      
      SpiegelRahmen2=CopyEntity(SpiegelRahmen,mirror)
      MoveEntity SpiegelRahmen2,0,-2,0

      SpiegelRahmen3=CreateCube(mirror)
      ScaleEntity Spiegelrahmen3,0.05,2.0,0.05
      MoveEntity SpiegelRahmen3,1,-0.5,0
      EntityColor SpiegelRahmen3, 65,25,0
      
      SpiegelRahmen4=CopyEntity(SpiegelRahmen3,mirror)
      MoveEntity SpiegelRahmen4,-2,0,0

End Function




Function RenderMirror(Camera,MirrorCamera)

        ;Kamera umschalten
         CameraProjMode Camera,0
         CameraProjMode MirrorCamera,1
         
      ; Spiegel-Kamera an den Spiegel
         PositionEntity MirrorCamera, EntityX(Mirror),EntityY(Mirror),EntityZ(Mirror)
         CameraZoom MirrorCamera,1.5
          HideEntity Mirror
      ; Winkel zwischen Original-Kamera und Spiegel feststellen
         ; alte Werte merken
         Winkel_Y=EntityYaw(Camera)
         Winkel_X=EntityPitch(Camera)
         PointEntity Camera,MirrorCamera

      ; D I E  F O R M E L :
      RotateEntity MirrorCamera, 360-2*EntityPitch(Mirror)+EntityPitch(Camera),180+2*EntityYaw(Mirror)-EntityYaw(Camera),0
      
      ; Foto davon auf MirrorPlan
         UpdateWorld
         RenderWorld
         ;seitenverkehrt
         For i=1 To 256
            CopyRect 700+i,100,1,256,256-i,0,BackBuffer(),TextureBuffer(MirrorTexture)
         Next
      ; Original Kamera wieder zurückrichten
          ShowEntity Mirror
         RotateEntity Camera,Winkel_X,winkel_Y,0
         CameraProjMode Camera,1
         CameraProjMode MirrorCamera,0
End Function




Ziel: Der Spiegel kann von jedem für beliebige Räume benutzt werden und soll in jedem Programm funktionieren.

Derzeit funktioniert:
    - die freie Positionierung im Raum verändert das Spiegelbild korrekt
    - Drehen des Spiegels verändert Spiegelbild korrekt
    - beliebige Kamera-Position verändert Spiegelbild korrekt
    - abhängig von diesen 3 Faktoren, wandert das Spiegelbild optisch korrekt mit


noch nicht korrekt:


    - Neigen des Spiegels an Z-Achse noch nicht implementiert
    - "umgekehrter Zoom-Effekt" beim Näherkommen/Entfernen der Kamera noch nicht implementiert
    - Kapselung in Klasse noch nicht durchgeführt
  • Zuletzt bearbeitet von Midimaster am Mo, Okt 19, 2009 13:50, insgesamt 2-mal bearbeitet

BladeRunner

Moderator

BeitragMo, Okt 19, 2009 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wichtig: Galeriebilder nur für Showcaseprojekte oder ein einzelnes für ein weit fortgeschrittenes, optisch ansprechendes Projekt. Alles andere bitte ins Dateiarchiv!

Bild wurde daher aus der Galerie gelöscht. Bitte benutze das Archiv für solche WiP-Shots.
Danke.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Nicdel

BeitragMo, Okt 19, 2009 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessant. Kein Cubemapping sondern nur eine weitere Camera. Du könntest es auch mal mit Cubemapping versuchen, siehe SetCubeFace.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

ToeB

BeitragMo, Okt 19, 2009 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
@Nicel : Aber wenn du eine Echtzeit reflexion aller Objecte und der Aktuellen Positionen haben willst, musst du zwangsweise das Bild zweimal rendern...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group