lod terrain
Übersicht

bjhBetreff: lod terrain |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hallo leute,
ich versuch grad ein lod-terrsin zu programmieren. wenn der spieler eine bestimmte strecke (zurzeit 12m) gelaufen ist, dann wird die map aktualisiert. wenn ich jetzt aber die gesamte map neu erstelle, bzw. den vertices neue höhen zuweisen, dann fallen meine figuren durch den boden, weil die pro durchlauf nach unten bewegt werden. jetzt hab ich keine lust alle objekte immer ein stückchen nach oben zu schieben oder ein updateworld einzufügen. meine zweite idee wäre, einfach die letzten vertices vor die ersten zu schieben. haut leider überhaupt nicht hin das wäre mal mein ausführbarer code: BlitzBasic: [AUSKLAPPEN] Dim map(8,8) das problem, das ich hier hab, ist, dass wenn man mit w nach oben (in z-richtung) fährt und dann mit s nach unten, dann bilden sich so komische verzerrungen, die erst nach vielen veränderungen wieder herausgebügelt sind. vielleicht kann mir jemand weiterhelfen oder es gibt noch eine gute lösungsmöglichkeit. alle meshes zu erstellen und dann zu hiden will ich aber nicht. |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ähm, das Blitz-eigene Terrain kümmert sich selbst um LOD und macht dir auch bei der kollision keine Probleme. Warum nicht das verwenden? | ||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
bjh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
weil ich mein eigenes verwenden will, damit ich genau weiß, wo ein vertexpunkt ist.
für gras und so und ich brauch auch nicht weniger polys in der entfernung. mein terrain wird nur höchstens 65536 polys haben. |
||
sddsmhrBetreff: Re: lod terrain |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
bjh hat Folgendes geschrieben: wenn ich jetzt aber die gesamte map neu erstelle, bzw. den vertices neue höhen zuweisen, dann fallen meine figuren durch den boden, weil die pro durchlauf nach unten bewegt werden.
Anders geht es aber nicht. Wenn du neue Höhen zuweist...
jetzt hab ich keine lust alle objekte immer ein stückchen nach oben zu schieben... _o___ ==> -o---- ...ist klar, dass Objekte durch das Terrain fallen... |
||
bjh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also die höhe bleiben gleich.
es wird aber das terrain verschoben und die höhen der position angepasst. jetzt müss aber das kollisionszeug neu berechnet werden und deshalb setzt es für einen durchlauf aus und die figuren sind schon durch. |
||
sddsmhr |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und wieso verschiebst du das Terrain? In welche Richtung überhaupt? Eine Translation in der x-z-Ebene macht keinen Sinn, und eine Translation auf der y-Achse resultiert eben in diesem Problem, logischerweise... | ||
bjh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wenn du meinen code ausführst, dann wirst du sehen, dass die untersten bzw. obersten vertices ganz nach oben bzw. ganz nach unten verschoben werden.
und das funktioniert leider nicht in beide richtungen. es werden also nur eine reihe von vertices bewegt, anstatt alle zu bewegen und das funzt leider nicht beim rauf und dann runter gehen. |
||
sddsmhr |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
k, ich schau mal...
Nachtrag: Huh... trashy, trashy... ![]() - ich mach' das zwar auch manchmal, aber bei Vars empfehlen sich schon längere Namen, anstatt 'm', 's' oder 't'... - dann fehlt definitiv eine anständige Navigation, bspw. sowas hier: Code: [AUSKLAPPEN] ;input (mouse)
mxs=MouseXSpeed() mys=MouseYSpeed() mzs=MouseZSpeed() mh1=MouseHit(1) mh2=MouseHit(2) md1=MouseDown(1) md2=MouseDown(2) ;SHIFT (faster movement) shift=KeyDown(42) f#=1.:If shift Then f#=10. ;rotate cam (hold right MB) If md2 Then RotateEntity cam,EntityPitch(cam)+mys,EntityYaw(cam)-mxs,EntityRoll(cam) If KeyDown(17) Then MoveEntity cam,0,0,f# ;w If KeyDown(30) Then MoveEntity cam,-f#,0,0 ;a If KeyDown(31) Then MoveEntity cam,0,0,-f# ;s If KeyDown(32) Then MoveEntity cam,f#,0,0 ;d - ein Pitch von 90° ist nicht empfehlenswert, weil dann keine anständige Rotation um die Y-Achse möglich ist (siehe deine cam...) - was du "unten" und "oben" nennst, ist eigentlich vorne/hinten bzw. links/rechts... - der Code zur Erzeugung der Surface ist schon völlig falsch... Wenn du schon modulo operierst, dann wohl eher modulo 8... Aber das löst das Problem noch nicht. Die Schleifen gehen nämlich von 0 bis 8, müssten aber von 0 bis 7 gehen (klar, weil 8 Spalten/Reihen - und 0 bis 7 sind acht Zahlen). Durch die Modulo-Operation fällt nämlich der Index irgendwann auf 0 zurück, weshalb Vertices am einen Ende mit Vertices am anderen Ende verbunden werden. Darauf kam ich auch erst nach längerem Testen, was erstens eine ordentliche Kameranavigation notwendig machte (sonst sieht man es nämlich gar nicht), zweitens der Check per Wireframe (hattest du schon drin...), und drittens ein "Spiel" mit der Positionierung der Vertices. Du hast sie innerhalb der x-z-Ebene verschoben, dadurch konnte man es nicht sehen, weil hier die verbindenden Linien zwischen Vertices bestehende Linien überlagerten. Das sieht man sehr schön, wenn man die Vertices eben aus der Ebene heraus bewegt (beim Code für die w-Taste): Code: [AUSKLAPPEN] VertexCoords s,map(x,Abs(b-1)) mod 9),x-4,1,b+4
wobei diese Zeile aber noch nicht korrekt ist... Besser sieht man es hier (aber auch noch nicht korrekt): Code: [AUSKLAPPEN] VertexCoords s,map(x,Abs(b-1)) mod 9),x-4,1,b-5
Und natürlich Wireframe einschalten, sonst sieht man nüscht. Achso... und um genauer zu sehen, was passiert, lasse ich die Schleife nicht bis 8, sondern erst einmal nur bis 0 gehen. Naja, hier ist der aktuelle Code-Schnipsel von mir, inkl. Kameranavigation (wasd, mouse...). Ich muss gleich einkaufen, deswegen funzt das alles noch nicht so richtig. Mit 'i' kannst du sehen, was ich oben meinte (i-taste ersetzt die w-taste, weil wasd für Navigation). Und am Anfang ist noch die Korrektur die momentan quasi off-geswitcht ist (siehe die "If 1=1 then"-Anweisung...): Code: [AUSKLAPPEN] Const set_scrx=800
Const set_scry=600 Const size=8 Dim map(size,size) Graphics3D set_scrx,set_scry,32,2 SetBuffer BackBuffer() AmbientLight 255,255,255 tex=CreateTexture(size,size) For x=0 To size-1 For y=0 To size-1 WritePixel x,y,Rand(0,16777216),TextureBuffer(tex) Next Next ScaleTexture tex,size,size Global mesh=CreateMesh() ;EntityTexture mesh,tex s=CreateSurface(mesh) For y=0 To size For x=0 To size map(x,y)=AddVertex(s,x-size/2,0,y-size/2,x,y) Next Next If 1=1 Then ;switch... For y=0 To size ;size-1 solves it! For x=0 To size ;size-1 solves it! AddTriangle s,map((x)Mod 9,(y+1)Mod 9),map((x+1)Mod 9,(y)Mod 9),map((x)Mod 9,(y)Mod 9) ;MOD is unnecessary...! AddTriangle s,map((x)Mod 9,(y+1)Mod 9),map((x+1)Mod 9,(y+1)Mod 9),map((x+1)Mod 9,(y)Mod 9) ;MOD is unnecessary...! Next Next Else For y=0 To size-1 For x=0 To size-1 AddTriangle s,map(x,y+1),map(x+1,y),map(x,y) AddTriangle s,map(x,y+1),map(x+1,y+1),map(x+1,y) Next Next EndIf Global cam=CreateCamera() resetcam() ;wireframe on Global wf=1 WireFrame wf While Not KeyHit(1) ;input (mouse) mxs=MouseXSpeed() mys=MouseYSpeed() mzs=MouseZSpeed() mh1=MouseHit(1) mh2=MouseHit(2) md1=MouseDown(1) md2=MouseDown(2) ;SHIFT (faster movement) shift=KeyDown(42) f#=1.:If shift Then f#=10. ;rotate cam (hold right MB) If md2 Then RotateEntity cam,EntityPitch(cam)+mys,EntityYaw(cam)-mxs,EntityRoll(cam) If KeyDown(17) Then MoveEntity cam,0,0,f# ;w If KeyDown(30) Then MoveEntity cam,-f#,0,0 ;a If KeyDown(31) Then MoveEntity cam,0,0,-f# ;s If KeyDown(32) Then MoveEntity cam,f#,0,0 ;d ;i If KeyHit(23) b=b+1 For x=0 To 0;size ; TranslateEntity mesh,-4,0,4 ; VertexCoords s,map( x, (Abs(b-1)) Mod 9 ),x-4,0,b+4 VertexCoords s,map( x, (Abs(b-1)) Mod 9 ),x-4,1,b-5 ;what has MOD to do here...? :p ; VertexCoords s,map( x, (Abs(b-1)) Mod 9 ),x-4,0,b+4 ; VertexCoords s,map( x, 8-(Abs(b-1)) Mod 9 ),x-4,0,b+4 ; VertexCoords s,map( x, 8-(Abs(b-1)) Mod 8 ),5,5,5 ; VertexTexCoords s,map(x,(Abs(b-1))Mod 9),x,b Next EndIf ;j If KeyHit(36) Then a=a-1 ;k If KeyHit(37) b=b-1 For x=0 To size VertexCoords s,map(x,8-(Abs(b+1))Mod 9),x-4,0,b-4 ; VertexTexCoords s,map(x,8-(Abs(b+1))Mod 9),x,b Next EndIf ;l If KeyHit(38) Then a=a+1 ;SPACE -> wireframe on/off If KeyHit(57) Then wf=1-wf WireFrame wf EndIf ;MB1 -> flip If mh1 FlipMesh mesh ;R -> reset cam If KeyHit(19) Then resetcam() ; PositionEntity cam,a,18,b RenderWorld Text 0,0,a Text 0,10,b Flip Wend End Function resetcam() PositionEntity cam,10,10,10 PointEntity cam,mesh End Function Ist natürlich noch eine Baustelle, muss wie gesagt gleich noch weg. Für die Translation (die wohl beabsichtigt war) würde ich schlicht TranslateEntity nutzen, alles andere wäre Quark. Wobei die Translation selbst auch Quark ist. Wenn, dann orientiert sich die Szene am Terrain, und nicht das Terrain an der Szene. Ob das Terrainmesh bei den Koordinaten 0,0,0 oder 345,321234,23423 sitzt, ist wurscht. Lediglich einzelne Vertices gilt es natürlich zu verschieben (in y-Richtung!) um so eine Transformation des Terrains zu erzielen. Aber mit dem Code solltest du schon ein wenig etwas anfangen können. ![]() |
||
sddsmhr |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
*push*
(schon den Code gesehen?) |
||
bjh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hallo sddsmhr,
erstmal vielen dank für deine bemühungen ![]() ich weiß, dass einbuchstabige namen nicht gut sind, aber der code sollte nur mein problem zeigen. eine kameranavigation ist vollkommen unwichtig und ich weiß auch in welche richtung meine map verschoben wird. das oben und unten war auf den bildschirm bezogen. der code zum erzeugen des surfaces ist vollkommen richtig. im wireframemodus sieht man ja, dass irgendwelche querlaufenden polygone eingebaut sind. weil die hintersten bzw. vordersten vertices and die vorderste bzw. hinterste position verschoben werden, müssen da noch polygone sein, damit keine löcher entstehen. dein code löst mein problem leider auch nicht. ich glaub ich weiß, wo mein problem ist. ich versuchs mal zu lösen. |
||
bjh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich entschuldige mich gelich mal für den doppelpost ![]() hier ist mein code: BlitzBasic: [AUSKLAPPEN] Graphics3D 0,0,32,1 ist zwar nicht so schön, aber mein problem ist wahrscheinlich gelöst. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Doppelpost sind bekanntermaßen nicht gerne gesehen und besonders auf *push* folgt in Zukunft *pop*.
Schickt dem Diskussionspartner eine kurze PM, falls ihr nach längerer Zeit noch etwas hinzugefügt habt. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
sddsmhr |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
K, Sir... ![]() bjh hat Folgendes geschrieben: hier ist mein code:
Halte ich 's' gedrückt bis der Zähler oben links unter 0 geht, kommt verursacht es bei mir eine Memory Access Violation... Und auch hier hast du wieder redundanten Code... Zumindest die Zeilen Code: [AUSKLAPPEN] For x=0 To 127 AddTriangle s,x,x+16513,x+16512 AddTriangle s,x,x+1,x+16513 Next scheint man nämlich bequem weglassen zu können und es passiert... nichts. Optimaler Code zur Erzeugung des Terrainmeshs war oben bei mir eigentlich schon drin: Code: [AUSKLAPPEN] Global size=128 Dim map(size,size) Global mesh=CreateMesh() Global surf=CreateSurface(mesh) For y=0 To size For x=0 To size map(x,y)=AddVertex(surf,x-size/2,0,y-size/2,x,y) Next Next For y=0 To size-1 For x=0 To size-1 AddTriangle surf,map(x,y+1),map(x+1,y),map(x,y) AddTriangle surf,map(x,y+1),map(x+1,y+1),map(x+1,y) Next Next Du betreibst hingegen irgendwie reichlich Zahlenmystik mit seltsamen Werten wie 65793 oder 16513 (wtf?!). Wo kommen diese Zahlen her? Was, wenn der Anwender bspw. die Terraingröße variieren will? In meinem Fall ginge das problemlos. Und bei der Entwicklung von Programmen (oder Spielen) muss man mit dem Code möglichst flexibel sein, und das gilt auch für solchen Beispielcode den man in irgendeinem Forum XY postet. Aber soetwas gewöhnt man sich mit der Zeit ganz automatisch an. ![]() Außerdem ist da eh irgendetwas mit den Triangles verhunzt... Sieht man sehr schön, wenn man wireframe+flipmesh macht. Das Gitter dürfte dann eigentlich nicht mehr sichtbar sein, tut es aber und ist sogar noch verzerrt... An und für sich aber schon eine recht geniale Idee, das mit dem Terrain irgendwie so zu lösen... Nur steckt da insgesamt wahrscheinlich noch viel Arbeit drin, vor allem bis das Prinzip dann auch sauber mit einer 3D-Szenerie funktioniert. Das Surface muss mindestens noch verschoben, texturiert und die Höhen angepasst werden - und das in jedem Frame... ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group