Echter Wandspiegel
Übersicht

![]() |
MidimasterBetreff: Echter Wandspiegel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: (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:
- 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:
- "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
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group