EntityAutoFade bei SingleSurface Gras

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

blitzuser34

Betreff: EntityAutoFade bei SingleSurface Gras

BeitragMo, März 09, 2009 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe mal eine Frage: wie mache ich bei Single Surface Gras/Bäumen eine Art EntityAutoFade???

Blitzuser34

peacemaker

BeitragMo, März 09, 2009 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
VertexColor

Ist aber eher unsinnig wie ich finde... dann würd ich dir eher empfehlen einfach Quadgruppen so 10x10 meter oder so zu nehmen, und dort einfach EntityAlpha setzen,

mfG
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/

ToeB

BeitragDi, März 10, 2009 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast ja bei SingleSurface über TFormPoint eine Locale X/Y/Z Koordinaten.
Die Z-Koordinaten ist ja die entfernung zur Camera. Jetzt kannst du einfach zwei konstante festlegen :

Code: [AUSKLAPPEN]
Const GrassAutoFade_Min = 20  ;Ab 20 soll es anfangen
Const GrassAutoFade_Max = GrassAutoFade_Min + 10 ;Und bei 20 + 10 soll es aufhören


So jetzt ist es eine einfache Prozent-Rechnung :
Zitat:
p% = (P / G) * 100

p% = Prozent, P = der Teil des Gesammten, G = das Gesammte

Wir brauchen aber nicht werte von 1 bis 100 sondern von 0 bis 1, also
Zitat:
p% = (P / G)


So und dann machst du Folgendes :

Code: [AUSKLAPPEN]
LocalZPos = TFormedZ()
If LocalZPos > GrassAutoFade_Min And LocalZPos < GrassAutoFade_Max
GrassAutoFade_Abs# = GrassAutoFade_Max-GrassAutoFade_Min
Camera_Abs# = GrassAutoFade_Max - LocalZPos
Alpha# = 1 - ( Camera_Abs / GrassAutoFade_Abs )
VertexColor(v1,255,255,255,Alpha#)
VertexColor(v2,255,255,255,Alpha#)
VertexColor(v3,255,255,255,Alpha#)
VertexColor(v4,255,255,255,Alpha#)
EndIf


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!

blitzuser34

Betreff: Single Surface

BeitragSa, März 14, 2009 11:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich weiß dass ist nicht das orginale Thema, aber ich hab noch ne Frage:

Das Single Surface viel schneller ist als einzelne Surface hab ich gemerkt(auch wenn ichs blöd find.)
Ich möchte jedoch meine Bäume aus tree[d] weiter verwenden(wenn möglich auch animiert).

Mit AddMesh kann ich ja das Mash hinzufügen. Jch schätze jedoch, dass dann die Surfaces einfach hinzugefügt werden, was ja dann keinen Sinn macht.

Muss ich mir jetzt ne eigene Ladefunktion für die Bäume schreiben?

Mfg
Blitzuser34
 

Krischan

BeitragSo, März 15, 2009 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ein Mesh mit allen Eigenschaften zu einer Surface hinzuzufügen geht z.B. so:

mesh = das Mesh welches hinzugefügt werden soll
surf = die Surface der singlesurfaceentity auf die hinzugefügt werden soll
singlesurfaceentity = das dazugehörige Mesh

Code: [AUSKLAPPEN]
Function AddToSurface(mesh, surf,singlesurfaceentity)
   
   Local vert%[2],vr%[2],vg%[2],vb%[2],va#[2]
   Local surface%,oldvert%,i%,i2%,s%
   
   surface = GetSurface(mesh,1)
   For i = 0 To CountTriangles(surface)-1
      For i2 = 0 To 2
         oldvert = TriangleVertex(surface,i,i2)
         vr[i2]=VertexRed(surface,oldvert)
         vg[i2]=VertexGreen(surface,oldvert)
         vb[i2]=VertexBlue(surface,oldvert)
         va[i2]=VertexAlpha#(surface,oldvert)
         
         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))
         VertexColor surf,vert[i2],vr[i2],vg[i2],vb[i2],va[i2]
      Next
      
      AddTriangle(surf, vert[0], vert[1], vert[2])
      
   Next
   
End Function

Das Ausgangsmesh sollte halt nur eine Surface haben, sonst muss man die Funktion etwas umbauen.

blitzuser34

BeitragSo, März 22, 2009 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

um noch mal auf das Gras zurückzukommen:

Wenn ich das mit Alpha ausblende ist das langsamer wie wenn ich die Surface einfach so rendere. Wie kann ich dann das Gras ausfaden, ohne dass es langsamer wird?

Ach ja: ein Grasquad muss ja den gleichen Winkel haben wie die Kamera. Wie mache ich das? Weil VertexCoords ist bei 20000 Vertex ein bisschen langsam.

MFG
Blitzuser34
 

Matthias

BeitragSo, März 22, 2009 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Ich denke es kommt auf die Technick an.

Du könntest zb nur alle 100ms dein Gras neu zur camera ausrichten.
Oder.
Immer nur ein Teil. Also jeden Mainloop anstatt alle nur 1/4. So das du nur 5000 Ausrichten mußt anstatt 20000.

Du könntest es auch so machen das immer nur neue GrassQuads angesetzt/gelöscht werden,und zur Camera gedreht werden wenn du deine Camera bewegst oder drehst.

Aber am besten wäre eine Mischung aus alles. Laughing

ToeB

BeitragSo, März 22, 2009 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
oder nur wirklich die sprites updaten die sichtbar sind... Und das sind meinstens nur so 100-200...

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!

blitzuser34

BeitragSo, März 22, 2009 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe meine Faderoutine jetzt so optimiert, dass es speedtechnisch keinen Unterschied macht.

Die Routine habe ich durch simple Rechenumstellungen wie aus a^2 einfach a*a zu machen oder keine Floats zu verwenden von 42 auf 7ms gekürzt. Auch wird sie nur alle 100ms durchgeführt.

Wie kann ich jetzt die Quads zur Kamera ausrichten? Meine bisherige Routine sieht so aus:

Code: [AUSKLAPPEN]
   If MilliSecs()-updatetime>100 Then
      For i = 0 To anzahl-1
         For i2 = 0 To 2
            oldvert=TriangleVertex(Gras1Surface,i,i2)
            
            rechnung1=VertexX(Gras1Surface,oldvert)-EntityX(camera1)
            rechnung2=VertexZ(Gras1Surface,oldvert)-EntityZ(camera1)
            
            dist=Sqr(rechnung1*rechnung1+rechnung2*rechnung2)
            
            If dist<=15 Then VertexColor Gras1Surface,oldvert,255,255,255,1
            If dist>15 Then VertexColor Gras1Surface,oldvert,255,255,255,0
         Next
      Next
      updatetime=MilliSecs()
   EndIf


MFG
Blitzuser34

ToeB

BeitragSo, März 22, 2009 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Und wo beziehst du die Y-Achse mit ein oO ?

Du hast doch irgentwo den code wo das Grass sich der Camera zuwendet (TformPoint)... Wenn du die ZAchse nimmst (TFormedZ()) dann hast du atomatisch den abstand zur Camera... Ohne irgentwelche SQR functionen...

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!

blitzuser34

BeitragSo, März 22, 2009 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Die Y-Achse ist meiner Meinung nach unwichtig.

Bis jetzt wendet sich das Gras nicht der Kamera zu. Deswegen frag ich ja.

TFormedZ() ist der Abstand???? Aber nur wenn die Kamera einen Winkel von 0° hat.

Mfg
Blitzuser34

ToeB

BeitragSo, März 22, 2009 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
nein...

Ich erklärs dir mal Wink

Du nimmst dein Mesh und hängst es an die Camera
Code: [AUSKLAPPEN]
Mesh = CreateMesh(Camera)


Jetzt kannst du in der Schleife die Globalen "Grass"-Positionen mithilfe von TFormPoint in Locale umwandlen :
Code: [AUSKLAPPEN]
TFormPoint(Grass_x,Grass_y,Grass_z,0,Camera)

so jetzt fragst du die Koordianten ab :
Code: [AUSKLAPPEN]
ZPos# = TFormedZ()
If ZPos > 0 ;Wenn der abstand zur camera größer als 0 ist...
XPos = TFormedX()
YPos = TFormedZ()
v0 = AddVertex(surf,XPos-Scale,YPos-Scale,ZPos,0,0)
...
Endif


So jetzt kannst du die VertexCoordinaten an X/Y/Z positionieren, das grass dreht sich zur camera und du hast den abstand zur camera. Jetzt kannst du auch einfach das autofading einbauen...


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!

blitzuser34

BeitragSo, März 22, 2009 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Sorry, aber ich verstehen nicht was du damit meinst. Hast du vielleicht einen Beispielcode/Pseudocode?

Mfg
Blitzuser34

ToeB

BeitragSo, März 22, 2009 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ich hab das mal für das Project "dronewars" geschrieben :

Code: [AUSKLAPPEN]
Graphics3D 1024,768,16,1
SetBuffer BackBuffer()


Const MAXOBJ = 15000
Const OBJRANGE = 10
Const OBJAUTOFADE = 10
Global ObjUpdateCount = 0,ObjUpdate = 0
Dim Obj#(MAXOBJ,4)


camera=CreateCamera()
   CameraClsColor camera,182,159,126
   CameraFogColor camera, 182,159,126
   CameraFogRange camera, 1,450
   CameraFogMode camera,1
   
terr=LoadTerrain( "heightmap_256.bmp" )
   Rad# = Int(TerrainSize(terr))
   ScaleEntity terr,1000/Rad,70,1000/Rad
   TerrainDetail terr,4000,0
   TerrainShading terr,True
   PositionEntity terr,-Rad*2,0,-Rad*2
   
tex=LoadTexture( "terrain-1.jpg" )
   ScaleTexture tex,50,50
   EntityTexture terr,tex
   EntityType terr,SCENE

   
   
Global ObjMesh = CreateMesh(camera)
Global ObjSurf = CreateSurface(ObjMesh)
Global ObjText = LoadTexture("Obj.PNG",4)
   EntityTexture ObjMesh,ObjText
   EntityFX ObjMesh,1+2+8+32
   Rad# = Rad*2
   For i = 0 To MAXOBJ
      Obj(i,0) = Rnd(-Rad,Rad)
      Obj(i,2) = Rnd(-Rad,Rad)      
      Obj(i,1) = TerrainY(terr,Obj(i,0),0,Obj(i,2))
      Obj(i,3) = Rnd(1.0,2.0)
      Obj(i,4) = 0
   Next
   
   
While Not KeyHit(1)

   TurnEntity Camera,+MouseYSpeed()/3.0,0,0,0
   TurnEntity Camera,0,-MouseXSpeed()/3.0,0,1
   
   MoveMouse 1024 / 2.0, 768 / 2.0
   
   If KeyDown(17) Then MoveEntity Camera,0,0,+1
   If KeyDown(31) Then MoveEntity Camera,0,0,-1
   If KeyDown(30) Then MoveEntity Camera,-1,0,0
   If KeyDown(32) Then MoveEntity Camera,+1,0,0
   
   ClearSurface(ObjSurf)
   For i = 0 To MAXOBJ
      xx# = Obj(i,0)
      yy# = Obj(i,1)
      zz# = Obj(i,2)
      TFormPoint(xx,yy,zz,0,camera):xx#=TFormedX():yy#=TFormedY():zz#=TFormedZ()
      dis# = zz
      If dis > 0      
         If dis < (OBJRANGE*2)+OBJAUTOFADE
            sc# = Obj(i,3)
            u1# = Obj(i,4)   
            a# = 1
            If dis => (OBJRANGE*2) Then
                a# = 1-(dis - (OBJRANGE*2))/OBJAUTOFADE
            EndIf
            If a# > 0
               v0 = AddVertex(ObjSurf,xx-sc,yy+sc,zz,u1,0)    : VertexColor(ObjSurf,v0,255,255,255,a#)
               v1 = AddVertex(ObjSurf,xx+sc,yy+sc,zz,u1+0.5,0) : VertexColor(ObjSurf,v1,255,255,255,a#)
               v2 = AddVertex(ObjSurf,xx-sc,yy-sc,zz,u1,1)    : VertexColor(ObjSurf,v2,255,255,255,a#)
               v3 = AddVertex(ObjSurf,xx+sc,yy-sc,zz,u1+0.5,1) : VertexColor(ObjSurf,v3,255,255,255,a#)
               AddTriangle(ObjSurf,v0,v1,v2)
               AddTriangle(ObjSurf,v1,v3,v2)
            EndIf
         EndIf
      EndIf
   Next
   
   
   UpdateWorld
   RenderWorld   
   
   Flip 1
Wend

End


(Wenn dus dir mal anschauen möchtest, kannst du es Hier Downloaden Wink )

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!

blitzuser34

BeitragSo, März 22, 2009 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

erst mal Danke für den Beispielcode.
Jedoch spuckt RenderWorld einen MAV aus, wenn man 90° nach unten schaut. Warum?

Mfg
Blitzuser34

Edit: Hi, es wird noch lustiger:

user posted image

Edit2: auch wenn es nich so doll ist, funktioniert es so:

Code: [AUSKLAPPEN]
dis#=Sqr(xx*xx+yy*yy+zz*zz)

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group