3D-Landschaft aus Meßwerten erstellen

Anfängerfragen zum Programmieren mit PureBasic.
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

3D-Landschaft aus Meßwerten erstellen

Beitrag 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
Benutzeravatar
coder
Beiträge: 204
Registriert: 25.09.2005 17:53
Computerausstattung: Intel Core2Quad Q8200 @ 2.33GHz
ASUS P5Q3, 2GB DDR3-1066 RAM, ATi Raedeon HD 4850
Wohnort: Deutschland
Kontaktdaten:

Beitrag 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
Windows 7 x64 | PureBasic 4.60 4.50 4.02
Ja verdammt, meine Eltern wohnen immer noch bei mir!
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

Beitrag 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.
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

Beitrag von moin »

Ich bin noch auf der Suche nach einem einfachen Beispiel, da das Beispiel aus der Hilfe mich erschlägt.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

Beitrag 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.
moin
Beiträge: 59
Registriert: 03.07.2007 08:38
Wohnort: Norddeutschland

Beitrag 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
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag 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
"...smoking hash-tables until until you run out of memory." :P
Antworten