lod terrain

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

bjh

Betreff: lod terrain

BeitragFr, Jul 27, 2012 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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)

Graphics3D 0,0,32,1
SetBuffer BackBuffer()
AmbientLight 255,255,255

t=CreateTexture(8,8)
For x=0 To 7
For y=0 To 7
WritePixel x,y,Rand(0,16777216),TextureBuffer(t)
Next
Next
ScaleTexture t,8,8

m=CreateMesh()
EntityTexture m,t
s=CreateSurface(m)
For y=0 To 8
For x=0 To 8
map(x,y)=AddVertex(s,x-4,0,y-4,x,y)
Next
Next
For y=0 To 8
For x=0 To 8
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)
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)
Next
Next

cam=CreateCamera()
TurnEntity cam,90,0,0

While Not KeyHit(1)
If KeyHit(17)
b=b+1

For x=0 To 8
VertexCoords s,map(x,(Abs(b-1))Mod 9),x-4,0,b+4
VertexTexCoords s,map(x,(Abs(b-1))Mod 9),x,b
Next
EndIf

If KeyHit(31)
b=b-1

For x=0 To 8
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

If KeyHit(32)
a=a+1
EndIf

If KeyHit(30)
a=a-1
EndIf

If KeyHit(203) WireFrame 1
If KeyHit(205) WireFrame 0

If MouseHit(1) FlipMesh m

PositionEntity cam,a,18,b

RenderWorld

Text 0,0,a
Text 0,10,b

Flip
Wend
End


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

BeitragFr, Jul 27, 2012 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ä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

BeitragFr, Jul 27, 2012 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
 

sddsmhr

Betreff: Re: lod terrain

BeitragDi, Jul 31, 2012 6:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
jetzt hab ich keine lust alle objekte immer ein stückchen nach oben zu schieben...
Anders geht es aber nicht. Wenn du neue Höhen zuweist...

_o___ ==> -o----

...ist klar, dass Objekte durch das Terrain fallen...
 

bjh

BeitragDi, Jul 31, 2012 7:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 31, 2012 8:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 31, 2012 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jul 31, 2012 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
k, ich schau mal...

Nachtrag: Huh... trashy, trashy... Very Happy

- 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. Wink
 

sddsmhr

BeitragFr, Aug 03, 2012 8:14
Antworten mit Zitat
Benutzer-Profile anzeigen
*push*

(schon den Code gesehen?)
 

bjh

BeitragFr, Aug 03, 2012 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo sddsmhr,

erstmal vielen dank für deine bemühungen Wink

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

BeitragSa, Aug 04, 2012 8:26
Antworten mit Zitat
Benutzer-Profile anzeigen
ich entschuldige mich gelich mal für den doppelpost Wink

hier ist mein code:
BlitzBasic: [AUSKLAPPEN]
Graphics3D 0,0,32,1
SetBuffer BackBuffer()

t=CreateTexture(128,128)
For x=0 To 127
For y=0 To 127
WritePixel x,y,Rand(0,255)*65793,TextureBuffer(t)
Next
Next
ScaleTexture t,128,128
m=CreateMesh()
EntityTexture m,t
s=CreateSurface(m)
For y=0 To 128
For x=0 To 128
AddVertex(s,x-64,0,y-64,x,y)
Next
Next
For y=0 To 127
For x=0 To 127
AddTriangle s,x+y*129+129,x+y*129+1,x+y*129
AddTriangle s,x+y*129+129,x+y*129+130,x+y*129+1
Next
Next
For x=0 To 127
AddTriangle s,x,x+16513,x+16512
AddTriangle s,x,x+1,x+16513
Next

cam=CreateCamera()
MoveEntity cam,0,90,100
TurnEntity cam,90,0,0

While Not KeyHit(1)
If KeyHit(205) WireFrame 1
If KeyHit(203) WireFrame 0

If KeyDown(17) TranslateEntity cam,0,0,1
If KeyDown(31) TranslateEntity cam,0,0,-1

If b+1<EntityZ(cam)
For x=0 To 128
VertexCoords s,x+b Mod 129*129,x-64,0,b+64
VertexTexCoords s,x+b Mod 129*129,x,b
Next
b=b+1
EndIf

If b-1>EntityZ(cam)
For x=0 To 128
VertexCoords s,x+b Mod 129*129,x-64,0,b-64
VertexTexCoords s,x+b Mod 129*129,x,b
Next
b=b-1
EndIf

If MouseHit(1) FlipMesh m

RenderWorld

Text 0,0,a
Text 0,10,b

Flip
Wend
End


ist zwar nicht so schön, aber mein problem ist wahrscheinlich gelöst.

Xeres

Moderator

BeitragSa, Aug 04, 2012 8:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

sddsmhr

BeitragDo, Aug 09, 2012 0:48
Antworten mit Zitat
Benutzer-Profile anzeigen
K, Sir... Very Happy

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. Wink

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... Confused

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group