Archiv verlassen und diese Seite im Standarddesign anzeigen : multimedia installation mit bildverzerrung
hallo!
ich muss ein studienprojekt realisieren in dem es darum geht, bilder zu verzerren. das setup sieht folgendermaßen aus: es gibt eine art touchscreen auf dem jedoch auch mehrere berührungspunkte/berührungsflächen getrackt werden können. auf dem screen wird ein beliebiges bild dargestellt. der benutzer hat nun durch berührung und dragging die möglichkeit, das bild zu verzerren (mit allen fingern gleichzeitig wenn ihm beliebt). wird ein berührungspunkt losgelassen wird die durch diese berührung hervorgerufene verzerrung wieder aufgehoben (am besten wärs wenn dieser teil wie an einer art gummiband festgemacht zurückschwingen würde).
ich hätte mir das so vorgestellt, dass ich eine art raster über das bild lege und die dabei entstehenden vertices durch die berührung des benutzers manipuliert werden. leider weiß ich nicht genau wie ich dann die bildverzerrung daraus berechnen kann. kann mir jemand da behilflich sein? wer sich meine überlegung nicht so ganz vorstellen kann, kann sich bei photoshop den liquify-filter mal ansehen und dabei das mesh sichtbar schalten. ich freue mich über jede art von hilfe.
tausend dank, Judy
ps. bin ganz neu hier, wenn ich also was falsch mache, einfach ganz laut schrei(b)en
Hallo Judy,
willkommen im Forum :-)
Eine sehr interessante Idee hast Du da!
Anstelle eines Touchscreen sollte man eventuell auch ein Zeichentablett oder das Touchpad eines Notebooks verwenden können, oder?
Im Prinzip solltest Du das Grundprogramm schon mit OpenGL (www.opengl.org) oder DirectX recht einfach erzeugen können.
Die einzige Schwierigkeit liegt tatsächlich auf der geeigneten Filterung an den Verzerrungsstellen.
Die Komplexität wächst dann auch mit der Anzahl der Verknüpfungen pro Gummiecke.
Eventuell geht das mit Shaderprogrammierung auf dem Grafikchip,
oder Du verzerrst die Bildinformationen gezielt über eigene Routinen.
Einfache Veränderung der Texturkoordinaten wird ansatzweise ausreichen, aber nicht perfekt sein..
Auf der Entwicklerseite (http://developer.nvidia.com/page/home.html) von nVidia (www.nvidia.com) hab ich folgendes Dokument (http://download.developer.nvidia.com/developer/SDK/Individual_Samples/DEMOS/OpenGL/src/GPUFilter/doc/GPUFilter%20Framework%20User%20Guide.pdf) gefunden, da kann man sich einen eigenen Filter für PhotoShop programmieren, der auf dem Grafikchip berechnet wird.
Möglicherweise kannst Du sogar das hier verwenden: PaintLiquid (http://download.developer.nvidia.com/developer/SDK/Individual_Samples/effects.html#paintLiquid) (für GeForce 6 Chips).
Bei Ati (http://www.ati.com/developer/index.html) gibt es auch ähnliches.
Schau mal die Präsentationen zu Shadern in DirectX (www.ati.com/developer/shaderx/) an,
da sind auch interessante Effekte drin, z.B. Texture Perturbation Effects (http://www.ati.com/developer/shaderx/ShaderX_TexturePerturbationEffects.pdf)
Moin Judy,
auch von mir herzlich willkommen im Forum. Du hast nichts falsch gemacht sondern deine Frage exakt im richtigen Unterforum gestellt.
by ManniC
Ups - TorstenG hatte dich ja richtigerweise von der Bildbearbeitung hierher verschoben :cool: da hab' ich jetzt was falsches getippt ;) . Nobody ist perfect, "Mein Name ist Nobody" :lol:
Als ich deinen Beitrag gelesen habe hab ich gedacht "Die Frage ist so gut, die möchte ich nicht durch eine Antwort kaputtmachen" :cool: und für mich beschlossen:
http://www.mc-com.de/4images/data/thumbnails/43/sm_fresse.gif
:lol:
@Fracman:
Kompliment :top: :top: :top: , dein Statement ist ein weiterer Beweis dafür, dass in diesem Forum wirklich jedem geholfen wird.
tausend dank für die schnelle und sehr hilfreiche antwort. leider bin ich durch die vielen dargestellten möglichkeiten etwas verwirrt.
mein erster gedanke war auch, das alles mithilfe von texturen und sich verändernden texturkoordinaten zu machen. dazu hätte ich aber noch eine frage (möge sie auch banal sein... :oops: ). wenn ich das mit einem solchen raster und texturkoordinaten mache, unterteile ich dann die textur gemäß dieses rasters in einzelne teile mit den sich aus dem raster ergebenden vertices als texturkoordinaten für diese kleinen texturteile?
ich hoffe man gestattet mir noch eine weitere frage...
was shader anbelangt, welche vorteile hätte diese art der realisierung? ich hab noch keinerlei erfahrung mit shadern, und bin deswegen noch ziemlich am holzweg.
vielen dank für jegliche hilfe!
lg, Judy
Hallo Judy,
da gibt es zwei Möglichkeiten:
Du kannst die Textur entweder vorher unterteilen
(wobei sie im Speicher der Grafikkarte immer mit Kantenlängen von 2er-Potenzen liegen muß, also z.B. 64x64),
oder sie als Ganzes einmal in den Speicher laden und dann die texturkoordinaten beliebig wählen, um sie einer Fläche zuzuordnen.
Shaderprogrammierung hat nur den Vorteil, daß alles im Grafikchip berechnet wird und meistens wesentlich schneller ist als mit der normalen CPU. Nachteil: man muß sich da auch erst einarbeiten (da kenne ich mich leider auch nicht so im Detail aus), und es ist stark vom jeweiligen Chip abhängig.
Wenn Du OpenGL verwendest, gibt es zwar auch manche Abhängigkeiten,
aber Texturen Texturkoordinaten gehört quasi zum Grundbefehlssatz ;)
Dazu kann ich Dir die OpenGL SuperBible empfehlen,
enthält alles rund um OpenGL und auch Beispiele.
Ich versuch mal bis später, noch was im Netz zu finden...
hallo & danke!
ich check es einfach nicht. wenn ich die gesamte textur auf die ebene lege dann kann ich die textur ja nur als ganzes über die 4 eckpunkte manipulieren, oder? ich kann mir irgendwie im moment nicht vorstellen, die textur an den zusätzlichen vertices, die sich aus dem raster ergeben, an die ebene zu 'kleben' mit texturkoordinaten.
ich geh mal davon aus, dass ich mir das in meinem kopf scheinbar irgendwie 'falsch' vorstelle... ich mach mich mal schlau, vielleicht versteh ich es dann ;)
lg, Judy
Ich kleb' das Posting mal an den ursprünglichen Thread -- der Übersichtlichkeit halber ;)
Hi Judy,
du kannst ja eine Textur oder auch beliebig viele Texturen auf eine Fläche spannen.
Du darfst natürlich nicht ein einfaches Polygon mit 4 Ecken nehmen,
sondern mußt die Fläche in MxN Polygone aufteilen,
also ein Drahtgitter aus lauter kleinen Vierecken,
auf die Du dann die enstprechenden Texturkoordinaten der Usprungstextur legst:
Tx = x*1/M
Ty = y*1/N
(oder so ähnlich)
mah, was bin für ein schussel dass ich soweit nicht denken kann.
tausend dank! jetzt gehts ans eingemachte :)
allerliebste grüße von einer erleuteten Judy
Halte uns aber bitte auf dem Laufenden.
Ich finde (trotz keiner Ahnung :cool: ) das Thema hochinteressant.
Sehr gute Tutorials samt Quellcode zu OpenGL gibts hier:
NeHe Productions (http://nehe.gamedev.net/)
Lesson 6: Texture Mapping (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06)
hallo!
daselbe projekt, eine andere frage:
ich müßte so eine art soft selection realisieren. dabei hab ich aber das problem, dass ich zwar schon ein paar sachen ausprobiert habe, ich aber irgendwie nicht weiß durch welchen 'soft-selection-algorithmus' ich verhindern kann, dass sich die polygone quasi ins 'ungültige' verschieben lassen. ein beispiel: ich verschiebe einen vertex V entlang der positiven y-achse. nach jedem schritt berechne ich für jeden nachbarn (Top, Right, Bottom und Left) die position (entweder den mittelwert aus dessen nachbarpunkten oder über den durchschnitt der verschiebungsvektoren der nachbarn,...). aber wenn ich den vertex V immer weiter nach 'oben' verschiebe passiert es irgendwann, dass er sich oberhalb seines oberen nachbarn T befindet. und genau das soll nicht passieren. irgendwie fehlen mir aber die ideen wie ich die position der nachbarn T, R, B und L berechnen kann, um dies zu verhindern.
wenn ich mir die soft selection bei z.b. 3ds max oder maya ansehe, können sie diesem problem ja auch entgehen. leider weiß ich nicht welche berechnungsmethode man dort anwendet.
also wenn jemand eine idee hat, wie ich das anstellen kann, bitte sagt mir bescheid.
tausend dank, Judy
Wieso speicherst Du denn nicht einfach alle Koordinaten in einem array oder in einer Liste,
und vergleichst dies beim Verschieben mit den Koordinaten des aktuellen punktes? Soo viele können es doch gar nicht sein...
Ich hab mir für ein GUI eine Mauserfassung geschrieben,
bei der ich einen Rahmen verschieben oder verändern kann.
Da muss ich die Position der anderen Objekte mit berücksichtigen,
auch ob der Rahmen am Bildrand anstoßen soll oder darüber hinausgeschoben werden darf.
Wenn Du erstmalig einen Gitterpunkt auswählst, müßtest Du doch auch die benachbarten Punkte kennen
und dementsprechend ein maximales Feld rund um den einen Punkt berechnen können.
a --- b --- c
| \ | / |
d --- p ---e
| / | \ |
f --- g --- h
pseudocode:
wenn (p.x > c.x) dann p.x = c.x (weiter rechts geht nicht)
wenn (p.y < a.y) dann p.y = a.y (höher darf nicht)
wenn (p.x < d.x) dann p.x = d.x (halt links)
wenn (p.y > g.y) dann p.y = g.y (unten anhalten)
Natürlich müßtest Du das bei verschobenen Punkten (alle punkte drumherum bilden kein Rechteck mehr,
sondern beliebige Polygone) "intelligenter" machen, also abhängig von den Koordinaten von (p) relativ zu den
Verbindungsgeraden, z.b. unten links f <-> g, mit linearen Gleichungen prüfen, ob sich (p) immer noch innen oder schon am Rand befindet.