 |
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 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 25.01.2011, 13:57 Titel: Grafik perspektivisch darstellen |
|
|
Ich möchte eine Skatkarte auf dem Tisch perspektivisch darstellen.
Hat jemand eine Formel, wie man ein 2D Bild in eine perspektivische Ansicht umrechnet und darstellt? Ich weiss, man kann das mit Gimp machen, aber ich möchte nicht jede Karte einzelnd umwandeln müssen, das ist echt umständlich.
Über jeden Tip wäre ich dankbar
Fred |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 25.01.2011, 18:02 Titel: |
|
|
Zu berechnen ist so eine Perspektive nicht allzu schwer; es läuft halt auf einen oder zwei Fluchtpunkte hinaus (-> zentrische Streckung). Das grafisch umzusetzen, wird mit den Bordmitteln allerdings knifflig. Da wirst du wohl um eine externe Bibliothek nicht herum kommen.
Ich habe mal im Portal gestöbert und die FreeBASIC extended library gefunden, die zumindest Skalierung und Drehung von Bildern vornehmen kann (laut Beschreibung, habe ich nicht getestet). Eine Verzerrung ist dann vermutlich nicht dabei. Du könntest aber zumindest die Karten schon perspektivisch verzerrt speichern und dann nur noch, je nach Position, auf die richtige Größe skalieren. Vielleicht hilft das ja schon einmal. Allerdings schränkt das die "Perspektivemöglichkeiten" sehr stark ein. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 27.01.2011, 17:47 Titel: |
|
|
delphigl.com
Blöder Spruch von mir noch gratis dazu: OpenGL. Gibt deinem Leben einen Sinn. |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 27.01.2011, 21:46 Titel: |
|
|
das is aber langweilig...
zentrische streckung is an sich garnich mal soooo schwer
du willst im endeffekt nur die unterste pixelzeile auf 100% ihrer größe (also garnicht) schrumpfen, die drüber auf 99%, die noch drüber auf 98% usw, die oberste auf etwa 50% (je nach dem WIE perspektivisch das werden soll)
nur WIE du verkleinerst _könnte_ schwieriger werden
stichpunkt interpolation oder interpolieren, google das mal
also, wenn dus selbst machen willlst (-> lernfaktor!), sooo schwer isses nich
lg  _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 27.01.2011, 22:42 Titel: |
|
|
OpenGL und DirectX koennen das gut in echtzeit. Fuer anfaenger wuerde ich da auch die Tuts in freebasic-portal empfehlen.
Ich habe mich mal hingesetzt und ein kleines prog zusammen geschrieben, welches bilder sclaieren und verzerren kann. Beim verzerren muss man fuer 4 punkte X,Y coordinaten und die Texturcoordinaten angeben.
Man sollte hier das bild erst ungefahr auf die richtige groesse scalieren, bevor man es verzerrt, da bein verzerren nur die 4 umliegenden Pixel fuer einem neues beachtet werden. Hier mal der Link, wenn es jemanden interesiert.
Es kann fehler geben. |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 28.01.2011, 10:04 Titel: |
|
|
Wenn ich eine BMP 64x64 einlade, erscheinen ca in der Mitte von links nach rechts 8bit hohe Striche im Abstand von 8 Pixel.
Code: |
Screenres 800,600,32
Screenw.Width = 800
Screenw.Hight = 600
Screenw.BBP = 32
Screenw.Pointer = ScreenPtr
FBImage = ImageCreate(64,64,,32)
BLoad "raupe.bmp",FBImage
Image = ILGetILImageBuffer(FBImage)
VerzerrStruct.Point(0).X = 100
VerzerrStruct.Point(0).Y = 0
VerzerrStruct.Point(0).S = 0
VerzerrStruct.Point(0).T = 0
VerzerrStruct.Point(1).X = 300
VerzerrStruct.Point(1).Y = 00
VerzerrStruct.Point(1).S = 64
VerzerrStruct.Point(1).T = 0
VerzerrStruct.Point(2).X = 400
VerzerrStruct.Point(2).Y = 400
VerzerrStruct.Point(2).S = 64
VerzerrStruct.Point(2).T = 64
VerzerrStruct.Point(3).X = 0
VerzerrStruct.Point(3).Y = 400
VerzerrStruct.Point(3).S = 0
VerzerrStruct.Point(3).T = 64
ScreenLock
ILVerzerre(@Image,@VerzerrStruct,@Screenw)
ScreenUnLock
DeAllocate(Image.Pointer)
ImageDestroy(FBImage)
Sleep
End
|
|
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 28.01.2011, 12:11 Titel: |
|
|
Mit DirectX/OpenGL kriegt man aber anisotrope Filterung bis zu 16x gratis dazu. Das dürfte wesentlich besser aussehen und wesentlich einfacher zu implementieren sein als von Hand in Software. |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 28.01.2011, 17:53 Titel: |
|
|
@funkeld
Ich habe das ganze nur mit 256X256 und 512X512 Bildern getestet.
mach mal in der Function ILGetPixel1D aus
Dim As Integer Red, Green, Blue, Alp
ein
Dim As Single Red, Green, Blue, Alp
und aus den Texturcoordinaten 64 63
@28398
Stimmt natuerlich das es mit OpenGL einfacher ist, ich arbeite auch normalerweise mit OpenGl, aber fuer lehrnzwecke kann man auch mal das, was OpenGl auf der Grafigkate macht, in Software schreiben |
|
Nach oben |
|
 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 28.01.2011, 20:16 Titel: |
|
|
Vielen Dank für eure Mühen!
Eine kleine Anmerkung: Mir ist es vollkmommen egal wie lange es dauert bis die Karte das richtige Format hat, denn ich schneide das Bild eh aus und bringe es dann richtig auf den Bildschirm.
Mir ist aufgefallen, dass eure Codes zwar verzerren, aber die Ansicht stimmt nicht. Denn bei einer Sicht von schräg oben nach unten müsste die Karte oder das Bild kleiner werden. Das tut es aber nicht. es verzerrt lediglich. Oder sehe ich das falsch?
Zitat: | mach mal in der Function ILGetPixel1D aus
Dim As Integer Red, Green, Blue, Alp
ein
Dim As Single Red, Green, Blue, Alp
und aus den Texturcoordinaten 64 63 |
Was?
Fred |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 29.01.2011, 01:18 Titel: |
|
|
Zitat: | es verzerrt lediglich. Oder sehe ich das falsch? |
nein, du siehst nicht falsch, es verzerrt lediglich.
Zitat: |
Zitat: | mach mal in der Function ILGetPixel1D aus
Dim As Integer Red, Green, Blue, Alp
ein
Dim As Single Red, Green, Blue, Alp
und aus den Texturcoordinaten 64 63 |
Was?
|
Das war an funkeld gerichtet, da manchmal schwarze linien im Bild wahren, das lag an der rundung von single nach integer. In der Function ILGetPixel1D lese ich aus einem 1D-array, bessergesagt, einer zeile die Pixel aus. Dabei wird das erste Pixel mit 1-(X-int(X)) multimizirt, X ist die Position, und das letzte mit (Weite+X-int(Weite+X)) multimizirt und dem ergebnis von den vohrigen Pixeln addirt, will man ein Pixel lesen, was bei funkeld der fall war, ist weite=0. An den Stellen, wo die Schwarzen striche waren, was Alpher einfach gleich null, da X = 0.5 und so wurde vom ersten Pixel 127.5 vom alphakanal auf 128 grundet und das gleich auch beim letzten Pixel so das Alpha leztendlich auf 256 was als UByte = 0 ist.
und aus den Texturcoordinaten 64 63
ist irgendwie doch dumm wenn man aus einem Bild mit 64 zeilen 65 lesen will. |
|
Nach oben |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 29.01.2011, 11:02 Titel: |
|
|
Hallo, "single" das war es.
Jetzt funktioniert es einwandfrei.
Gruss |
|
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.
|
|