 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.09.2012, 08:48 Titel: TriXelniZer (experiment) |
|
|
Ein Projekt von den ich mir anfangs mehr versprochen habe und in eine Sackgasse endete. Es sollte eine 2D Bitmap in ein 3D Objekt umwandeln, seh experimental das ganze und leider sehr unausgereift, aber funktionsfähig...
Kein sonderlich nützliches Projekt jedoch steckt dennoch einiges an arbeit darin und ist möglicherweise für irgendwen von interesse...
weiteres dazu auf meiner Seite: http://eternalpain.tgp-gaming.de/
Edit: der Name von TriXelniZer enstand aus dem umrechnen von Pixel in Triangles (dreiecke), daraus das Wort 'Trixel'....
Code: |
LoadImage:
Lädt und bereitet eine BMP Datei vor
LoadImage(filename as String)
(nach dem laden der Bitmap können die weiter unten aufgeführten Einstellungen
vorgenommen werden.
Anschliessen müssen die Funktionen CreateObjectMap, CreateTrixelMap und CreateTriangleList
ausgeführt werden.
anschliessend kann aus den fertigen 'Maps' das OBJ gespeichert werden)
SaveOBJ:
speichert die errechneten Daten in eine (wavefront) OBJ Datei
SaveOBJ(filename as String)
Set_tColor:
Setzten einer Transparentzfarbe (Standard: #(FF)000000 schwarz)
Set_tColor(tColor as UInteger)
Set_ImageOption:
Stellt den Berechnungsmodus fest
TN_monochrom = duotonebild, das Bild wird in schwarzweis gewandelt und verrechnet
TN_grayscale = das Bild wird in graustufen gewandelt welche dann als Z/Tiefeninformation vorliegen
TN_multicolor (experimetal) = Bild wird in N Farben und somit Objekte reduziert
Standard ist TN_monochrom
Set_ImageOption(ImageOption as TN_Token)
Set_NormalOption:
Set_NormalOption(NormalOption as Bool)
Standard ist 0 (none) keine Normale berechnen 1 (true) berechnet die Normalen
Set_UVMapOption:
Stellt die Brechnungsart der UVMap Koordinaten ein
Set_UVMapOption(UVMapOption as Integer)
0 = keine UVMap berechnen
1 = per pixel
2 = grösse des Images
3 = grösse des Objekts (standard)
Set_3DOption:
Stellt ein wie das Objekt verrechnet werden soll, je nach Einstellung von ImageOption
wird eingestellt ob das Objekt nur einseitig/Flach oder doppelseitig/extruhiert verrechnet wird
Set_3DOption(3DOption as Integer)
0 = ImageOption = TN_monochrom oder TN_multicolor 'Flat' ImageOption = TN_grayscale 'singleside'
1 = ImageOption = TN_monochrom oder TN_multicolor 'extruded' ImageOption = TN_grayscale 'doubleside'
Set_monochromOption:
Setzen des Helligkeitsgrad zum umrechnen des Images in Duotone (0-255)
Set_monochromOption(monochromOption as Integer)
Standard = 128
Set_grayscaleOption: (experimental)
Setzt das Tiefenlevel bei Graubildoption
Set_grayscaleOption(level as Double)
1.0 = standard
Set_multicolorOption: (experimantal)
setzt die anzahl Farben/Objekte (0-16+) (standard = 8)
Set_multicolorOption(num as integer)
|
_________________

Zuletzt bearbeitet von Eternal_pain am 10.09.2012, 12:41, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 10.09.2012, 10:20 Titel: |
|
|
Kompilier doch mal, dann hab ich auch was davon!  _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 10.09.2012, 12:42 Titel: |
|
|
Es ist nur eine Klasse mit einer Ansammlung von Funktionen, bisher habe ich noch keine Zeit und Lust gehabt sowas wie eine 'Benutzeroberfläche' oder ähnliches zu gestalten, daher bringt das kompilieren leider nicht viel....
Ich habe oben im Codeblock ein paar kurze erklärungen zu den Einstellungsmöglichkeiten erstellt....
Edit:
Der (Beispiel)Code zum verrechnen des beigelegten Logos (trixelnizer.bmp) mit 3D 'touch' (TNgrayscale):
Code: |
Screen 19,32 'screen ist nötig
Dim Trixelnizer as Class_TriXelniZer
Trixelnizer.LoadImage("trixelnizer.bmp")
Trixelnizer.Set_ImageOption(TN_grayscale)
Trixelnizer.Set_3DOption(1)
Trixelnizer.CreateObjectMap()
Trixelnizer.CreateTrixelMap()
Trixelnizer.CreateTriangleList()
Trixelnizer.SaveOBJ("trixelnizer.obj")
|
Das Ergebnis sieht dann (je nach programm) so aus:
96798 Vertices und 193536 Polygone
(die anzahl vertices und polygone sind mitunter der grund warum ich das ganze nicht weiter verfolge... es müsste 'besser' gehen...) _________________
 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 13.09.2012, 09:23 Titel: |
|
|
Ich vermute mal, das kommt weil du jedes Picel in einen Vektor umwandelst, und diese nutzt, anstat die Pixel zueinander in eine Gemometrische funktion zu wandeln.
(habe mir aber den code nicht angesehen)
wenn du aber "gerade linien" (startx,y -> stopx,y) nutzt, sollte das ergebniss deutlich besser werden.
wie schon in meinen letzten posts zu den fragen dieses themas, hatte ich das beispielbild mal angeführt, auf dem zu erkennen war, das ich aus dem "umrandeten" "Objekt" geometrische funktionen heraus rechne. Die Pixel werden solange verfolgt bis sie eine zu grose gradiente abweichung erreichen. Dann wird aus dem erstem und dem letzten pixel eine linie gebildet. Das wiederholt sich solange, bis man den anfang vom pixelhaufen der umrandung erreicht hat.
das ist der test zur erkennugn eines "runden" objektes -> folge: circle
die grafen, unten, zeichen den verlauf der x und y koordinaten der umrand an, sowie die ändernungs "zeitpunkte". Es ist ganz unten, die weise linie, welche gelegentlich ausschlägt und bei jedem ausschlag eine "neue linie" generrieren muss.
von jedem ausschlag, zu jedem ausschlag wird die linie gebildet.
die grosen grafen zeichen farbig an, wo das aktuelle pixel (bild 3, 1. zeile) sitzt. es ist quasi die lineare darstellung der sin/cos funtktion auf die pixel bei einem kreis.
Die dritte ist die mischung aus der änderungsrate von sin und cos des kreises.
das ergebniss dieses gematsche ist dann in bild 4. zeile 2 zu sehen. man erkennt durch den wechsel von rot und blau die linien abschnitte.
zum schluss wird erkannt, das sich die linien in einem bestimmten verhältniss zueinander befieden, udn damit einen kreis darstellen der schlussendlich auch als kreis (circle-funktion) ins erste bild gezeichnet wird.
das selbe verfahren, bei schlechtere beleuchtung. Nun ist natürlich fraglich, ob es so noch ok ist, aus dem muster einen kreis zu bilden. .. aber .. naja....
http://mln.ath.cx/13.png ... das ganze mit einer bitmap
http://mln.ath.cx/9.png ... hier auch nochmal mit anderen objekten
hier mein entsprechender source dazu: http://ops.ath.cx/code?id=259
Meine ALgos hirzu sidn allerdigns noch im amfangsstadium, udn noch nicht optimal. es fehlt z.B. die erkennung von runden, schnellen kanten, welche in seperate linien gewandelt werden müssen, anstat in eine harte kante... udn noch so einige kleine optimierungen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|