Aus 2D Font ein 3D Font (Blitz3D) von ??? |
Die Routine ist nicht ganz komplett, aber es soll als Anhaltspunkt dienen wie man aus einem 2D Bild ein 3D Mesh erstellen kann... [code:1:e4c9769c87] Graphics3D 800,600,32,2 SetBuffer BackBuffer() Local fsize = 100 Local fname$ = "Comic Sans MS" Local font = LoadFont(fname$, fsize) Local normalfont = LoadFont("Arial", 20) SetFont font ;--- Local char$ = "W" Local alpha_mesh = Create3DFont_FrontMesh(char$) ;--- cam = CreateCamera() MoveEntity cam,70,0-50,-80 light = CreateLight(1,cam) TurnEntity light,90,0,0 WireFrame 1 While Not KeyHit(1) If KeyDown(200) Then MoveEntity cam, 0,-1, 0 If KeyDown(208) Then MoveEntity cam, 0, 1, 0 If KeyDown(203) Then MoveEntity cam,-1, 0, 0 If KeyDown(205) Then MoveEntity cam, 1, 0, 0 If KeyDown(201) Then MoveEntity cam, 0, 0, 1 If KeyDown(209) Then MoveEntity cam, 0, 0,-1 TurnEntity alpha_mesh, 0, 0, 0 RenderWorld() ;--- SetFont font Text 0, 0, char$ SetFont normalfont Text 0, 550, "Mit CousorTasten + PageUp + PageDown steuern // Triangles: "+ CountTriangles(GetSurface(alpha_mesh,1)) Flip Delay 20 Wend End ;############################################################ Function Create3DFont_FrontMesh(char$) Local x0, y0 Local x1, y1 Local x2, y2 Local x3, y3 Local x4, y4 Local max_y = StringHeight(char$) Local max_x = StringWidth(char$) ;---- Local brush = CreateBrush(255,255,255) Local mesh = CreateMesh() Local surface = CreateSurface(mesh,brush) ;---- Local color_search = $FF00FF00 Color 0,255,0 ClsColor 0,0,0 Cls Text 0,0, char$ ;---- For y0 = 0 To max_y routine$ = "search" For x0 = 0 To max_x If ReadPixel(x0,y0) = color_search Then If routine$ = "search" Then If (x0 > 0) Then routine$ = "p1_p012" Else routine$ = "p2_p023" EndIf EndIf If routine$ = "next" Then routine$ = "p2_p023" EndIf ; schleife ausführen bis keine verwertbaren ; punkte für den Algorithmus gefunden werden While ( (routine$ <> "next") And (routine$ <> "search") ) Select routine$ Case "p1_p012" ;################# x1 = x0-1 : y1 = y0+1 If ReadPixel(x1, y1) = color_search Then routine$ = "p2_p012" Else routine$ = "p2_p023" EndIf Case "p2_p012" ;################## CREATE VERTEX P012 x2 = x0 : y2 = y0+1 If ReadPixel(x2, y2) = color_search Then surface = Add_Triangle(surface,x0,y0,x2,y2,x1,y1) routine$ = "p3_p023" Else routine$ = "p3_p034" EndIf Case "p2_p023" ;################# x2 = x0 : y2 = y0+1 If ReadPixel(x2, y2) = color_search Then routine$ = "p3_p023" Else routine$ = "p3_p034" EndIf Case "p3_p023" ;################# CREATE VERTEX P023 x3 = x0+1 : y3 = y0+1 If ReadPixel(x3, y3) = color_search Then surface = Add_Triangle(surface,x0,y0,x3,y3,x2,y2) routine$ = "p4_p034" Else routine$ = "p4_p024" EndIf Case "p3_p034" ;################# x3 = x0+1 : y3 = y0+1 If ReadPixel(x3, y3) = color_search Then routine$ = "p4_p034" Else routine$ = "p4" EndIf Case "p4_p034" ;################# CREATE VERTEX P034 x4 = x0+1 : y4 = y0 If ReadPixel(x4, y4) = color_search Then surface = Add_Triangle(surface,x0,y0,x4,y4,x3,y3) routine$ = "next" Else routine$ = "search" EndIf Case "p4_p024" ;################# CREATE VERTEX P024 x4 = x0+1 : y4 = y0 If ReadPixel(x4, y4) = color_search Then surface = Add_Triangle(surface,x0,y0,x4,y4,x2,y2) routine$ = "next" Else routine$ = "search" EndIf Case "p4" ;###################### x4 = x0+1 : y4 = y0 If ReadPixel(x4, y4) = color_search Then routine$ = "next" Else routine$ = "search" EndIf Default ;######################## RuntimeError "ERROR: Not found "+ Chr$(34) + routine$ + Chr$(34) +" Function. Push any Key..." WaitKey() End End Select Wend EndIf Next Next ;--- UpdateNormals mesh TurnEntity mesh,180,0,0 Return mesh End Function ;--- Function Add_Triangle(surface, x0, y0, x1, y1, x2, y2) v0 = AddVertex(surface, x0, y0, 0) v1 = AddVertex(surface, x1, y1, 0) v2 = AddVertex(surface, x2, y2, 0) AddTriangle(surface, v0, v1, v2) Return surface End Function [/code:1:e4c9769c87] |