EntityAutoFade bei SingleSurface Gras
Übersicht

![]() |
blitzuser34Betreff: EntityAutoFade bei SingleSurface Gras |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
ich habe mal eine Frage: wie mache ich bei Single Surface Gras/Bäumen eine Art EntityAutoFade??? Blitzuser34 |
||
![]() |
peacemaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
blitzuser34Betreff: Single Surface |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
nein...
Ich erklärs dir mal ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
Sorry, aber ich verstehen nicht was du damit meinst. Hast du vielleicht einen Beispielcode/Pseudocode? Mfg Blitzuser34 |
||
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: Edit2: auch wenn es nich so doll ist, funktioniert es so: Code: [AUSKLAPPEN] dis#=Sqr(xx*xx+yy*yy+zz*zz)
|
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group