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]



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: