[B3D] Single Surface Wolken (realistisch)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Krischan

Betreff: [B3D] Single Surface Wolken (realistisch)

BeitragDo, Sep 20, 2007 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich gebe mal wieder was zum Besten. Herausgekommen ist eine kleine Wolkendemo. Die Mediendateien kann man sich entweder selbst machen oder die aus meiner Demo herunterladen. Bei mir auf meinem alten Notebook bekomme ich so ~200FPS:

Code: [AUSKLAPPEN]
; ----------------------------------------------------------------------------------------------------------------------
;
; Single Surface Wolken Demo
; ==========================
;
; by Krischan 20.09.2007
; Version 1.0
;
; Eine kleine Demo mit 8 verschiedenen Wolkenlayern. Einzelne Quads werden in je eine Surface hinzugefügt und diese dann
; mit der Wolkentextur gemappt. Die "Bewegung" der Layer erfolgt durch Löschung der Surface und Neuanlage der Quads pro
; Durchgang. Wenn das jemand eleganter lösen kann, nur her damit.
;
; Tasten:
; 1-8         Wolkenlayer 1-8 ausblenden
; F1         Jeden Layer zufällig einfärben
; SPACE         Zufälliges Lichtambiente erzeugen
;
; Steuerung:
; Maus         Herumschauen
; LMB         Vorwärts
; RMB         Rückwärts
;
; ----------------------------------------------------------------------------------------------------------------------
;
; Thx to hectic aus dem Blitzforum für seinen "Skyhaubengenerator", der hier Verwendung findet sowie Mr. Keks für seine
; Function "AddToSurface" sowie Pongo aus der BB-Community für seine tollen Wolkentexturen (die ich etwas geändert habe)
;
; Skyhaubengenerator:   http://www.blitzforum.de/forum/viewtopic.php?t=21983
; AddToSurface:      http://www.blitzforum.de/forum/viewtopic.php?t=20181
; Wolkentexturen:      http://www.andimages.com/proofs/pongo/blitz/clouds.zip
;
; ----------------------------------------------------------------------------------------------------------------------


; Variablen
; ----------------------------------------------

layer   =   8         ; Anzahl Wolkenlayer (je Layer eine Wolkentextur)
max      =   25         ; Anzahl Wolken pro Layer
r      =   1000      ; Range des Wolkenfeldes (-r,r)
h1      =   20         ; Starthöhe der Wolken
h2      =   100         ; Maximale Höhe der Wolken (je höher, desto mehr Range erforderlich!)
m#      =   0.05      ; Geschwindigkeit der Wolken
scale1   =   20         ; Minimalgrösse einer Wolke
scale2   =   50         ; Maximalgrosse einer Wolke (zu grosse Wolken gehen auf FPS!)
rot1   =   -180      ; Rotationswinkel Start
rot2   =   180         ; Rotationswinkel Ende
move#   =   0.05      ; Mausgeschwindigkeit
var#   =   2.5         ; Varianz der Geschwindigkeit (1.0 = alle gleich schnell)
skyh   =   0         ; Höhe der Skybox über der Kamera
sky$   = "skygen.png"   ; Skytextur


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


; Alles zufällig
; ----------------------------------------------
SeedRnd MilliSecs()


; Felder dimensionieren
; ----------------------------------------------
Dim x#(max,layer),y#(max,layer),z#(max,layer),sc#(max,layer),ro#(max,layer),mesh(layer),surf(layer),tex(layer),hl(layer)


; Layer vorbereiten, Texturen laden und zuweisen
; ----------------------------------------------
pivot = CreatePivot()
For i=1 To layer

   mesh(i)=CreateMesh()
   surf(i)=CreateSurface(mesh(i))
   tex(i)=LoadTexture("cloud"+i+".png",1+2)
   
   For j=1 To max

      x#(j,i)=Rnd(-r,r)            ; X-Position
      y#(j,i)=Rnd(h1,h2)         ; Y-Position
      z#(j,i)=Rnd(-r,r)            ; Z-Position
      sc#(j,i)=Rnd(scale1,scale2)   ; Grösse
      ro#(j,i)=Rnd(rot1,rot2)      ; Rotation

   Next
   
   EntityTexture mesh(i),tex(i)
   EntityParent mesh(i),pivot
   hl(i)=1

Next


; Himmel
; ----------------------------------------------
sky_mesh=InitSkyHaube(sky$)


; Kamera, Licht und Nebel
; ----------------------------------------------
AmbientLight 255,255,255
cam=CreateCamera()
PositionEntity cam,0,2,0
TurnEntity cam,0,90,0
CameraClsColor cam,255,255,255
CameraFogColor cam,255,255,255
CameraRange cam,1,r*2
CameraFogRange cam,0,r
CameraFogMode cam,True


; Eine Plane als Boden
; ----------------------------------------------
plane=CreatePlane()
PositionEntity plane,0,0,0
ptex=LoadTexture("grass.png")
EntityTexture plane,ptex
ScaleTexture ptex,4,4


; Mauszeiger in die Mitte
; ----------------------------------------------
MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2)


; Hauptschleife
; ----------------------------------------------
While Not KeyDown(1)

   ; Kamerabewegung
   TurnEntity cam,MouseYSpeed(),0,0
   RotateEntity cam, EntityPitch(cam),EntityYaw(cam)-MouseXSpeed(),0
   MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2)
   MoveEntity cam,0,0,MouseDown (1)*move#
   MoveEntity cam,0,0,MouseDown (2)*-move#
   
   ; Alle Layer neu berechnen
   For i=1 To layer
      
      If KeyHit(1+i) Then hl(i)=1-hl(i)
      If hl(i)=0 Then HideEntity mesh(i) Else ShowEntity mesh(i)

      If hl(i)=1 Then
         ClearSurface(surf(i),1,1)
         For j=1 To max
            x#(j,i)=x#(j,i)+m#*Rnd(1,var#) : If x#(j,i)>=r Then x#(j,i)=-r : z#(j,i)=Rnd(-r,r)
            c=CreateQuad()
            PositionEntity c,x#(j,i),y#(j,i),z#(j,i)
            ScaleEntity c,sc#(j,i),sc#(j,i),sc#(j,i)
            RotateEntity c,90,0,ro#(j,i)
            AddToSurface(c,surf(i),mesh(i))
            FreeEntity c
         Next
      EndIf

   Next
   
   ; SPACE = zufälliges Farbambiente erzeugen
   If KeyHit(57) Then
      c1=Rand(0,255) : c2=Rand(0,255) : c3=Rand(0,255)
      EntityColor sky_mesh,c1,c2,c3
      EntityColor plane,c1,c2,c3
      CameraClsColor cam,c1,c2,c3
      CameraFogColor cam,c1,c2,c3
      For i=1 To layer : EntityColor mesh(i),c1,c2,c3 :    Next
   EndIf
   
   ; F1 = Layer farbig unterscheiden
   If KeyHit(59) Then For i=1 To layer : EntityColor mesh(i),Rand(0,255),Rand(0,255),Rand(0,255) : Next

   ; Sky und Pivot an Kamera hängen, die Layer werden nur leicht bewegt
   cx#=EntityX(cam) : cy#=EntityY(cam) : cz#=EntityZ(cam)
   PositionEntity pivot,cx#-(cx#/100),cy#-(cy#/100),cz#-(cz#/100)
   PositionEntity sky_mesh,cx#,cy#+25,cz#

   RenderWorld
   
   Text 0,0,"Tris: "+TrisRendered()+" Wolken: "+(layer*max)
   For i=1 To layer
      If hl(i)=1 Then t$="sichtbar" Else t$="unsichtbar"
      Text 0,(1+i)*16,"Layer "+i+": "+t$
   Next
   
   Flip
   
Wend


; -----------------------------------------------------------------
; Ein Mesh mit seinen Daten zu einer Single Surface hinzufügen
; -----------------------------------------------------------------
Function AddToSurface(mesh, surf,singlesurfaceentity)
   Local vert[2]
   For s = 1 To CountSurfaces(mesh)
      surface = GetSurface(mesh,s)     
      For i = 0 To  CountTriangles(surface)-1
         For i2 = 0 To 2
            oldvert = TriangleVertex(surface,i,i2)
            TFormPoint VertexX(surface,oldvert),VertexY(surface,oldvert),VertexZ(surface,oldvert), mesh,singlesurfaceentity
            vert[i2] = AddVertex(surf,TFormedX(),TFormedY(),TFormedZ(),VertexU(surface,oldvert),VertexV(surface,oldvert))
         Next
         AddTriangle(surf, vert[0], vert[1], vert[2])
      Next
   Next
End Function


; -----------------------------------------------------------------
; Ein einfaches Quad erstellen
; -----------------------------------------------------------------
Function CreateQuad()

   quad=CreateMesh()
   brush=CreateBrush(255,255,255)
   v=CreateSurface(quad,brush)
   FreeBrush brush

   AddVertex ( v,-3,3,0,1,0)
   AddVertex ( v,3,3,0,0,0)
   AddVertex ( v,-3,-3,0,1,1)
   AddVertex ( v,3,-3,0,0,1)

   AddTriangle( v,0,1,2)
   AddTriangle( v,3,2,1)

   FlipMesh(quad)

   Return quad

End Function


; -----------------------------------------------------------------
; Skyhaube laden
; -----------------------------------------------------------------
Function InitSkyHaube(sky$)

   ;Sky-Mesh-Erstellen
   sky_mesh=CreateMesh()
   skytex=LoadBrush(sky$,0,6,6)
   sky_face=CreateSurface(sky_mesh,skytex)

   ;Sky-Mesh-Zusammen-Stellen
   v0=AddVertex(sky_face,-3,0,-3,0,6)
   v1=AddVertex(sky_face,-3,0,+3,0,0)
   v2=AddVertex(sky_face,+3,0,+3,6,0)
   v3=AddVertex(sky_face,+3,0,-3,6,6)
   v4=AddVertex(sky_face,-1,1,-1,2,4)
   v5=AddVertex(sky_face,-1,1,+1,2,2)
   v6=AddVertex(sky_face,+1,1,+1,4,2)
   v7=AddVertex(sky_face,+1,1,-1,4,4)

   ;Sky-Mesh-Triangulieren
   AddTriangle(sky_face,v1,v0,v4)
   AddTriangle(sky_face,v1,v4,v5)
   AddTriangle(sky_face,v2,v1,v5)
   AddTriangle(sky_face,v2,v5,v6)
   AddTriangle(sky_face,v3,v2,v6)
   AddTriangle(sky_face,v3,v6,v7)
   AddTriangle(sky_face,v0,v3,v7)
   AddTriangle(sky_face,v0,v7,v4)
   AddTriangle(sky_face,v5,v4,v7)
   AddTriangle(sky_face,v7,v6,v5)

   ;Sky-Mesh-Standard-Größe
   ScaleMesh sky_mesh,100,100,100

   ; immer zuerst zeichnen
   EntityOrder sky_mesh,1
   Return sky_mesh

End Function

rctuner

BeitragDo, Sep 20, 2007 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
wo finde ich denn die Demo mit den Medien? Kannst du das nich komplett hochladen?

War wohl zu früh drann.. Hat er dann vermutlich editiert...
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]
  • Zuletzt bearbeitet von rctuner am Mi, Sep 26, 2007 21:28, insgesamt einmal bearbeitet
 

ChristianK

BeitragDo, Sep 20, 2007 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm, wie wär's mit dem Link oben?
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Xeres

Moderator

BeitragDo, Sep 20, 2007 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine wirklich schöne Sache, verdient den Ausdruck realistisch.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Steven

ehemals "Steven04"

BeitragFr, Sep 21, 2007 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, wirklich sehr sehr schick! Smile
Nur eine Frage: Was soll "Pivot" bringen? Ich kann keinen Sinn davon feststellen.

Mfg
Steven

Edit: Außerdem gibt es das Problem, dass die Wolken immer vor meinen "Baum-Sprites" dargestellt werden. WBuffer ist eingeschaltet. Kann man da etwas gegen machen?
 

Krischan

BeitragMo, Sep 24, 2007 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Steven04 hat Folgendes geschrieben:
Ja, wirklich sehr sehr schick! Smile
Nur eine Frage: Was soll "Pivot" bringen? Ich kann keinen Sinn davon feststellen. Edit: Außerdem gibt es das Problem, dass die Wolken immer vor meinen "Baum-Sprites" dargestellt werden. WBuffer ist eingeschaltet. Kann man da etwas gegen machen?


Das mit dem Pivot hatte ich vergessen zu reaktivieren, mit der falschen Darstellung solltest Du die mesh(1-x) mit Entityorder nach der Skybox und vor Deinen Objekten zeichnen lassen. Darüber hinaus habe ich den Code noch weiter verbessert, hier die Version 1.1 (benutzt dieselben Mediadateien wie die erste). Neuerungen sind im Header beschrieben. Und wer es ganz schnell haben will sollte nur einen Layer, den aber mit ca. 200 Wolken gestopft benutzen:

Code: [AUSKLAPPEN]
; ----------------------------------------------------------------------------------------------------------------------
;
; Single Surface Wolken Demo
; ==========================
;
; by Krischan 20.09.2007
; Version 1.1
;
; Eine kleine Demo mit 4 verschiedenen Wolkenlayern. Einzelne Quads werden in je eine Surface hinzugefügt und diese dann
; mit der Wolkentextur gemappt. Die "Bewegung" der Layer erfolgt durch Löschung der Surface und Neuanlage der Quads pro
; Durchgang. Wenn das jemand eleganter lösen kann, nur her damit.
;
; Tasten:
; 1-8         Wolkenlayer 1-8 ausblenden
; F1         Jeden Layer zufällig einfärben
; W            Wireframe-Modus an/aus
; SPACE         Zufälliges Lichtambiente erzeugen
;
; Steuerung:
; Maus         Herumschauen
; Mausrad      vor/zurück = Wolkengeschwindigkeit mehr/weniger
; LMB         aufwärts
; MMB         Wolkengeschwindigkeit Reset
; RMB         abwärts
; Pfeiltasten   vor/zurück/links/rechts
;
; ----------------------------------------------------------------------------------------------------------------------
;
; Thx to hectic aus dem Blitzforum für seinen "Skyhaubengenerator", der hier Verwendung findet sowie Mr. Keks für seine
; Function "AddToSurface" sowie Pongo aus der BB-Community für seine tollen Wolkentexturen (die ich etwas geändert habe)
;
; Skyhaubengenerator:   http://www.blitzforum.de/forum/viewtopic.php?t=21983
; AddToSurface:         http://www.blitzforum.de/forum/viewtopic.php?t=20181
; Wolkentexturen:      http://www.andimages.com/proofs/pongo/blitz/clouds.zip
;
; ----------------------------------------------------------------------------------------------------------------------
;
; Changelog 1.0 > 1.1
; ===================
;
; - ADD: Wireframe-Mode hinzugefügt (Taste W)
; - ADD: entfernungsabhängige Höhe eingebaut (ermöglicht niedrigeren Horizont und mehr Dreidimensionalität)
; - ADD: entfernungsabhängige Drehung eingebaut (rudimentär, sieht aber beinahe animiert aus)
; - ADD: zufällige Drehrichtung und Drehgeschwindigkeit der Wolken
; - ADD: Variable skysc für Skalierung des Sky
; - ADD: weiche Steuerung eingebaut
; - ADD: Plane"kollision" eingebaut
; - ADD: FPS Anzeige
; - ADD: Speedanzeige
; - ADD: Wolkengeschwindigkeit mit Mausrad beeinflussbar
; - ADD: Vsync Variable
;
; - FIX: "pivot" wurde nicht verwendet weil kein Quadparent vorhanden war :-)
; - FIX: Variable skyh wurde nicht verwendet
; - FIX: Wolken sind nicht mehr fullbright
; - FIX: weniger Layer verwendet (4 anstatt 8, sieht genauso gut aus und ist schneller)
; - FIX: Rotationswinkel eingegrenzt (45 anstatt 180 Grad)
; - FIX: Höhe angepasst (100 anstatt 20 Minimum, die Wolken waren zu nahe an der Kamera)
; - FIX: Flip ist nun nicht auf Vsync beschränkt
; - FIX: verschiedene Variablen auf optimale Werte gesetzt
;
; ----------------------------------------------------------------------------------------------------------------------


; Variablen
; ----------------------------------------------

Global cam, player,move#,m#,morg#,pos
Global cam_pitch#, cam_yaw#
Global mvx#,mvy#,mvz#,targetpitch#,targetyaw#

layer   =   4            ; Anzahl Wolkenlayer (je Layer eine Wolkentextur)
max      =   50            ; Anzahl Wolken pro Layer
r      =   1000         ; Range des Wolkenfeldes (-r,r)
h1      =   100            ; Starthöhe der Wolken
h2      =   150            ; Maximale Höhe der Wolken (je höher, desto mehr Range erforderlich!)
m#      =   0.05         ; Geschwindigkeit der Wolken
scale1   =   25            ; Minimalgrösse einer Wolke
scale2   =   75            ; Maximalgrosse einer Wolke (zu grosse Wolken gehen auf FPS!)
rot1   =   -45            ; Rotationswinkel Start
rot2   =   45            ; Rotationswinkel Ende
rs#      =   0.1            ; Rotationsgeschwindigkeit
move#   =   0.01         ; Spielergeschwindigkeit
var#   =   2.5            ; Varianz der Geschwindigkeit (1.0 = alle gleich schnell)
skyh#   =   1.75         ; Höhe der Skybox über der Kamera
sky$   =   "skygen.png"   ; Skytextur
skysc   =   100            ; Skygrösse
vsync   =   True         ; Vsync True oder False


Graphics3D 1024,768,32,1


; Alles zufällig
; ----------------------------------------------
SeedRnd MilliSecs()


; Felder dimensionieren
; ----------------------------------------------
Dim x#(max,layer),y#(max,layer),z#(max,layer),sc#(max,layer),ro#(max,layer),rz#(max,layer),mesh(layer),surf(layer),tex(layer),hl(layer)


; Layer vorbereiten, Texturen laden und zuweisen
; ----------------------------------------------
pivot = CreatePivot()
For i=1 To layer

   mesh(i)=CreateMesh()
   surf(i)=CreateSurface(mesh(i))
   tex(i)=LoadTexture("cloud"+i+".png",2)
   
   For j=1 To max

      x#(j,i)=Rnd(-r,r)         ; X-Position
      y#(j,i)=Rnd(h1,h2)         ; Y-Position
      z#(j,i)=Rnd(-r,r)         ; Z-Position
      sc#(j,i)=Rnd(scale1,scale2)   ; Grösse
      ro#(j,i)=Rnd(rot1,rot2)      ; Rotation
      rz#(j,i)=Rand(-1,1)         ; Rotationsrichtung

   Next
   
   EntityTexture mesh(i),tex(i)
   EntityParent mesh(i),pivot
   hl(i)=1

Next


; Himmel
; ----------------------------------------------
sky_mesh=InitSkyHaube(sky$,skysc)



; Kamera, Licht und Nebel
; ----------------------------------------------
AmbientLight 255,255,255
player=CreatePivot()
targetyaw=90
cam=CreateCamera(player)
PositionEntity cam,0,2,0
CameraClsColor cam,255,255,255
CameraFogColor cam,255,255,255
CameraRange cam,1,r*2
CameraFogRange cam,0,r
CameraFogMode cam,True
c1=255 : c2=255 : c3=255


; Eine Plane als Boden
; ----------------------------------------------
plane=CreatePlane()
PositionEntity plane,0,0,0
ptex=LoadTexture("grass.png")
EntityTexture plane,ptex
ScaleTexture ptex,4,4


; Mauszeiger in die Mitte
; ----------------------------------------------
MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2)
morg#=m#


; Hauptschleife
; ----------------------------------------------
While Not KeyDown(1)

   ; Wolkengeschwindigkeit beeinflussen
   If pos Then m#=m#+(pos/100.0)
   If m#<=0 Then m#=0

   ; Alle Layer neu berechnen
   For i=1 To layer
      
      If KeyHit(1+i) Then hl(i)=1-hl(i)
      If hl(i)=0 Then HideEntity mesh(i) Else ShowEntity mesh(i)

      If hl(i)=1 Then
         ClearSurface(surf(i),1,1)
         For j=1 To max
            x#(j,i)=x#(j,i)+m#*Rnd(1,var#) : If x#(j,i)>=r Then x#(j,i)=-r : z#(j,i)=Rnd(-r,r) : rz(j,i)=Rand(-1,1)
            c=CreateQuad(pivot)
            dist#=Sqr((EntityX(cam,0)-x#(j,i))^2+(EntityZ(cam,0)-z#(j,i))^2)/Sqr(h2-h1)
            PositionEntity c,x#(j,i),y#(j,i)-dist#,z#(j,i)
            ScaleEntity c,sc#(j,i),sc#(j,i),sc#(j,i)
            RotateEntity c,90,x#(j,i)*rz(j,i)*rs#,ro#(j,i)
            AddToSurface(c,surf(i),mesh(i))
            FreeEntity c
         Next
      EndIf
      
   Next
   
   ; SPACE = zufälliges Farbambiente erzeugen
   If KeyHit(57) Then
      c1=Rand(0,255) : c2=Rand(0,255) : c3=Rand(0,255)
      EntityColor sky_mesh,c1,c2,c3
      EntityColor plane,c1,c2,c3
      CameraClsColor cam,c1,c2,c3
      CameraFogColor cam,c1,c2,c3
      For i=1 To layer : EntityColor mesh(i),c1,c2,c3 :    Next
   EndIf
   
   ; F1 = Layer farbig unterscheiden
   If KeyHit(59) Then For i=1 To layer : EntityColor mesh(i),Rand(0,255),Rand(0,255),Rand(0,255) : Next
   
   ; W = Wireframe an/aus
   If KeyHit(17) Then
      wf=1-wf : WireFrame wf
      If wf=1 Then CameraClsColor cam,128,128,128 Else CameraClsColor cam,c1,c2,c3
   EndIf

   ; Spielebewegung
   Playercontrols()

   ; Sky und Pivot an Spielepivot hängen, die Layer werden nur leicht bewegt
   cx#=EntityX(player) : cy#=EntityY(player) : cz#=EntityZ(player)
   PositionEntity pivot,cx#,cy#-(cy#/50.0),cz#
   PositionEntity sky_mesh,cx#,cy#+skyh#,cz#
   
   RenderWorld

   ; FPS counter
   FPS_C=FPS_C+1
   If ms<MilliSecs()
      ms=MilliSecs()+1000
      FPS=FPS_C
      FPS_C=0
   EndIf
      
   ; Textausgabe
   wl=0
   For i=1 To layer
      If hl(i)=1 Then t$="sichtbar" : wl=wl+1 Else t$="unsichtbar"
      Color 0,0,0 : Text 1,1+(1+i)*16,"Layer "+i+": "+t$
      Color 255,255,255 : Text 0,(1+i)*16,"Layer "+i+": "+t$
   Next
   Color 0,0,0 : Text 1,1,"FPS: "+FPS+" Tris: "+TrisRendered()+" Wolken: "+(wl*max)+"/"+(layer*max)+" Speed: "+m#
   Color 255,255,255 : Text 0,0,"FPS: "+FPS+" Tris: "+TrisRendered()+" Wolken: "+(wl*max)+"/"+(layer*max)+" Speed: "+m#
      
   Flip vsync
   
Wend


; -----------------------------------------------------------------
; Ein Mesh mit seinen Daten zu einer Single Surface hinzufügen
; -----------------------------------------------------------------
Function AddToSurface(mesh, surf,singlesurfaceentity)
   Local vert[2]
   For s = 1 To CountSurfaces(mesh)
      surface = GetSurface(mesh,s)     
      For i = 0 To  CountTriangles(surface)-1
         For i2 = 0 To 2
            oldvert = TriangleVertex(surface,i,i2)
            TFormPoint VertexX(surface,oldvert),VertexY(surface,oldvert),VertexZ(surface,oldvert), mesh,singlesurfaceentity
            vert[i2] = AddVertex(surf,TFormedX(),TFormedY(),TFormedZ(),VertexU(surface,oldvert),VertexV(surface,oldvert))
         Next
         AddTriangle(surf, vert[0], vert[1], vert[2])
      Next
   Next
End Function


; -----------------------------------------------------------------
; Ein einfaches Quad erstellen
; -----------------------------------------------------------------
Function CreateQuad(parent=0)

   quad=CreateMesh(parent)
   brush=CreateBrush(255,255,255)
   v=CreateSurface(quad,brush)
   FreeBrush brush

   AddVertex ( v,-3,3,0,1,0)
   AddVertex ( v,3,3,0,0,0)
   AddVertex ( v,-3,-3,0,1,1)
   AddVertex ( v,3,-3,0,0,1)

   AddTriangle( v,0,1,2)
   AddTriangle( v,3,2,1)

   FlipMesh(quad)

   Return quad

End Function


; -----------------------------------------------------------------
; Skyhaube laden
; -----------------------------------------------------------------
Function InitSkyHaube(sky$,skysc)

   ;Sky-Mesh-Erstellen
   sky_mesh=CreateMesh()
   skytex=LoadBrush(sky$,0,6,6)
   sky_face=CreateSurface(sky_mesh,skytex)

   ;Sky-Mesh-Zusammen-Stellen
   v0=AddVertex(sky_face,-3,0,-3,0,6)
   v1=AddVertex(sky_face,-3,0,+3,0,0)
   v2=AddVertex(sky_face,+3,0,+3,6,0)
   v3=AddVertex(sky_face,+3,0,-3,6,6)
   v4=AddVertex(sky_face,-1,1,-1,2,4)
   v5=AddVertex(sky_face,-1,1,+1,2,2)
   v6=AddVertex(sky_face,+1,1,+1,4,2)
   v7=AddVertex(sky_face,+1,1,-1,4,4)

   ;Sky-Mesh-Triangulieren
   AddTriangle(sky_face,v1,v0,v4)
   AddTriangle(sky_face,v1,v4,v5)
   AddTriangle(sky_face,v2,v1,v5)
   AddTriangle(sky_face,v2,v5,v6)
   AddTriangle(sky_face,v3,v2,v6)
   AddTriangle(sky_face,v3,v6,v7)
   AddTriangle(sky_face,v0,v3,v7)
   AddTriangle(sky_face,v0,v7,v4)
   AddTriangle(sky_face,v5,v4,v7)
   AddTriangle(sky_face,v7,v6,v5)

   ;Sky-Mesh-Standard-Größe
   ScaleMesh sky_mesh,skysc,skysc,skysc

   ; immer zuerst zeichnen
   EntityOrder sky_mesh,1
   Return sky_mesh

End Function


; -----------------------------------------------------------------
; vertikale Begrenzung der Maus
; -----------------------------------------------------------------
Function ClampValue(Original#, low#, high#)
   If Original<low  Then Return low
   If Original>high Then Return high
   Return Original
End Function


; --------------------------------------------------------------------------------------------------
; Spielersteuerung
; --------------------------------------------------------------------------------------------------
Function PlayerControls()

   mxspd# = MouseXSpeed()*0.25
   myspd# = MouseYSpeed()*0.25

   MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

   targetpitch = targetpitch + myspd
   targetpitch = ClampValue(targetpitch, -85,85)
   targetyaw = targetyaw - mxspd   

   cam_pitch = cam_pitch + (targetpitch - cam_pitch)/8.0
   cam_yaw = cam_yaw + (targetyaw - cam_yaw)/8.0
   
   RotateEntity player,0,cam_yaw,0
   RotateEntity cam,cam_pitch,0,0

   If KeyDown(200) Then mvz=mvz+move#
   If KeyDown(208) Then mvz=mvz-move#
   If KeyDown(205) Then mvx=mvx+move#
   If KeyDown(203) Then mvx=mvx-move#
   
   If MouseDown(1) Then mvy=mvy+move#
   If MouseDown(2) And EntityY(player)>0 Then mvy=mvy-move#
   If MouseDown(3) Then m#=morg#
   pos=MouseZSpeed()
   
   TranslateEntity player,0,mvy,0
   MoveEntity player,mvx,0,mvz

   ; weiche Bewegung
   mvx=mvx/1.01
   mvy=mvy/1.01
   mvz=mvz/1.01

   ; Plane erreicht? Stop
   If (EntityY(player)-mvy#)<0 Then PositionEntity player,EntityX(player),0,EntityZ(player)
   
End Function

FireballFlame

BeitragSo, Nov 11, 2007 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke! Eine sehr schöne Sache, die wunderbar in mein aktuelles Projekt passt! ^^
Ich habe allerdings noch einen Bug gefunden: Die Geschwindigkeit aller Wolken wird in jedem Hauptschleifendurchlauf neu geändert. Das führt dazu, dass sich die Wolken im Großen und Ganzen immer gleichschnell bewegen, egal was man einstellt, dafür wird die Bewegung bei höherer Varianz stark ruckelig.

Die Lösung ist aber einfach:

1.: Die Zeile Code: [AUSKLAPPEN]
Dim x#(max,layer),y#(max,layer),z#(max,layer),sc#(max,layer),ro#(max,layer),rz#(max,layer),mesh(layer),surf(layer),tex(layer),hl(layer)
ergänzen durch Code: [AUSKLAPPEN]
,wolken_tempo#(max,layer)

2.: Die Zeile Code: [AUSKLAPPEN]
      wolken_tempo(j,i)=Rnd(1,var#)         ; Geschwindigkeit der Wolke
hinzufügen unter der Zeile Code: [AUSKLAPPEN]
      rz#(j,i)=Rand(-1,1)         ; Rotationsrichtung

3.: Die Zeile Code: [AUSKLAPPEN]
            x#(j,i)=x#(j,i)+m#*Rnd(1,var#) : If x#(j,i)>=r Then x#(j,i)=-r : z#(j,i)=Rnd(-r,r) : rz(j,i)=Rand(-1,1)
ändern in Code: [AUSKLAPPEN]
            x#(j,i)=x#(j,i)+m#*wolken_tempo(j,i) : If x#(j,i)>=r Then x#(j,i)=-r : z#(j,i)=Rnd(-r,r) : rz(j,i)=Rand(-1,1)

Surprised

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group