Text schreiben in 3D

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

EPS

Betreff: Text schreiben in 3D

BeitragDi, Nov 22, 2005 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi zusammen,

ich befasse mich noch nicht sehr lange mit der 3D Materie daher auch diese wohl etwas dumme Frage, aber was solls.

Also, um mir den Einstieg in die 3D Welt etwas zu erleichtern und weil es sich für die Thematik anbot, habe ich diese SpriteLib benutzt:

http://www.blitzbasic.com/code...p?code=456

funzt auch alles einwandfrei. Nur wollte ich jetzt eine Textausgabe realisieren. D.h. ich lade als "3DAnimImage" die Grafiken der Buchstaben.

Der Text der geschrieben werden soll ändert sich im laufe des Programms, sagen wir es ist eine Bestenliste o.ä. Wenn ich jetzt in 2D wäre würde ich auf dem BackBuffer einfach jeden Buchstaben (bzw. Bildframe) per DrawImage zeichnen. Mein Font ist aber schön antialised mit nem Schatten drunter und das kann ich mit der Lib prima darstellen - in 3D versteht sich.


So, nun aber zum Problem:

Mit der Lib kann ich nur jeweils einen Buchstaben darstellen. Also wenn ich z.B. "ABA" schreiben möchte, dann setzt er mir das erste "A" an die gewünschte Position, dann das "B" und wenn ich jetzt das zweite "A" schreibe wird eigentlich nur das erste in der Position verändert.

Das ganze hängt natürlich damit zusammen das die Grafiken durch die Lib als Meshes gehandhabt werden und mir ist demnach auch klar warum dies passiert, jedoch suche ich nach einer Möglichkeit wie ich trotzdem meinen schönen Font benutzen - und damit die Vorzüge der 3D Darstellung - und Text frei schreiben kann.

Ich könnte natürlich nach jedem gesetzten Buchstaben ein RenderWorld durchführen damit das ganze in den BackBuffer kommt, aber bei angenommenen 10 Zeilen mit 20 Zeichen wäre das 200 x RenderWorld und das ist ja wohl Unsinn. Die zweite Möglichkeit wäre pro zu schreibenden Buchstaben jeweils den passenden als Grafik (Textur) zu laden - aber auch das erscheint mir etwas Sinnfrei.

Zusammengefasst heißt das in etwa: "Wie kann ich einen schönen Font in 3D als Text auf den Bilschirm zeichnen?"

Vielen Dank für die Aufmerksamkeit und hoffentlich für Hilfe.
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

Ebola33

BeitragDi, Nov 22, 2005 4:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ganz einfache Sache das. Du musst einfach nur zusehen dass deine Buchsaben bzw. Zahlen und Sonderzeichen auf einer Textur liegen. Dann benutzt du mein altes Single Surface System Wink
BlitzBasic: [AUSKLAPPEN]

; ******************************************************************************************************************************
; ****************** Variabalen und Felder für das Single Surface Bereitstellen ******************
; ******************************************************************************************************************************
Const SS_Swp% = Screen_Width +20 ; Recycleposition vorberechnen
Const SS_Shp% = Screen_Height +20 ; Recycleposition vorberechnen
Const SS_Swd2% = Screen_Width/2 ; Bildschirmbreite / 2 für Abstand zur Kamera.
Const SS_Shd2% = Screen_Height/2 ; Bildschirmbreite / 2 für Abstand zur Kamera.
Const SS_Sprite_Max% = 3000 ; Maximale SS_Sprite Anzahl pro Layer
Global SS_SpAnz = SS_Sprite_Max% ; Anzahl der aktiven Sprites ?
Global SS_Sprite_Anzahl%= SS_Sprite_Max ; Sprite anzahl, danach werden die schleifen gesteuert <----- entfernt
Global SS_Textur% = LoadTexture ( \"media/gfx/text.png\", 2);2) ; textur
Global SS_Container% = CreateMesh ( ) ; Container für Single Surface

Global SS_Surface% = CreateSurface ( SS_Container ) ; Das Single Surface
Dim SS_Vertex% ( SS_Sprite_Max,4 ) ; vertexhandle
Dim SS_Cos_Tab# ( 360 ) ; zum vorberechnen der cos werte
Dim SS_Sin_Tab# ( 360 ) ; zum vorberechnen der sin werte
Dim SS_Sprite# ( SS_Sprite_Max, 0 ) ; Sprite aktiv oder nicht
EntityFX SS_Container, 1+4+32+2;1;1+2+32 ; Ein paar Effekte
EntityTexture SS_Container, SS_Textur ; SS - Mesh texturieren

;*********************************** Vorberechnen der Texturkoordinaten und in Array ablegen ******************************



Dim SS_TKL# ( 65,8 ) ; Textur-Koordinaten-Liste 64 Objekte in der Textur a 4 Vetices u/v
SS_uadd#=1.0/8 ; texturkoordinaten durch 8 teilen (8x8 tiles)
SS_vadd#=1.0/8 ; texturkoordinaten durch 8 teilen (8x8 tiles)
SS_u#=0.0:SS_v#=0.0
For i=1 To 64 ; alle Tiles in der Textur durchgehen
SS_TKL ( i,1 ) = SS_u+SS_uadd : SS_TKL ( i,2 ) = SS_v ; vertex 1 u/v
SS_TKL ( i,3 ) = SS_u : SS_TKL ( i,4 ) = SS_v ; vertex 2 u/v
SS_TKL ( i,7 ) = SS_u : SS_TKL ( i,6 ) = SS_v+SS_vadd ; vertex 3 u/v
SS_TKL ( i,5 ) = SS_u+SS_uadd : SS_TKL ( i,8 ) = SS_v+SS_vadd ; vertex 4 u/v
SS_u=SS_u+SS_uadd
If SS_u>=1.0 Then SS_u=0.0 : SS_v=SS_v+SS_vadd
Next


;*********************************** Vorberechnen der Texturkoordinaten und in Array ablegen ******************************

; Quads in der leeren Single Surface erstellen
For i=0 To SS_Sprite_Max
SS_Vertex(i,1)=AddVertex(SS_Surface,i,0,0,0)
SS_Vertex(i,2)=AddVertex(SS_Surface,i,0,0,0)
SS_Vertex(i,3)=AddVertex(SS_Surface,i,0,0,0)
SS_Vertex(i,4)=AddVertex(SS_Surface,i,0,0,0)
AddTriangle(SS_Surface,SS_Vertex(i,3),SS_Vertex(i,2),SS_Vertex(i,1))
AddTriangle(SS_Surface,SS_Vertex(i,2),SS_Vertex(i,3),SS_Vertex(i,4))
Next
; vorberechnen der sin/cos werte

For i=0 To 360
SS_Cos_Tab(i)=Cos(i)
SS_Sin_Tab(i)=Sin(i)
Next
; ******************************************************************************************************************************
; ****************** Variabalen und Felder für das Single Surface Bereitstellen ******************
; ******************************************************************************************************************************





; ******************************************************************************************************************************
; ******************************** Funktion zum erstellen eines SS Sprites ****************************************
; ******************************************************************************************************************************
;SS_Typ = index innerhalb der Textur, x ,y, brite, höhe, drehwinkel, alpha,r,g,b, handle wenn benötigt.
Function Create_SS_Sprite (SS_Typ, SS_X#, SS_Y#, SS_W#, SS_H#, SS_Winkel#=90, SS_Alpha#=1.00, SS_R=128, SS_G=128, SS_B=128,SS_Handle=-1)
; --- zunächst muss ein freies quad gefunden werden. ---
If SS_Handle=-1 Then ; wenn handle nicht vorgegeben ist dann :
For SS_Ind=0 To SS_Sprite_Max ; Alle Quads durchgehen
If SS_Sprite(SS_Ind,0)=0 Then Goto SS_Out;Exit ; ist ein leeres gefunden, index zwischenspeichern und for Schleife beenden
Next
Return False ; raus aus der Funktion und False zurückgeben falls keines gefunden
Else ; wenn Handle vorgegeben ist dann :
SS_Ind=SS_Handle ;index auf Handle setzen (erzwingen von z)
.SS_Out
; --- 2D auf 3D Koordinaten umrechnen ---
SS_Winkel=SS_Winkel-45
While SS_Winkel>360:SS_Winkel=SS_Winkel-360:Wend
While SS_Winkel<0:SS_Winkel=SS_Winkel+360:Wend
SS_Y= - SS_Y + SS_Shd2
SS_X= SS_X - SS_Swd2
; --- Vertexkoordinaten setzen. ---
VertexCoords SS_Surface, SS_Vertex(SS_Ind,1), SS_X - SS_W * SS_Cos_Tab(SS_Winkel), SS_Y - SS_H * SS_Sin_Tab(SS_Winkel), SS_Swd2
VertexCoords SS_Surface, SS_Vertex(SS_Ind,2), SS_X + SS_W * SS_Sin_Tab(SS_Winkel), SS_Y - SS_H * SS_Cos_Tab(SS_Winkel), SS_Swd2
VertexCoords SS_Surface, SS_Vertex(SS_Ind,3), SS_X - SS_W * SS_Sin_Tab(SS_Winkel), SS_Y + SS_H * SS_Cos_Tab(SS_Winkel), SS_Swd2
VertexCoords SS_Surface, SS_Vertex(SS_Ind,4), SS_X + SS_W * SS_Cos_Tab(SS_Winkel), SS_Y -- SS_H * SS_Sin_Tab(SS_Winkel), SS_Swd2
; --- Texturkoordinaten aus der Liste zuordnen. ---
VertexTexCoords SS_Surface, SS_Vertex(SS_Ind,1), SS_TKL(SS_Typ,1),SS_TKL(SS_Typ,2)
VertexTexCoords SS_Surface, SS_Vertex(SS_Ind,2), SS_TKL(SS_Typ,3),SS_TKL(SS_Typ,4)
VertexTexCoords SS_Surface, SS_Vertex(SS_Ind,3), SS_TKL(SS_Typ,5),SS_TKL(SS_Typ,6)
VertexTexCoords SS_Surface, SS_Vertex(SS_Ind,4), SS_TKL(SS_Typ,7),SS_TKL(SS_Typ,8)
; --- Vertexfarbe sowie alpha setzen. ---
VertexColor SS_Surface, SS_Vertex(SS_Ind,1), SS_R, SS_G, SS_B, SS_Alpha
VertexColor SS_Surface, SS_Vertex(SS_Ind,2), SS_R, SS_G, SS_B, SS_Alpha
VertexColor SS_Surface, SS_Vertex(SS_Ind,3), SS_R, SS_G, SS_B, SS_Alpha
VertexColor SS_Surface, SS_Vertex(SS_Ind,4), SS_R, SS_G, SS_B, SS_Alpha
SS_Sprite(SS_Ind,0)=1; und aktivieren
Return SS_Ind ; handle zurückgeben
EndIf
End Function
; ******************************************************************************************************************************
Function Position_SS_Sprite (SS_Ind,SS_X,SS_Y,SS_W,SS_H,SS_Winkel#)
SS_Winkel=SS_Winkel-45
While SS_Winkel>360:SS_Winkel=SS_Winkel-360:Wend
While SS_Winkel<0:SS_Winkel=SS_Winkel+360:Wend
SS_Y= - SS_Y + SS_Shd2
SS_X= SS_X - SS_Swd2
VertexCoords SS_Surface, SS_Vertex(SS_Ind,1), SS_X - SS_W * SS_Cos_Tab(SS_Winkel), SS_Y - SS_H * SS_Sin_Tab(SS_Winkel), SS_Swd2
VertexCoords SS_Surface, SS_Vertex(SS_Ind,2), SS_X + SS_W * SS_Sin_Tab(SS_Winkel), SS_Y - SS_H * SS_Cos_Tab(SS_Winkel), SS_Swd2
VertexCoords SS_Surface, SS_Vertex(SS_Ind,3), SS_X - SS_W * SS_Sin_Tab(SS_Winkel), SS_Y + SS_H * SS_Cos_Tab(SS_Winkel), SS_Swd2
VertexCoords SS_Surface, SS_Vertex(SS_Ind,4), SS_X + SS_W * SS_Cos_Tab(SS_Winkel), SS_Y -- SS_H * SS_Sin_Tab(SS_Winkel), SS_Swd2
End Function
; ******************************************************************************************************************************

; ******************************************************************************************************************************
Function Delete_SS_Sprite (SS_Ind)
SS_Sprite(SS_Ind,0) = 0 ; Sprite deaktivieren/recyclen
VertexCoords SS_Surface, SS_Vertex(SS_Ind,1), 0, 0, 0
VertexCoords SS_Surface, SS_Vertex(SS_Ind,2), 0, 0, 0
VertexCoords SS_Surface, SS_Vertex(SS_Ind,3), 0, 0, 0
VertexCoords SS_Surface, SS_Vertex(SS_Ind,4), 0, 0, 0
End Function
Function Alpha_SS_Sprite (SS_Ind,SS_R,SS_G,SS_B,SS_Alpha#)
VertexColor SS_Surface, SS_Vertex(SS_Ind,1), SS_R, SS_G, SS_B, SS_Alpha#
VertexColor SS_Surface, SS_Vertex(SS_Ind,2), SS_R, SS_G, SS_B, SS_Alpha#
VertexColor SS_Surface, SS_Vertex(SS_Ind,3), SS_R, SS_G, SS_B, SS_Alpha#
VertexColor SS_Surface, SS_Vertex(SS_Ind,4), SS_R, SS_G, SS_B, SS_Alpha#
End Function
; ******************************************************************************************************************************

Das war mein erster Gehversuch auf diesem Gebiet. Mit ein wenig logischem Denken sollte es dir gelingen diese Funktionen richtig zu nutzen.
Jetzt kannst du soviele Buchstaben benutzen wie bei SS_Sprite_Max angegeben sind. Die entstehen dann alle auf einer Surface bzw. in einem mesh. Dadurch kannst du sie in einem Durchgang rendern. Bedenke jedoch dass pro Buchstabe dann 4 Vertices und 2 tris erstellt werden.
Hast du längere Texte so empfiehlt es sich vorher deine Buchstaben einfach in einen Texturbuffer zu schreiben und ein Sprite damit zu belegen.

Melde dich sollten noch Fragen offen sein.

Mfg ebo
ansteckend... Wink
verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/

EPS

BeitragDi, Nov 22, 2005 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ebo,

vielen Dank, das ist was ich suchte, wird zwar etwas dauern das an meine Geschichte anzupassen, aber vom Prinzip her kapier ichs - DANKE
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group