Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Grafik perspektivisch darstellen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
FredKowalzki



Anmeldungsdatum: 03.01.2011
Beiträge: 13

BeitragVerfasst am: 25.01.2011, 13:57    Titel: Grafik perspektivisch darstellen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 25.01.2011, 18:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 27.01.2011, 17:47    Titel: Antworten mit Zitat

delphigl.com

Blöder Spruch von mir noch gratis dazu: OpenGL. Gibt deinem Leben einen Sinn.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 27.01.2011, 21:46    Titel: Antworten mit Zitat

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 zwinkern

also, wenn dus selbst machen willlst (-> lernfaktor!), sooo schwer isses nich

lg grinsen
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 27.01.2011, 22:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 28.01.2011, 10:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 28.01.2011, 12:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 28.01.2011, 17:53    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
FredKowalzki



Anmeldungsdatum: 03.01.2011
Beiträge: 13

BeitragVerfasst am: 28.01.2011, 20:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 29.01.2011, 01:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 29.01.2011, 11:02    Titel: Antworten mit Zitat

Hallo, "single" das war es.
Jetzt funktioniert es einwandfrei.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz