Seite 1 von 1

3D Engine - Heighmap -> 3d Mesh!?

Verfasst: 11.11.2018 14:49
von Mijikai
Ich würde gerne eine HeightMap in einen 3D Mesh konvertieren und diesen dann Rendern.
Das Bild kann ich in eine Positionsliste (xyz) verwandeln.

Wie könnte ich das umsetzten? (3D Anfänger) :oops:

Mein Code soweit:

Code: Alles auswählen

UsePNGImageDecoder()
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Structure VECTOR_STRUCT
  X.f
  Y.f
  Z.f
EndStructure

Structure BITMAP_STRUCT
  bmType.l
  bmWidth.l
  bmHeight.l
  bmWidthBytes.l
  bmPlanes.w
  bmBitsPixel.w
  Alignment.b[4]
  *bmBits
  PixelSize.i
EndStructure

Structure HEIGHMAP_STRUCT
  Id.i
  Handle.i
  Bitmap.BITMAP_STRUCT
  Count.i
  *VectorBuffer
  VectorBufferSize.i
EndStructure

Global HeightMap.i

Procedure.i HeightMapCatch(*Buffer)
  Protected *HeightMap.HEIGHMAP_STRUCT
  Protected PosX.i
  Protected PosY.i
  Protected *Pixel.Ascii
  Protected *Vector.VECTOR_STRUCT
  Protected *Scanline
  If *Buffer
    *HeightMap = AllocateStructure(HEIGHMAP_STRUCT)
    If *HeightMap
      With *HeightMap
        \Id = CatchImage(#PB_Any,*Buffer)
        If IsImage(\Id)
          \Handle = ImageID(\Id)
          If GetObject_(\Handle,SizeOf(BITMAP),@\Bitmap)
            \Bitmap\PixelSize = \Bitmap\bmBitsPixel / 8
            \Count = \Bitmap\bmWidth * \Bitmap\bmHeight
            \VectorBufferSize = \Count * SizeOf(VECTOR_STRUCT)
            \VectorBuffer = AllocateMemory(\VectorBufferSize)
            If \VectorBuffer
              *Vector = \VectorBuffer
              For PosY = 0 To \Bitmap\bmHeight - 1
                *Scanline = \Bitmap\bmBits + (PosY * \Bitmap\bmWidthBytes)
                For PosX = 0 To \Bitmap\bmWidth - 1
                  *Pixel = *Scanline + (PosX * \Bitmap\PixelSize)
                  *Vector\X = PosX
                  *Vector\Y = PosY
                  *Vector\Z = *Pixel\a * 2
                  *Vector + SizeOf(VECTOR_STRUCT)
                Next
              Next
              ProcedureReturn *HeightMap
            EndIf 
          EndIf
          FreeImage(\Id)
        EndIf 
      EndWith  
      FreeStructure(*HeightMap)
    EndIf 
  EndIf 
EndProcedure

Procedure.i HeightMapBuffer(*HeightMap.HEIGHMAP_STRUCT)
  With *HeightMap
    ProcedureReturn \VectorBuffer
  EndWith 
EndProcedure

Procedure.i HeightMapCount(*HeightMap.HEIGHMAP_STRUCT)
  With *HeightMap
    ProcedureReturn \Count
  EndWith 
EndProcedure

Procedure.i HeightMapBufferSize(*HeightMap.HEIGHMAP_STRUCT)
  With *HeightMap
    ProcedureReturn \VectorBufferSize
  EndWith
EndProcedure

Procedure.i HeightMapFree(*HeightMap.HEIGHMAP_STRUCT)
  With *HeightMap
    FreeImage(\Id)
    FreeMemory(\VectorBuffer)
    FreeStructure(*HeightMap)
  EndWith
EndProcedure

HeightMap = HeightMapCatch(?HeightMap)

If  HeightMap
  Debug "HeightMap: 0x" + Hex(HeightMap)
  Debug "VectorBuffer: 0x" + Hex(HeightMapBuffer(HeightMap))
  Debug "VectorBufferSize: " + Str(HeightMapBufferSize(HeightMap))
  Debug "VectorCount: " + Str(HeightMapCount(HeightMap))
  
  ; If InitEngine3D()
  ;   InitSprite()
  ;   InitKeyboard()
  ;   InitMouse()
  ;   If Screen3DRequester()
  ;   
  ;   EndIf
  ; EndIf 
  
  HeightMapFree(HeightMap)
EndIf 
End

DataSection
  HeightMap:
  ;map2.png - Size: 1629 Bytes
  !dw 05089h, 0474Eh, 00A0Dh, 00A1Ah, 00000h, 00D00h, 04849h, 05244h, 00000h, 0AC01h, 00000h, 01A01h, 00208h, 00000h, 0C200h, 0F439h, 00093h, 00000h, 07009h, 05948h, 00073h, 00E00h, 000C4h, 00E00h, 001C4h, 02B95h, 01B0Eh, 00000h, 00F06h, 04449h, 05441h, 0DA78h, 0DDEDh, 06DC1h, 05AE2h, 08014h, 064E1h, 06B04h, 060EAh, 03711h
  !dw 0DC80h, 07D0Dh, 0F424h, 03741h, 01A51h, 01648h, 0C1D4h, 0CD9Ah, 0D02Ch, 01144h, 01B19h, 0CC63h, 0BDF5h, 07CF7h, 06ADFh, 07A1Eh, 08903h, 0FC99h, 0C73Ah, 0F026h, 004F4h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 09000h, 0E7A9h, 07F71h, 0B36Dh, 054D9h, 0687Fh, 03E3Eh
  !dw 0463Eh, 0DDFFh, 0C708h, 0EA07h, 071F8h, 0E3FEh, 000E8h, 08991h, 02020h, 00082h, 00822h, 0D010h, 09262h, 0B97Bh, 01AE7h, 09542h, 0101Ch, 0D798h, 08BF0h, 02693h, 0C041h, 00C3Ah, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h
  !dw 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 067D0h, 0E851h, 0FDD7h
  !dw 0FAFAh, 0FC1Ah, 0DB99h, 076EDh, 0F9FEh, 0DC42h, 05E08h, 0F6F5h, 076F6h, 016F5h, 0EB00h, 02030h, 00082h, 00822h, 08220h, 02200h, 01008h, 0A046h, 0C3ABh, 0D995h, 0B76Eh, 0BA0Fh, 0FDE7h, 03F7Eh, 0B7EFh, 0F9F6h, 0E9F9h, 07327h, 0A684h, 01C69h, 09304h, 08020h, 00208h, 02088h, 00880h, 05C02h, 070B1h, 00A08h, 03875h, 0A61Ch
  !dw 0ABBAh, 07AF5h, 078EDh, 01262h, 01004h, 00041h, 00411h, 04110h, 01100h, 01004h, 00041h, 00411h, 04110h, 01100h, 01004h, 00041h, 00411h, 04110h, 01100h, 01004h, 00041h, 00411h, 04110h, 01100h, 02804h, 07781h, 08696h, 0CC4Ah, 051F8h, 045A5h, 0DA7Fh, 049A7h, 0B010h, 0030Eh, 02088h, 00880h, 08802h, 08020h, 00208h, 02088h
  !dw 00880h, 08802h, 08020h, 00208h, 0C6D4h, 0CDAFh, 0CE11h, 0B972h, 0EACCh, 039EBh, 04E9Dh, 0149Eh, 02093h, 00880h, 08802h, 08020h, 00208h, 0E224h, 008C2h, 0A5D1h, 02EBFh, 0DB91h, 01995h, 02C11h, 06ED2h, 0FBB7h, 0E37Dh, 0BB76h, 0F9FDh, 0879Fh, 0C1C3h, 00C13h, 08758h, 0AC01h, 030C3h, 097A9h, 09797h, 05B8Bh, 0BEBEh, 01CBEh
  !dw 01116h, 08884h, 0BBF9h, 05DB8h, 0AD0Dh, 050C3h, 0FE6Dh, 00ABAh, 0A438h, 08892h, 05420h, 00038h, 0A0EAh, 08208h, 0EA02h, 008A0h, 00282h, 0A0EAh, 00208h, 02088h, 00880h, 0F842h, 0D85Dh, 02C46h, 00082h, 00822h, 08220h, 02200h, 04508h, 0F3BAh, 0E077h, 00AFCh, 0089Dh, 06402h, 0E6ADh, 05037h, 0AF58h, 09ED7h, 02060h, 0046Eh
  !dw 0AA61h, 0788Dh, 02BDCh, 0125Dh, 0C2EFh, 0D34Dh, 0B278h, 0C3ACh, 0A8F0h, 0660Eh, 0405Eh, 01044h, 0EA32h, 002A0h, 0208Ah, 0EDC4h, 002A0h, 0A596h, 073AAh, 0FB82h, 0DEFDh, 04A33h, 00E9Ah, 07B7Ah, 0117Dh, 03504h, 03AC4h, 0200Ch, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 03900h, 062F3h, 04EE9h, 0EFEFh
  !dw 0E7EFh, 0B43Fh, 0EB6Dh, 05468h, 0B96Ch, 03A5Ch, 02608h, 03A41h, 0780Bh, 067F1h, 00440h, 04401h, 04010h, 02304h, 0C2ECh, 06236h, 09BA8h, 0230Bh, 07384h, 09D3Ah, 0041Ch, 0824Ch, 02200h, 06C38h, 0B617h, 08311h, 00208h, 02088h, 00880h, 0DCC6h, 00185h, 08C11h, 0B568h, 0495Ah, 08824h, 08020h, 0DA08h, 00185h, 08C11h, 00BBCh
  !dw 0250Bh, 0A088h, 00214h, 06822h, 00617h, 03044h, 000F2h, 09728h, 08220h, 00882h, 0A088h, 0185Dh, 04110h, 01FA3h, 08220h, 04726h, 00440h, 02EABh, 0D99Ah, 04410h, 02ED0h, 0880Ch, 03620h, 01062h, 098C1h, 0332Dh, 08221h, 0DA08h, 00185h, 00411h, 0C110h, 0BB68h, 07FF0h, 044E7h, 005A7h, 00441h, 0C2EDh, 00880h, 08802h, 0F560h
  !dw 0F0BBh, 0EEE3h, 01004h, 062C1h, 06176h, 0332Bh, 02088h, 03D40h, 0D616h, 0C4DBh, 0DB8Fh, 0ADB6h, 0767Fh, 08220h, 0B5D9h, 0A6ECh, 0F9C5h, 03C78h, 0FFA6h, 0D506h, 0EA13h, 0875Fh, 02AE7h, 01160h, 0FA67h, 0845Ch, 0FA81h, 00823h, 08220h, 08C05h, 0AE81h, 04311h, 0F235h, 0273Ah, 0B6D8h, 0E8EDh, 02FA5h, 09871h, 03F46h, 0E8DCh
  !dw 089F3h, 009CEh, 0FD42h, 0EC11h, 060EFh, 0F31Dh, 0FF57h, 0D177h, 04895h, 08405h, 01128h, 0FEFCh, 0FF81h, 0C29Dh, 02073h, 05D6Ah, 0E545h, 0660Fh, 0EF91h, 0C139h, 01FAEh, 07BFEh, 09E5Eh, 080A2h, 03140h, 08C11h, 041D3h, 00405h, 01C11h, 0C1D3h, 0523Ah, 080A8h, 0AF30h, 07E02h, 0AE6Dh, 014EBh, 0B9E1h, 0E520h, 0229Eh, 03F94h
  !dw 00930h, 05DC6h, 0158Dh, 04410h, 06E30h, 01507h, 0AC10h, 013C3h, 0C6AFh, 0BCA5h, 0467Ah, 086FEh, 09A68h, 041C6h, 024C0h, 0E158h, 0A848h, 02080h, 07182h, 0A83Bh, 02080h, 0E982h, 0983Ah, 00A5Bh, 01015h, 055B2h, 03BF6h, 0E74Bh, 0EAFFh, 0F919h, 09303h, 0DC60h, 058D5h, 04101h, 0E304h, 05076h, 0C101h, 09C3Ah, 06AC5h, 0FE9Ch
  !dw 033D5h, 007F2h, 0C126h, 023B8h, 002A1h, 00882h, 0EDC6h, 002A0h, 00882h, 0DD66h, 05F41h, 0700Ch, 05161h, 037EBh, 0F3D6h, 019EAh, 003F9h, 09F2Ah, 0CF04h, 0FF66h, 05EA0h, 0149Fh, 0220Ch, 09198h, 01704h, 07D88h, 02714h, 02088h, 00880h, 085DAh, 0C46Dh, 08220h, 076D1h, 01B61h, 08831h, 08020h, 00208h, 0E088h, 0E6BCh, 0133Dh
  !dw 0B177h, 03B11h, 0082Dh, 03822h, 0E733h, 000E9h, 030EBh, 08C40h, 04E08h, 07EB5h, 0FF1Eh, 07D29h, 0073Dh, 04F42h, 0E382h, 0E176h, 0ED9Fh, 0D11Bh, 00B41h, 09438h, 0E162h, 0F410h, 0EFE4h, 046E2h, 00369h, 06093h, 002C4h, 033DEh, 0DA12h, 04188h, 09304h, 068BAh, 0F0CDh, 06DD9h, 0E9E0h, 0E1BFh, 00967h, 08D8Dh, 08220h, 00C95h
  !dw 0D380h, 0848Eh, 05640h, 09FA2h, 0EC13h, 0D9C9h, 05BF7h, 0E6A2h, 0B9FCh, 080C6h, 0B049h, 01773h, 0A49Eh, 04F80h, 01FBDh, 0725Ah, 048D3h, 0B4E8h, 09820h, 09304h, 09FEAh, 06ED4h, 050FAh, 09EA4h, 0EB37h, 019EFh, 05709h, 095ABh, 019C5h, 0824Ch, 0AE39h, 0E3C0h, 0163Eh, 0AA6Eh, 01091h, 0C110h, 076D9h, 09EE1h, 00DFCh, 05CF9h
  !dw 09EA4h, 067FFh, 00748h, 0C46Dh, 08220h, 0EDB3h, 0A3C2h, 0C007h, 0B9E1h, 07DFCh, 02EFFh, 0809Eh, 0E608h, 002B2h, 033DFh, 05A00h, 0418Dh, 00B04h, 0DFCEh, 00324h, 09DE0h, 02123h, 08220h, 0D40Fh, 0AE75h, 0E06Dh, 0608Bh, 04CEEh, 07F61h, 0BD7Ch, 02AC7h, 06088h, 06D6Ah, 0F6DBh, 0800Fh, 01553h, 06AF0h, 08D4Fh, 02084h, 01982h
  !dw 0860Dh, 00E13h, 05680h, 01063h, 002C1h, 0F792h, 001D0h, 07470h, 06D61h, 020C4h, 03382h, 0C82Ch, 01EC9h, 0D928h, 00163h, 09822h, 09569h, 01074h, 03044h, 000D6h, 0EB78h, 0DB43h, 02188h, 0C513h, 081BFh, 05742h, 0724Dh, 0C598h, 0DE7Ah, 00176h, 00930h, 0D946h, 0AD46h, 060C6h, 08C12h, 01C5Eh, 02123h, 00498h, 05453h, 0F32Fh
  !dw 0AB99h, 02FA0h, 04C15h, 0A682h, 0AB3Fh, 09831h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 0304Ah, 0BBCDh, 06CC8h, 01B36h, 01287h, 00930h, 08802h, 08020h, 00208h, 02088h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 0FA13h, 0770Bh, 02665h, 06E12h, 01287h, 0006Dh, 00000h, 04900h, 04E45h, 0AE44h, 06042h, 00082h
EndDataSection
Heightmap einzeln:
Bild

Re: 3D Engine - Heighmap -> 3d Mesh!?

Verfasst: 11.11.2018 17:30
von DarkDragon
CreateTerrain sollte da helfen. Es gibt glaube ich ein Beispiel im PureBasic Examples Ordner.

Re: 3D Engine - Heighmap -> 3d Mesh!?

Verfasst: 11.11.2018 18:09
von Mijikai
DarkDragon hat geschrieben:CreateTerrain sollte da helfen. Es gibt glaube ich ein Beispiel im PureBasic Examples Ordner.
Beispiele hab ich gefunden jedoch ohne jede weitere Erklärung was mir nichts bringt.
Anscheinend ist es nicht einmal möglich Resourcen vom Speicher zu laden!?

Re: 3D Engine - Heighmap -> 3d Mesh!?

Verfasst: 11.11.2018 21:07
von DarkDragon
Mijikai hat geschrieben:
DarkDragon hat geschrieben:CreateTerrain sollte da helfen. Es gibt glaube ich ein Beispiel im PureBasic Examples Ordner.
Beispiele hab ich gefunden jedoch ohne jede weitere Erklärung was mir nichts bringt.
Nunja, man erzeugt ein Terrain Objekt mit CreateTerrain und nimmt dann DefineTerrainTile um einzelne Heightmaps reinzuladen (Terrain.pb z.B.). Zur Darstellung legt man dann auch noch eine Textur auf das Terrain mit AddTerrainTexture.
Mijikai hat geschrieben:Anscheinend ist es nicht einmal möglich Resourcen vom Speicher zu laden!?
Mit der PB OGRE Anbindung nicht, nein. Da wird man auch nicht allzu glücklich damit. Was soll es denn werden und wie kompliziert darf es werden? Mit OpenGL kriegt man sowas relativ gut und einfach hin, wenn man Grundwissen in linearer Algebra und affiner Geometrie/Abbildung/Transformation hat.

Re: 3D Engine - Heighmap -> 3d Mesh!?

Verfasst: 11.11.2018 21:28
von Mijikai
OpenGL wäre definitiv besser das mit Ogre bring eh nix.

Vor einiger Zeit hatte ich es schon einmal Versucht: http://forums.purebasic.com/german/view ... =4&t=30792
Da bin ich am Ende jedoch abgedriftet und hab was anderes Programmiert.
Das ursprüngliche Problem wurde nicht gelöst.