Stufenlose Terrainhöhe

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

hamus

Betreff: Stufenlose Terrainhöhe

BeitragSa, Jul 14, 2012 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hi zusammen

ich experimentiere gerade einwenig mit terrains
ich hab mir eine kleine gras-funktion gebaut, die auch relativ funktioniert, nur
macht mir das Programm bei Bergen/Anhöhen "Stufen" in dem Gras,
soviel ich gesehen habe, berechnet er die höhe des terrain vom letzten "Vertex" aus,
und bildet deshalb zwischen diesen stufen
Das Sieht dann ungefäht so aus:
\ __
''\ __
''''\ __
''''''\ __
''''''''\ __
'''''''''\_____________

Im mom habe ich für die position:
positionEntity obj,x,TerrainY(ter,x,0,z),z

Nun wollte ich wissen, wie es stufenlos hinbekomme, also so, dass die einzelnen objekte direkt auf dem terrain platziert werden... Ich hatte bereit überlegt, die umliegenden Punkte abzufragen,den Mittelwert zu nehmen und daraus dann die ungefähre Höhe zu errechnen, aber das hat auch nicht 100%ig funktioniert

Wäre nett, wenn mir jmd helfen könnte Rolling Eyes

mfg.
 

bjh

BeitragSa, Jul 14, 2012 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hi hamus,

ich kann leider nichts in deiner zeichnung erkennen Wink

hast du vllt ein bisschen code, damit ich weiß, wie dein gras erstellt wird.

und wie wird das terrain erstellt?
mit loadterrain wahrscheinlich?
 

hamus

BeitragSa, Jul 14, 2012 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
terrain wird mit loadterrain aus einer heightmap geladen

Das gras ist eine textierte fläche die zufällig auf dem terrain gesetzt wird...

''''''''''''''''''''_
''''''''''''''''''/'''\ **
''''''''''''''''/'''''''\
''''''''''''''/'''''''''''\ **
''''''''''''/'''''''''''''''\
''''''''''/'''''''''''''''''''\ **
___/'''''''''''''''''''''''\_____________

Braun: Terrain
Grün: Gras

EDIT:
und so sollte es sein

''''''''''''''''''''_
''''''''''''''''''/'''\ *
''''''''''''''''/'''''''\ *
''''''''''''''/'''''''''''\ *
''''''''''''/'''''''''''''''\ *
''''''''''/'''''''''''''''''''\ *
___/'''''''''''''''''''''''\_____________

hoffe das hilft weiter

code ist leider grad nicht zur hand, steht aber auch nicht mehr drin, als was ich grad gesagt habe Wink
 

bjh

BeitragSa, Jul 14, 2012 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
das gras besteht also aus quadraten, die auf das terrain gesetzt werden.

ich versteh den zweck des grases leider nicht.
soll das gras sich dem boden anpassen oder soll es senkrecht zum boden stehen.

_____ gras
OOOO boden

I I I I I gras
OOOO boden

Wink
 

hamus

BeitragSa, Jul 14, 2012 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
senkrecht

also so

''''''''''''''''''''_
''''''''''''''''''/'''\ |
''''''''''''''''/'''''''\ |
''''''''''''''/'''''''''''\ |
''''''''''''/'''''''''''''''\ |
''''''''''/'''''''''''''''''''\ |
___/'''''''''''''''''''''''\_|_|_|_|_|_|_|_|_|_|_|_|_

und genau da macht er bei anhöhen "treppen"

''''''''''''''''''''_ ||
''''''''''''''''''/'''\
''''''''''''''''/'''''''\ ||
''''''''''''''/'''''''''''\
''''''''''''/'''''''''''''''\ ||
''''''''''/'''''''''''''''''''\
___/'''''''''''''''''''''''\_|_|_|_|_|_|_|_|_|_|_|_|_
 

bjh

BeitragSa, Jul 14, 2012 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
da gibt es dann zwei möglichkeiten, das zu lösen.

1. man erstellt ein grasmesh, kopiert es mit copyentity 100 mal (10*10 Wink ) , setzt es um die camera um die geschwindigkeit hoch zu halten und dreht sie.

das gras zeigt dann aber nicht senkrecht in die luft.

2. man erstellt ein grasmesh mit 127*127*2 vertexen, verbindet alle vertexe so, dass das gras nur von der seite gesehen wird und passt die einzelnen vertexpunkte der terrainhöhe an.

dann zeigt das gras immer nach oben.


dazu würde ich das terrain aber auch selbst erstellen.

falls du dich mit dem ganzen zeug noch nicht so gut auskennst, dann würde ich gerne einen beispielcode schreiben, den du dann auch so verwenden kannst.

und ich würde die zweite möglichkeit empfehlen.

wie lange programmierst du eig schon mit b3d?

ToeB

BeitragSa, Jul 14, 2012 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Also TerrainHeight gibt einen Float wieder und verlangt auch auch Floats. Allerdings rate ich hierbei zu TerrainY, dort wird eine interpolierte Höhe des Terrains zurückgegeben, genau das was du brauchst.

Lg, Tobias
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!
 

hamus

BeitragSa, Jul 14, 2012 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
mein problem ist eigentlich ein anderes...

ich habe hier um zu sehen die texturen entfernt und das gras weiß gemacht...
user posted image
user posted image
user posted image



Ich hoffe man kann jetzt die einzelnen treppenstufen erkennen...
Auf der flachen ebene funktioniert das prog, nur sobald die steigung kommt geht das gras nicht flüssig nach oben, sondern macht diese sprünge...

wie gesagt, die enzelnen gras-flächen werden zufällig in der nähe einer box erstellt...
(wobei um die box mehr sind)
und die höhe wird mit
positionEntity obj,x,TerrainY(ter,x,0,z),z
berechnet... aber an der wireframe-darstellung sieht man glaub, dass die höhe nicht richtig berechnet wird...

EDIT:
bin schon ne weile dabei, hab mich nur nie um forum angemeldet ;P
 

bjh

BeitragSa, Jul 14, 2012 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
du musst die teile ja auch drehen Wink

am besten geht das mit atan2.
der rechnet die winkel aus.

Nova

BeitragSa, Jul 14, 2012 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Guck dir die ganzen Sachen mal von oben an. Do wirst dann bemerken, dass alles gleichmäßig ist.
Problematisch ist halt folgender Sachverhalt: Auf einer geraden Fläche ist der Abstand immer gleich, aber wenn du noch eine Steigung da drinnen hast, dann wird der Weg ja länger. Stell dir einfach deine Hauswand vor: Wenn du einen Meter von ihr entfernt bist, und dann einen Meter auf sie zu gehst, bist du halt einen Meter weiter gegangen. Wenn du das ganze dann aber noch mal machen willst, wirst du merken, dass der Weg viel länger ist: Um nämlich wirklich "von oben gesehen" einen Meter weiter zu kommen, müsstest du auf das Dach deines Hauses steigen - und das ist definitiv mehr als "ein Meter". Wink

Selbst wenn du dir Grasflächen drehst und neigst, wirst du also trotzdem Probleme haben, da freie Abschnitte zwischen den Grasflächen entstehen.
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit
 

bjh

BeitragSa, Jul 14, 2012 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ich stelle mal meinen lösungsansatz vor:

BlitzBasic: [AUSKLAPPEN]
Dim map_i(1024,1024) ; höheninformationen der map

timer=CreateTimer(60)
Graphics3D 0,0,32,1
SetBuffer BackBuffer()

cam=CreateCamera()

gras=CreateMesh()
gras_s=CreateSurface(gras)

; hier werden die 32258 vertices erstellt
For z=0 To 1
For y=0 To 126
For x=0 To 126
AddVertex(gras_s,0,0,0,(x-y)*2,1-z)
Next
Next
Next

; hier werden die triangles erstellt
For y=0 To 63
For x=0 To 125
a=y*127
b=16002-y*127

AddTriangle gras_s,x+a,x+a+1,x+a+16129
AddTriangle gras_s,x+a+1,x+a+16130,x+a+16129
AddTriangle gras_s,x+b,x+b+16129,x+b+1
AddTriangle gras_s,x+b+16130,x+b+1,x+b+16129

c=x*127
d=126-y

AddTriangle gras_s,c+y+16129,c+y+127,c+y
AddTriangle gras_s,c+y+16129,c+y+16256,c+y+127
AddTriangle gras_s,c+d,c+d+127,c+d+16129
AddTriangle gras_s,c+d+127,c+d+16256,c+d+16129
Next
Next
ScaleEntity gras,8,1,8 ; bei mir ist der vertexabstand meiner map 8 meter damit ich 64 km² zusammenbekomme

While Not KeyHit(1)
; hier wird überprüft, ob die camera einen bestimmten abstand zum grasmesh hat
z=0
If EntityX(gras)+8<EntityX(cam) MoveEntity gras,8,0,0:z=1
If EntityX(gras)-8>EntityX(cam) MoveEntity gras,-8,0,0:z=1
If EntityZ(gras)+8<EntityZ(cam) MoveEntity gras,0,0,8:z=1
If EntityZ(gras)-8>EntityZ(cam) MoveEntity gras,0,0,-8:z=1

; wenn der abstand in x oder z richtung größer als 8 ist, dann werden die vertexpunkte neu berechnet um polygone zu sparen
If z=1
xx=EntityX(gras)/8
yy=EntityZ(gras)/8

For x=0 To 126
For y=0 To 126
xxx=x+449+xx
yyy=y+449+yy

If xxx>0 And xxx<1024 And yyy>0 And yyy<1024
VertexCoords gras_s,x+y*127,x-63,map_i(xxx,yyy),y-63
VertexCoords gras_s,x+y*127+16129,x-63,map_i(xxx,yyy)+1,y-63
Else
VertexCoords gras_s,x+y*127,x-63,0,y-63
VertexCoords gras_s,x+y*127+16129,x-63,0,y-63
EndIf
Next
Next
EndIf

RenderWorld

Flip 0
WaitTimer timer
Wend
End


ich glaube, dass das zwar nicht das ist, was du brauchst, aber man kann dann noch die höhe anpassen und das gras verschwindet an manchen stellen. hab ich da zwar noch nicht eingebaut, aber man könnte aus dem dim map_i(1024,1024) einfach ein dim map_i(1024,1024,1) machen und die höhenwerte, also um wie viel die obere vertexreihe verschoben werden soll, einspeisen.

ich hoffe, ich konnte helfen Wink

biggicekey

BeitragSa, Jul 14, 2012 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute das Problem liegt in BlitzBasic: [AUSKLAPPEN]
TerrainY(ter,x,0,z)


Ich habe es nicht getestet und vermute es nur!

Ein bb Terrain kann vielleicht nur so viele "Höhenstufen" haben, wie das Bild der Terrainmap Graustufen*die Skalierung des Terrains hat. Auch wenn es dank LOD viel mehr Vertices, auch zwischen den Stufen, hat.
Dann kann man Treppen nicht vermeiden ohne selbst zu interpolieren.

Noch dazu müsstest du die quadrate in denen das Gras unterteilt ist an die Terrainneigung anpassen. Oder verkleinern damit es nicht so auffällt das das Gras zusammengefasst ist.


EDIT: Speicher TerrainY mal in einer float bevor du es verwendest.
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]
  • Zuletzt bearbeitet von biggicekey am Mo, Jul 16, 2012 16:23, insgesamt einmal bearbeitet
 

Tritium

BeitragSo, Jul 15, 2012 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,

hat nicht direkt mit Deinem Problem zu tun, und vielleicht renn ich auch offene Türen ein, aber:

Sollte das Gras für Dein Programm nicht essentiell wichtig sein dann würd ich mich an Deiner Stelle jetzt nicht mit sowas aufhalten. Ich weiß nicht, wozu Du das programmierst, vielleicht gehört das in die Kategorie "wollte einfach mal ausprobieren wie sowas geht", das ist was anderes. Aber wenn Du bspw. ein 3D-RPG/-Shooter/-Strategiespiel programmierst würde ich mich erst mit der eigentlichen Funktionalität befassen, sofern das Gras kein zentrales Spielelement sondern vielmehr ein grafisches Schmankerl ist.

Ist nicht böse gemeint Wink , aber das ist einer der beliebtesten Wege, ein Projekt frühzeitig zu beenden: "Sollte dieser Button steingrau sein? Oder doch ein Mausgrau? Wobei, das Aschgrau war auch nicht schlecht... huch, schon wieder drei Stunden vorbei...". Wie gesagt, geht nicht gegen Dich persönlich oder so, aber ich sprech aus Erfahrung, dass sowas die beliebtesten Dinge sind, die zu Motivationsmangel führen Wink
 

bjh

BeitragSo, Jul 15, 2012 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
ich finde, wir sollten erst auf rückmeldung von hamus warten Wink
 

hamus

BeitragMo, Jul 16, 2012 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
So

ich hab jetzt ne weile rumprobiert und habe ne passende Funktion/Formel geschrieben...

Das terrain besteht ja, wie alles andere auch,aus "Dreiecken"

als erstes bestimme ich die koordinaten des dreiecks...
position\Skalierung_des_terrain*skalierung_des_terrain

dadurch wird der wert gerundet,und man bekommt den pos von dem eckpunkt

die 2 anderen Eckpunkte unseres Dreiecks sind die pos von dem bekannten dreieck + Vektor(skalierung_des terrain)

dadurch hat man die position von A und die Vektoren AB und AC
damit lässt sich eine Ebenengleichung erstellen
(vektor_P=0vektor_A+a*vektor_AB+b*vektor_AC)
a und b lassen sich durch umformen ausrechnen

der punkt P(x,y,z), wobei x und z die aktuelle position der berechnung ist, soll ja auf dieser ebene liegen...

dann einfach nach y die formel auflösen, und fertig...


klingt kompliziert, funktioniert aber deutlich besser und vorallem genauer als terrainY() bzw terrainheight...

trotzdem danke für die hilfe ;P
 

bjh

BeitragMo, Jul 16, 2012 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
es würde auch leichter gehen ( ohne viel mathe und vektoren).
aber wenn du meinst Wink

schön, dass dein problem gelöst ist
 

sddsmhr

BeitragDi, Jul 31, 2012 7:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ToeB hat Folgendes geschrieben:
Also TerrainHeight gibt einen Float wieder und verlangt auch auch Floats. Allerdings rate ich hierbei zu TerrainY, dort wird eine interpolierte Höhe des Terrains zurückgegeben, genau das was du brauchst.

Lg, Tobias
Nur, dass TerrainY gerne mal falsch interpoliert... Confused

BladeRunner

Moderator

BeitragDi, Jul 31, 2012 7:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Was wenn ich das richtig sehe kein Fehler von TerrainY ist sondern ein klassischer Rundungsfehler bei single precision Floats. Shit happenz.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

sddsmhr

BeitragDi, Jul 31, 2012 8:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, das erklärt es nicht, siehe hier:
https://www.blitzforum.de/foru...hp?t=38843

Hier werden Tiles als konvex angenommen, obwohl sie konkav sind, bzw. umgekehrt, was zu einer falschen Interpolation führt... Oder ne, warte, da wird meines Wissens eine falsche Orientierung zugrundegelegt...

Setz' in dem Beispiel-Code einfach die steps hoch (falls es der PC verkraftet), dann wird es ganz deutlich.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group