Seite 1 von 1

3D-Landschaft aus Meßwerten erstellen

Verfasst: 26.10.2007 11:22
von moin
Hallo,
In Zukunft soll mein kleiner Roboter mit einem Ultraschallsensor im Raum umherfahren und Entfernungsangaben ("Ultraschallradar") aufnehmen und die Hindernisse in einem Array abspeichern. Der Speicher soll dann über Funk vom PC ausgelesen werden können.

Auf dem PC möchte ich dann das Array als eine Art Landschaft mit unterschiedlichen Höhen darstellen. (Die Höhe soll der Wahrscheinlichkeit für ein Hindernis entsprechen)

Für eine solche 3D-Darstellung auf dem PC fehlt mir leider der erste Lösungsansatz, da ich noch nie mit 3D gearbeitet habe :-(. Hat PureBasic hierfür mächtige Befehle? Wie würdet ihr das Problem lösen?

Ich danke schonmal für eure Antworten (hoffentlich :-))

Euer moin

Verfasst: 26.10.2007 11:51
von coder
Also PureBasic hat schon implantierte Befehle für 3D...
Aber ob die mächtig sind ist geschmackssache! (Die meisten hier, denke ich mal, halten nicht viel von dieser Engine)

Für deinen Zweck dürfte es aber reichen, du willst ja nur ein Terrain darstellen und das eventuell noch Farblich einfärben oder lieg ich da falsch? Dazu solltest du dir mal die Terrain+Kamera Library in der PB-Hilfe und die Examples dazu ansehen!

Zu den Daten: Ich würde die Daten nicht in einem Array speichern sondern in einer Datenbank (aber natürlich nur wenn du den Rob nicht über einen Microprossor steuerst) speichern und die dann über die PB-Netzwerk Befehle zu deinem PC senden, nur ein Voschlag...
Du kannst es natürlich auch über die serielle Schnittstelle machen

Verfasst: 26.10.2007 12:15
von moin
Der kleine Roboter, wie auch die Erstellung der "Karte " werden je über einen Mikrocontroller (ATMEGA128) gesteuert und die Daten seriell über Funkt übermittelt.

Verfasst: 26.10.2007 12:41
von moin
Ich bin noch auf der Suche nach einem einfachen Beispiel, da das Beispiel aus der Hilfe mich erschlägt.

Verfasst: 26.10.2007 14:28
von #NULL
wenn es nur um ein grid (so'n gitternetz) geht kann man sowas auch einfach als 2d-isometrie darstellen.

NicTheQuick hat eine include zur 2d-3d-konvertierung gebaut: http://www.purebasic.fr/german/viewtopic.php?t=13426

ich habe mal ein prog zum 3D FunktionsPlotting geschrieben, dass heißt es wird ein 2dimensionales array isometrisch dargestellt.

Verfasst: 28.10.2007 08:35
von moin
Hallo,
Hier meine bisherige Lösung.

Was fehlt noch:
Eine leichte Schattenbildung würde die Übersicht und den Überblick deutlich verbessern-nur kann ich sie nicht erzeugen :-(.
Gibt es eine einfachere Lösung. In den Foren wird als Lösungsweg die .dll "Irrlicht" vorgeschlagen. Hierzu finde ich aber keine verhältnismäßig einfachen Beispiele um mein Programm unzuschreiben. Habt ihr vielleicht ein gutes Beispiel auf eurer Festplatte oder einen guten Link?

PS: Ich würde euch gerne die Terrain-Dateinen zu Verfügung stellen, habe aber keinen Ort zum Hochladen.

Verfasst: 28.10.2007 08:36
von moin
Hab das Programm vergessen

Code: Alles auswählen

InitEngine3D()
InitKeyboard()
;InitMouse()
InitSprite()

hoehe1=60

If OpenWindow(0, 0, 0, 1200, 900,"TEST",#PB_Window_SystemMenu|#PB_Window_SizeGadget)
    OpenWindowedScreen(WindowID(0), 0, 0, 800, 800, 0.1, 0, 0)
    If CreateGadgetList(WindowID(0))
        ButtonGadget(1,1050, 110,60,20,"Button 1")
        ButtonGadget(2,1050, 140,60,20,"Button 2")
        ButtonGadget(3,1050, 170,60,20,"Button 3")
        TextGadget  (4,1050, 210,60,30,"")
    EndIf
    
EndIf

Define.f cameraX, cameraY,cameraZ
Define.f cameraRotationX,cameraRotationY, cameraRotationZ, hoehe, hoehe1

Add3DArchive(".", #PB_3DArchive_FileSystem)
AmbientColor(RGB(155,255,255))
    
CreateMaterial  (0, LoadTexture(0, "Terrain_Texture5.png"))
AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail1.jpg"), 1)

CreateTerrain("terrain03a.png",MaterialID(0),1, 1, 1)
 ;WorldShadows(#PB_Shadow_Modulative)             ;               funktioniert nicht
 ;;CreateLight(0, RGB(0,0,255), 700, 200, 990)   ; Blue light     funktioniert nicht

CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0, 200, 100, 210)
CameraFOV(0, 71)
CameraProjection(0, #PB_Camera_Perspective )
 ;CameraRenderMode(0, #PB_Camera_Wireframe)

Repeat
ExamineKeyboard()
 ;ExamineMouse() 
Event = WaitWindowEvent(1) 
WindowID = EventWindow() 
GadgetID = EventGadget() 
EventType = EventType() 

Select GadgetID
      Case 1, 2, 3
      SetGadgetText(4,"Button "+Str(GadgetID)+" pressed.")
EndSelect
    
  If KeyboardPushed(#PB_Key_Pad7)
    cameraRotationX+1
  ElseIf KeyboardPushed(#PB_Key_Pad4)
    cameraRotationX-1
  Else
    cameraRotationX=0
  EndIf
  
   If KeyboardPushed(#PB_Key_Pad8)
    cameraRotationY=0.1 
  ElseIf KeyboardPushed(#PB_Key_Pad5)
    cameraRotationY=-0.1 
  Else 
  cameraRotationY=0
  EndIf
  
  If KeyboardPushed(#PB_Key_Pad9)
    cameraRotationZ=0.1 
  ElseIf KeyboardPushed(#PB_Key_Pad6);Z
    cameraRotationZ=-0.1 
  Else 
  cameraRotationZ=0
  EndIf
    
  
  If KeyboardPushed(#PB_Key_Up)
    cameraZ-0.1
  ElseIf KeyboardPushed(#PB_Key_Down)
    cameraZ+0.1
  Else
    cameraZ=0
  EndIf
  
  If KeyboardPushed(#PB_Key_Left)
    cameraX-0.1
  ElseIf KeyboardPushed(#PB_Key_Right)
    cameraX+0.1
  Else
    cameraX=0
  EndIf
  
  
  
  If KeyboardPushed(#PB_Key_PageUp)
    hoehe1.l=hoehe1+1
  ElseIf KeyboardPushed(#PB_Key_PageDown)
    If hoehe1 > 1
    hoehe1.l=hoehe1-1
    EndIf
  EndIf
  
hoehe = TerrainHeight(CameraX(0),CameraZ(0)) +hoehe1

RotateCamera(0, cameraRotationX, cameraRotationY, cameraRotationZ)
MoveCamera(0, cameraX,-(CameraY(0)-hoehe),cameraZ)

RenderWorld()
FlipBuffers()

Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

End

Verfasst: 30.10.2007 15:38
von Thalius
moin hat geschrieben:Hallo,
Hier meine bisherige Lösung.

Was fehlt noch:
Eine leichte Schattenbildung würde die Übersicht und den Überblick deutlich verbessern-nur kann ich sie nicht erzeugen :-(.
Gibt es eine einfachere Lösung. In den Foren wird als Lösungsweg die .dll "Irrlicht" vorgeschlagen. Hierzu finde ich aber keine verhältnismäßig einfachen Beispiele um mein Programm unzuschreiben. Habt ihr vielleicht ein gutes Beispiel auf eurer Festplatte oder einen guten Link?
hier das bracuhst du : http://www.purearea.net/pb/showcase/show.php?id=367

danach hast du im Examples Ordner einen weiteren namens "IrrlichtWrapper" mit ca 40 Beispielen. *g*

Thalius