Bäume falsch rum eingezeichnet
Übersicht

![]() |
blitzuser34Betreff: Bäume falsch rum eingezeichnet |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
ich wollte mal Single Surface Trees erstellen. Folgender Code: Code: [AUSKLAPPEN] baumbrush=LoadBrush("Media\Baum.png",2)
Baeume=CreateMesh() BSurface=CreateSurface(baeume,baumbrush) For baumnummer=0 To 4999 .baumunterwasser baumx#=Rnd(0,511) baumz#=Rnd(0,511) Y#=TerrainY(terrain,baumx#,Y#,baumz#) If Y#<40 Then Goto baumunterwasser v1=AddVertex(BSurface,baumx#-2,Y#,baumz,0,0) v2=AddVertex(BSurface,baumx#-2,Y#+4,baumz,0,-1) v3=AddVertex(BSurface,baumx#+2,Y#,baumz,-1,0) v4=AddVertex(BSurface,baumx#+2,Y#+4,baumz,-1,-1) tr1=AddTriangle(BSurface,v1,v2,v3) tr2=AddTriangle(BSurface,v2,v3,v4) v5=AddVertex(BSurface,baumx#,Y#,baumz-2,0,0) v6=AddVertex(BSurface,baumx#,Y#+4,baumz-2,0,-1) v7=AddVertex(BSurface,baumx#,Y#,baumz+2,-1,0) v8=AddVertex(BSurface,baumx#,Y#+4,baumz+2,-1,-1) tr3=AddTriangle(BSurface,v5,v6,v7) tr4=AddTriangle(BSurface,v6,v7,v8) Next EntityFX baeume,16 Nur blöderweiße werden die nahen Bäume vor den entfernten Bäumen gezeichnet. So sehe ich also einen kleinen Baum vor einem großen. Bei Masked ist das jedoch nicht so. |
||
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau das gleiche wird gerade im Thread nebenan besprochen.
Der Grund ist, dass DX7 bei der Verwendung von Alpha den Z-Buffer nicht beachtet. Die Lösung ist, wie du selbst erkannt hast, den Masked-Modus zu benutzen oder die Bäume in der Reihenfolge zu erstellen wie sie gezeichnet werden sollten, was natürlich sehr aufwändig ist, wenn man sich bewegen möchte, da ständig geupdated werden muss. Ich empfehle deshalb erstere Variante(mit guten Texturen ist es auch hier kein Problem gut aussehende Blätter hinzubekommen. Man sehe sich kommerzielle Spiele an). |
||
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans! Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver |
![]() |
NightPhoenix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Damit das keiner falsch versteht, auch wenn mein Post hier eher unnötig ist: Das ist in DX9 auch so. Ich wollt nur nicht, das schonwieder jeder denkt DX7 ist schuld und böse.
Speedtree verwendet ebenso Flag4, statt Flag2, Flag4 ist auch schneller, weil die Graka keine "halbtransparenzen" berechnen muss, sondern nur volltransparent, oder untransparent. MfG. *edit* Oh ach übrigens kannst du bei SingleSurface kein Flag2 benutzen, weil dann zwangsweise solche fehler auftreten ![]() |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das liegt nicht mal an DirectX, sondern einfach daran, wie ein 3D - Engine aufgebaut ist.
Man könnte das Problem schon vermeiden, wenn man alle transparenten Triangles von hinten nach vorne durchsortiert, aber wie man das in Echtzeit schaffen will, hat leider noch niemand rausgefunden ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
blitzuser34Betreff: Terrain Problem |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
ich krustel den Thread noch mal raus weil ich ein Prob habe: Wie man sieht wird das Terrain von Richtung Norden bis Osten nicht richtig eingezeichnet. Das Terrain habe ich mit CreateMesh, CreateSurface, CreateVertex und CreateTriangle erstellt. Es sind insgesammt 4 übereinander vorhanden. Im Screenshot sind jedoch alle bis auf eine Alpha 0. Muss ich des jetzt sortieren? Wenn ja, wie? Oder wie soll ich ein Terrainsystem aufbauen damit das nicht passiert? Blitzuser34 |
||
![]() |
Megamag |
![]() Antworten mit Zitat ![]() |
---|---|---|
Würde Heighmap nicht auch gehen? | ||
![]() |
blitzuser34 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, ich bin ja wegen der Texturierung umgestiegen:
Zu sehen ist weiterhin das Problem. Ach ja: ich hab einen Timer drin!! |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lädst du die Texturen mit Alphaflag 2?
Dies führt nämlich zu z-Buffer-Problemen. Vielleicht sind ja teiltransparente Texturen in dienem Fall gar nicht notwendig oder evtl kannst du gewisse transparente Stellen erreichen, indem du einfach den entsprechenden Vertices alpha verpasst. |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
blitzuser34 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
das Problem ist gelöst. Man muss auf das untere Terrain nur EntityFX 2 anwenden. Hier ein funktionierender BeispielCode: Code: [AUSKLAPPEN] ;----------------------------------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------------------------------- ; ;FearCry Editor 2 ; ;---------------------------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------------------- Const editorname$="FearCry Editor 2";Konstanter Name setzen Graphics3D 1440,900,32,1;Fenster erstellen SetBuffer BackBuffer();Backbuffer setzen AppTitle editorname$;Fenstertitel setzen HidePointer;Windowszeiger verstecken Include "DevilGui.bb";DevilGui laden GUI_InitGUI("Skins\WinVista.skin");Gui initialisieren Global camera1=CreateCamera();Kamera für das Spiel erstellen CameraRange camera1,0.5,200;Kamerasichtweise einstellen CameraFogMode camera1,0;CameraFog einstellen MoveEntity camera1,0,2,0;Kamera an Startposition setzen AmbientLight 255,255,255;Grundlicht setzen Global brush1=LoadBrush("Texturen\Gras_braun.jpg");Brush 1 laden Global brush2=LoadBrush("Texturen\Gras_grün.jpg");Brush 2 laden Global brush3=LoadBrush("Texturen\Sand.jpg");Brush 3 laden Global brush4=LoadBrush("Texturen\Fels.jpg");Brush 4 laden Global terrain1=CreateMesh();Terrain 1 Mesh erstellen Global terrain2=CreateMesh();Terrain 2 Mesh erstellen Global terrain3=CreateMesh();Terrain 3 Mesh erstellen Global terrain4=CreateMesh();Terrain 4 Mesh erstellen EntityFX terrain1,2;Effekte für Terrain 1 setzen EntityFX terrain2,2+32;Effekte für Terrain 2 setzen EntityFX terrain3,2+32;Effekte für Terrain 3 setzen EntityFX terrain4,2+32;Effekte für Terrain 4 setzen Global terrainsurface1=CreateSurface(Terrain1,brush1);Surface 1 erstellen Global terrainsurface2=CreateSurface(Terrain2,brush2);Surface 2 erstellen Global terrainsurface3=CreateSurface(Terrain3,brush3);Surface 3 erstellen Global terrainsurface4=CreateSurface(Terrain4,brush4);Surface 4 erstellen Dim terrain1vertex(127,127);Dim für vertex des 1. Terrains erstellen Dim terrain2vertex(127,127);Dim für vertex des 2. Terrains erstellen Dim terrain3vertex(127,127);Dim für vertex des 3. Terrains erstellen Dim terrain4vertex(127,127);Dim für vertex des 4. Terrains erstellen Dim terrain1triangle(126,126,1);Dim für die Triangles des 1. Terrains erstellen Dim terrain2triangle(126,126,1);Dim für die Triangles des 2. Terrains erstellen Dim terrain3triangle(126,126,1);Dim für die Triangles des 3. Terrains erstellen Dim terrain4triangle(126,126,1);Dim für die Triangles des 4. Terrains erstellen For X=0 To 127 For Z=0 To 127 terrain1vertex(X,Z)=AddVertex(terrainsurface1,X,0,Z,X,Z);Vertexpunkte für Terrain 1 erstellen terrain2vertex(X,Z)=AddVertex(terrainsurface2,X,0,Z,X,Z);Vertexpunkte für Terrain 2 erstellen terrain3vertex(X,Z)=AddVertex(terrainsurface3,X,0,Z,X,Z);Vertexpunkte für Terrain 3 erstellen terrain4vertex(X,Z)=AddVertex(terrainsurface4,X,0,Z,X,Z);Vertexpunkte für Terrain 4 erstellen VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,0;Alphawerte für Terrain 2 setzen VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,0;Alphawerte für Terrain 3 setzen VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,0;Alphawerte für Terrain 4 setzen Next Next For X=0 To 126 For Z=0 To 126 terrain1triangle(X,Z,0)=AddTriangle(terrainsurface1,terrain1vertex(X,Z),terrain1vertex(X,Z+1),terrain1vertex(X+1,Z));Triangle 1 für Terrain 1 erstellen terrain1triangle(X,Z,1)=AddTriangle(terrainsurface1,terrain1vertex(X,Z+1),terrain1vertex(X+1,Z+1),terrain1vertex(X+1,Z));Triangle 2 für Terrain 1 erstellen terrain2triangle(X,Z,0)=AddTriangle(terrainsurface2,terrain2vertex(X,Z),terrain2vertex(X,Z+1),terrain2vertex(X+1,Z));Triangle 1 für Terrain 2 erstellen terrain2triangle(X,Z,1)=AddTriangle(terrainsurface2,terrain2vertex(X,Z+1),terrain2vertex(X+1,Z+1),terrain2vertex(X+1,Z));Triangle 2 für Terrain 2 erstellen terrain3triangle(X,Z,0)=AddTriangle(terrainsurface3,terrain3vertex(X,Z),terrain3vertex(X,Z+1),terrain3vertex(X+1,Z));Triangle 1 für Terrain 3 erstellen terrain3triangle(X,Z,1)=AddTriangle(terrainsurface3,terrain3vertex(X,Z+1),terrain3vertex(X+1,Z+1),terrain3vertex(X+1,Z));Triangle 2 für Terrain 3 erstellen terrain4triangle(X,Z,0)=AddTriangle(terrainsurface4,terrain4vertex(X,Z),terrain4vertex(X,Z+1),terrain4vertex(X+1,Z));Triangle 1 für Terrain 4 erstellen terrain4triangle(X,Z,1)=AddTriangle(terrainsurface4,terrain4vertex(X,Z+1),terrain4vertex(X+1,Z+1),terrain4vertex(X+1,Z));Triangle 2 für Terrain 4 erstellen Next Next PositionEntity terrain1,0,.000,0;Positionieren des ersten Terrains PositionEntity terrain2,0,.002,0;Positionieren des zweiten Terrains PositionEntity terrain3,0,.004,0;Positionieren des dritten Terrains PositionEntity terrain4,0,.006,0;Positionieren des vierten Terrains UpdateNormals terrain1;Normalen neu berechnen für Terrain 1 UpdateNormals terrain2;Normalen neu berechnen für Terrain 2 UpdateNormals terrain3;Normalen neu berechnen für Terrain 3 UpdateNormals terrain4;Normalen neu berechnen für Terrain 4 Global key_escape_hit;Keyhit Variable für Escape Taste Global key_w_down;Keydown Variable für w Taste Global key_a_down;Keydown Variable für a Taste Global key_s_down;Keydown Variable für s Taste Global key_d_down;Keydown Variable für d Taste Global key_grosstelltaste_down;Variable für die Großtaste Global mouse_2_hit;Mousehit für Taste 2 Global mouse_2_down;Mousedown für Taste 2 Global MausX;Variable für Maus X Koordinate Global MausY;Variable für Maus Y Koordinate Global firstmillisecs;Variable für die frameunabhängige Programmierung Global secondmillisecs;Variable für die frameunabhängige Programmierung Global schleifenzeit;Variable für die frameunabhängige Programmierung Global mouseXsaved;X-Koordinate für Rechtsklick Global MouseYsaved;Y-Koordinate für Rechtsklick Global Umsichtsmodus;Modusvariable Global movespeed#;Variable für Bewegungsgeschwindigkeit ;---------------------------------------------------------------------------------------------------------------- For X=0 To 127 For Z=0 To 127 TextureStaticTerrain(X,Z,Rand(1,4)) ModifyStaticTerrain(X,Z,Rand(0,5)) Next Next Repeat;Anfang der Hauptschleife firstmillisecs=MilliSecs();Millisekunden messen key_escape_hit=KeyHit(1);Escape Taste abrufen key_w_down=KeyDown(17);W Taste abrufen key_a_down=KeyDown(30);A Taste abrufen key_s_down=KeyDown(31);S Taste abrufen key_d_down=KeyDown(32);D Taste abrufen key_grosstelltaste_down=KeyDown(42);Großstelltaste mouse_2_hit=MouseHit(2);Maus Taste 2 abrufen mouse_2_down=MouseDown(2);Maus Taste 2 abrufen MausX=MouseX();Maus X Koordinate abrufen MausY=MouseY();Maus Y Koordinate abrufen movespeed#=0.002;Normale Geschwindigkeit setzen If key_grosstelltaste_down=1 Then movespeed#=movespeed#*5;Wenn Beschleunigen Taste dann schneller If key_w_down=1 Then MoveEntity camera1,0,0,movespeed#*schleifenzeit;Kamera nach vorne bewegen If key_s_down=1 Then MoveEntity camera1,0,0,-movespeed#*schleifenzeit;Kamera nach hinten bewegen If key_a_down=1 Then MoveEntity camera1,-movespeed#*schleifenzeit,0,0;Kamera nach links bewegen If key_d_down=1 Then MoveEntity camera1,movespeed#*schleifenzeit,0,0;Kamera nach rechts bewegen If Umsichtsmodus=1 Then;Wenn man sich umsieht TurnEntity camera1,(MausY-mouseYsaved)*0.5,-(MausX-mouseXsaved)*0.5,0;Maus drehen RotateEntity camera1,EntityPitch(camera1),EntityYaw(camera1),0;Z-Achse auf 0 setzen MoveMouse mouseXsaved,MouseYsaved;Maus an Koordinate schieben If mouse_2_down=0 Then Umsichtsmodus=0;Wenn wieder losgelassen umschalten EndIf;Ende der Überprüfung If mouse_2_hit=1 Then;Wenn Rechtsklick dann in Umsichtsmodus umschalten mouseXsaved=MausX;X-Koordinate speichern MouseYsaved=MausY;Y-Koordinate speichern Umsichtsmodus=1;Modus umschalten EndIf;Ende der Überprüfung UpdateWorld;Kollision updaten RenderWorld;Welt rendern If key_escape_hit=1 Then;Wenn Escapetaste gedrückt wird askforendmessage=GUI_MsgBox("Beenden?","Wollen sie "+editorname$+" wirklich beenden?",2);Fragen ob Editor verlassen werden soll If askforendmessage=1 Then Exit;Wenn mit Ja bestätigt den Editor verlassen EndIf;Ende der Überprüfung GUI_UpdateGUI();Gui updaten und zeichnen Flip 0;Bild auf den Bildschirm setzen aber nicht auf ihn warten, damit die FPS Zahl nicht durch den Monitor bestimmt wird secondmillisecs=MilliSecs();Millisekunden messen schleifenzeit=secondmillisecs-firstmillisecs;Schleifenzeit ausrechnen Forever;Ende der Hauptschleife ;---------------------------------------------------------------------------------------------------------------- ClearWorld;Komplette 3D-Szene entfernen End;Programm beenden ;---------------------------------------------------------------------------------------------------------------- ;Funktion zum Ändern der Höhe Function ModifyStaticTerrain(X,Z,High#) If X>=0 And X<=127 And Z>=0 And Z<=127 Then;Überprüfen ob im richtigen Bereich VertexCoords terrainsurface1,Terrain1Vertex(X,Z),X,High#,Z;Terrain 1 modifizieren VertexCoords terrainsurface2,Terrain2Vertex(X,Z),X,High#,Z;Terrain 2 modifizieren VertexCoords terrainsurface3,Terrain3Vertex(X,Z),X,High#,Z;Terrain 3 modifizieren VertexCoords terrainsurface4,Terrain4Vertex(X,Z),X,High#,Z;Terrain 4 modifizieren VertexNormal terrainsurface1,Terrain1Vertex(X,Z),X,High#,Z;Belichtung updaten für Terrain 1 VertexNormal terrainsurface2,Terrain2Vertex(X,Z),X,High#,Z;Belichtung updaten für Terrain 2 VertexNormal terrainsurface3,Terrain3Vertex(X,Z),X,High#,Z;Belichtung updaten für Terrain 3 VertexNormal terrainsurface4,Terrain4Vertex(X,Z),X,High#,Z;Belichtung updaten für Terrain 4 EndIf End Function ;Funktion zum Texturieren des Terrains Function TextureStaticTerrain(X,Z,Layer) If X>=0 And X<=127 And Z>=0 And Z<=127 Then;Überprüfen ob im richtigen Bereich Select Layer;Passendes Terrain auswählen Case 1;Wenn Terrain 1 VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,0;Alphawerte für Terrain 2 setzen VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,0;Alphawerte für Terrain 3 setzen VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,0;Alphawerte für Terrain 4 setzen Case 2;Wenn Terrain 2 VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,1;Alphawerte für Terrain 2 setzen VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,0;Alphawerte für Terrain 3 setzen VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,0;Alphawerte für Terrain 4 setzen Case 3;Wenn Terrain 3 VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,0;Alphawerte für Terrain 2 setzen VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,1;Alphawerte für Terrain 3 setzen VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,0;Alphawerte für Terrain 4 setzen Case 4;Wenn Terrain 4 VertexColor terrainsurface2,terrain2vertex(X,Z),255,255,255,0;Alphawerte für Terrain 2 setzen VertexColor terrainsurface3,terrain3vertex(X,Z),255,255,255,0;Alphawerte für Terrain 3 setzen VertexColor terrainsurface4,terrain4vertex(X,Z),255,255,255,1;Alphawerte für Terrain 4 setzen End Select EndIf End Function |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group