Meshterrain und Terrainforming

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

hamZta

Administrator

Betreff: Meshterrain und Terrainforming

BeitragSa, Feb 07, 2004 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Alsoooo
ich erstell mir ein Meshterrain (thx 2 eizdealer) und zwar so:
Code: [AUSKLAPPEN]
For x = 0 To 40
      For y = 0 To 40
         map(x,y) = CreateMesh()
         ;maptex(x,y) = LoadTexture("world\ground1.jpg")
         tmpbrush = CreateBrush()
         BrushTexture tmpbrush,m\tex1
         tmpsurface= CreateSurface(map(x,y),tmpbrush)
         v0 = AddVertex(tmpsurface,0,0,0,0,0)
          v1 = AddVertex(tmpsurface,0,0,1,0,0.5)
         v2 = AddVertex(tmpsurface,1,0,0,0.5,0)
         tri = AddTriangle(tmpsurface,v0,v1,v2)
         
         v0 = AddVertex(tmpsurface,0,0,1,0,0.5)
         v1 = AddVertex(tmpsurface,1,0,1,0.5,0.5)
         v2 = AddVertex(tmpsurface,1,0,0,0.5,0)
         tri2 = AddTriangle(tmpsurface,v0,v1,v2)
         
         v0 = AddVertex(tmpsurface,1,0,1,0.5,0.5)
         v1 = AddVertex(tmpsurface,0,0,1,0,0.5)
         v2 = AddVertex(tmpsurface,0,0,2,0,1)
         tri3 = AddTriangle(tmpsurface,v0,v1,v2)
         
         v0 = AddVertex(tmpsurface,0,0,2,0,1)
         v1 = AddVertex(tmpsurface,1,0,2,0.5,1)
         v2 = AddVertex(tmpsurface,1,0,1,0.5,0.5)
         tri4 = AddTriangle(tmpsurface,v0,v1,v2)
         
         v0 = AddVertex(tmpsurface,1,0,2,0.5,1)
         v1 = AddVertex(tmpsurface,2,0,2,1,1)
         v2 = AddVertex(tmpsurface,2,0,1,1,0.5)
         tri5 = AddTriangle(tmpsurface,v0,v1,v2)
         
         v0 = AddVertex(tmpsurface,2,0,1,1,0.5)
         v1 = AddVertex(tmpsurface,1,0,1,0.5,0.5)
         v2 = AddVertex(tmpsurface,1,0,2,0.5,1)
         tri6 = AddTriangle(tmpsurface,v0,v1,v2)
         
         v0 = AddVertex(tmpsurface,2,0,0,1,0)
         v1 = AddVertex(tmpsurface,1,0,1,0.5,0.5)
         v2 = AddVertex(tmpsurface,2,0,1,1,0.5)
         tri7 = AddTriangle(tmpsurface,v0,v1,v2)
         ;...........
                                  ;und noch ein paar dazu
         
         PaintMesh map(x,y),tmpbrush
         UpdateNormals map(x,y)
         ScaleEntity map(x,y),0.5,0.5,0.5
         PositionEntity map(x,y),x*1.5,0,y*1.5
         EntityPickMode map(x,y),2
         EntityType map(x,y), 1
         tmpBrush = 0
         ;tmpsurface = 0
         
      Next
   Next


soo funktioniert auch wunderbar, ist aber nich mein problem.
mein problem is jetzt das Terrainforming, also das verschieben der vertices usw. Ich wollt das mit folgendem code lösen:

Code: [AUSKLAPPEN]
If MouseDown(2) Then
      ent = CameraPick(m\camera,MouseX(),MouseY())
         For x = 0 To 40
            For y = 0 To 40
               If map(x,y) = ent Then
                  cSurf = PickedSurface()
                  eX = EntityX(map(x,y))
                  eZ = EntityZ(map(x,y))
                  For i = 0 To CountVertices(cSurf)-1
                     vX = VertexX(cSurf, i)
                     vZ = VertexZ(cSurf, i)
                     If PickedX() > (eX+vX)-0.1 And PickedX() < (eX+vX)+0.1 Then
                        If PickedZ() > (eZ+vZ)-0.1 And PickedZ() < (eZ+vZ)+0.1 Then
                           VertexCoords cSurf, i, vX,VertexY(cSurf, i)+0.1,vZ
               
                        End If

                     End If
                  Next
               End If
            Next
         Next

   End If


aber es entstehen seltsame formen, die absolut unbrauchbar sind:
Bild

könnt ihr mir helfen?
wäre sehr nett
cya all
hamZta
Blog.

hamZta

Administrator

Betreff: na

BeitragSa, Feb 07, 2004 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
na kommt schon, einer wirds doch wissen?
Blog.

eizdealer

BeitragMo, Feb 09, 2004 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das Problem ist, dass du nur den gepickten Mesh / das gepickte Surface ermittelst und dementsprechend nur diesen Vertexpunkt höher machst. Ein "Punkt" in deinem Terrain entspricht ja 4 Vertexpunkten (am Rand auch 1 oder 2) von 4 verschiedenen Meshes und Surfaces.
Wie wäre es, wenn du die Vertexpunkte in einem Array zwischenspeicherst, ermittelst, welcher Punkt betroffen ist und dann alle Vertexe dieses Punktes erhöhst?

hamZta

Administrator

Betreff: hm

BeitragMo, Feb 09, 2004 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
das versteh ich nich ganz..
ein punkt vom terrain is doch ein vertex oder? und warum gleich von 4 verschiedenen meshes?
Blog.

eizdealer

BeitragDi, Feb 10, 2004 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, du hast das noch nicht ganz verinnerlicht, wie das mit den Meshes, Triangles und Vertexpunkten funktioniert.
Du änderst wie gesagt den Vertex eines Meshes, dort treffen allerdings 4 Meshes zusammen, die genau an dieser stelle jeweils einen Vertexpunkt haben.
Also musst du 4 Vertexpunkte anheben, um den Effekt zu erzielen. Die Denkensweise ist eigen und nicht, wie man das von der Natur aus annehmen könnte.
Aber überlege dir einfach nochmal genau, woraus dein Terrain besteht!

ViciouS

BeitragDi, Feb 10, 2004 23:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ich kann also die identität der 8 meshes um das mit der ausgewählten surface und dem ausgewählten vertex herausfinden und dann davon die surfaces checken..
dann einfach prüfen, ob dort ein vertex die gleichen x un z koordinaten hat, wie mein ausgewähltes und die y coordinate anpassen.....

Oder??

Hier mal mein Ansatz:
Code: [AUSKLAPPEN]
Function high_terrain(picked_entity)
 picked_surface = PickedSurface()
 For vertex = 0 To CountVertices(picked_surface)-1
  vertex_x = VertexX(picked_surface,vertex)
  vertex_z = VertexZ(picked_surface,vertex)
  vertex_y = VertexY(picked_surface,vertex)
   If PickedX() > (vertex_x+EntityX(picked_entity)-0.5) And PickedX() < (vertex_x+EntityX(picked_entity)+0.5) Then
    If PickedZ() > (vertex_z+EntityZ(picked_entity)-0.5) And PickedZ() < (vertex_z+EntityZ(picked_entity)+0.5) Then
     VertexCoords picked_surface,vertex,vertex_x,VertexY(picked_surface,vertex)+0.01,vertex_z
   
     
      For check_surface = 0 To CountSurfaces()-1
       For check_vertex = 0 To CountVertices(picked_surface)-1
        If VertexX(check_surface,check_vertex) = vertex_x And VertexZ(check_surface,check_vertex) = vertex_z Then
         VertexCoords check_surface,check_vertex,vertex_x,VertexY(picked_surface,vertex)+0.01,vertex_z
        End If
       Next
      Next


    End If
   End If
 Next
End Function


Hab allerdings noch nicht die umliegenden meshes herausgefunden...
mach ich jetzt oder morgen
Skaten ist scheisse...
Bilanz: 3 Knochenbrüche in 4 Jahren...
und es werden mehr Laughing
 

OJay

BeitragMi, Feb 11, 2004 0:06
Antworten mit Zitat
Benutzer-Profile anzeigen
hm. mal ein vorschlag zur rangehensweise aus einer anderen richtung: wieso erstellt ihr nicht die terrains aus einer heightmap (pixel für pixel lesen und entsprechend die z-werte setzen). und dann zeichnet ihr einfach mit einem pinsel auf die heightmap und aktualisiert an den stellen die vertices...

so machen es meines wissens auch moderne 3D engines ala far cry und unreal und es ist nicht zu langsam...

hamZta

Administrator

Betreff: hm

BeitragMi, Feb 11, 2004 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
wär auch keine schlechte möglichkeit @ojay...
ich werd mich mal rumspielen..

thx @all!
Blog.

ViciouS

BeitragMi, Feb 11, 2004 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
und die texturierung der einzelnen tiles????
es geht ja um eine art 3d-tile-engine..
Skaten ist scheisse...
Bilanz: 3 Knochenbrüche in 4 Jahren...
und es werden mehr Laughing

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group