Oberflächennormale ausrechnen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Markus2

Betreff: Oberflächennormale ausrechnen

BeitragDi, Jul 05, 2005 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich brauche was spezielles Shocked

Und zwar habe ich die Position von 4 Punkte im Raum definiert (x,y)
und alle sind auf z=0
Also sowas wie ein Trapez oder Viereck was im Raum gedreht ist .
Davon brauche ich die Normale , also als ob die z Werte auch gesetzt
wären .

Wie ich das zuerst versuchen würde :
Die 4 Punkte sind im Urzeiger Sinn.
Ich würde jetzt von Punkt 1 nach 3 die Richtung ermitteln ,
dann von P2 nach P4 , diese beiden Vectoren drehen das sie nach
oben zeigen , addieren und halbieren das ich die Normale bekomme .

TheShadow

Moderator

BeitragMi, Jul 06, 2005 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mein Lieblings-TUT dazu:

http://www.lighthouse3d.com/op...p3?normals
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Markus2

BeitragDo, Jul 07, 2005 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheShadow

Wie ich eine Normale in 3D ausrechne weiß ich aber
mir fehlen ja die Z Werte !

Wenn ich die irgendwie ausrechnen könnte mit den Daten
die ich habe wäre mir schon geholfen .

Also Ausgang von dem Trapez ist eine Texture
die ich berechnen will von einem Foto .
Das umrechnen klappt soweit ganz gut aber ich
habe das noch erweitert mit einer Bezier Interpolation
jeweils zwischen den Kanten .
Ich kann also den Hilfspunkten eine höhe geben die
ich auch schon ausrechnen kann .
Dann sollen die (x,y) Werte mit der (Normale (für x,y)*Höhe)
addiert werden .
Also die Pixel die ich im Quellbild auslese müssen verschoben
werden damit das Ergebnis stimmt .
 

Dreamora

BeitragDo, Jul 07, 2005 1:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Da die Ebene x-y planar ist, ist deine normale entweder (0,0,1) oder (0,0,-1), abhängig vom Umlaufsinn der 3 Ecke (für Normalenberechnung braucht man 3 Punkte, 4 Punkte sind nur in speziellen Fällen planar)

Sonst nutzt man die Vektoren v1 = P2 - P1 & v2 = P3 - P1, wobei die Normale dann

n = (v1 x v2)/|(v1 x v2)|

x ist das Kreuzprodukt zweier Vektoren und || der Betrag also die Länge des Vektors.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragDo, Jul 07, 2005 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora

Ich versuchs mal anders zu erklären .
Also ich habe ein Blatt Papier und darauf male ich ein Trapez .
Die Normale vom Blatt ist 0,0,1 .
Jetzt drehe ich das Blatt so das das Trapez zum Viereck wird ,
also muß man sich so vorstellen .
Und jetzt brauche ich die Normale vom Blatt .
Ich habe aber nur ein Foto (z.B. mit einem Fenster) und weiß nicht
in welchem Winkel es aufgenommen wurde .

Ein theoretischer Lösungsweg würde mir schon reichen .

TheShadow

Moderator

BeitragDo, Jul 07, 2005 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
uff - das geht denke ich nicht direkt....
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

Dreamora

BeitragFr, Jul 08, 2005 6:39
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm ...

Anmerkung: Mit einem Trapez wird das garnie geschehen, denn nicht paralelle Seiten werden auch durch Projektion nicht parallel. Ich vermute du meintest ein Parallelogram?
Vorausgesetzt Viereck = Quadrat (denn jedes Polygon mit 4 Ecken ist ein Viereck)

Da müsstest du dir wohl mittels Trignometrie und Strahlensatz eine entsprechende Lösung herleiten, um welchen Winkel man es um y und z Achese drehen müsste, damit aus dem Parallelogram ein Quadrat wird (bzw umgekehrt gehts einfacher, wenn du das Quadrat entsprechend verziehst per Rotation, da dies die einfacheren Gleichungen geben müsste und danach dann einfach die Winkel die du erhälst invertieren)
Danach muss man nur die Normale durch die gleiche Transformation (sind ja nur 2 Rotationsmatrizen) schicken.

Dürfte man eventuell erfahren, wofür es benötigt wird?
Vielleicht gibt es einen anderen Lösungsansatz oder andere Lösungsmöglichkeit.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragFr, Jul 08, 2005 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora
Danke dir , werde nochmal drüber nach denken .

Die Texturegröße kann man selber bestimmen ,
also das Ergebnis ist ein Rechteck und die
4 Punkte im Quellbild auch nur eben durch
die Aufnahme verzerrt .

Guck mal an ,
die Version ist aber noch ohne Bezier ,
aktualisier ich heute abend mal .
https://www.blitzforum.de/viewtopic.php?t=12409
Mit Bezier kann man noch die Rundungen die durch
die Linse entstehen können ausgleichen 8)

TheShadow

Moderator

BeitragFr, Jul 08, 2005 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
*HUST*

Du willst aus Trapez nur einen Quadrat machen?
Ich hab jetzt nicht gesehen wie du das machst... aber!

das geht einfacher:

man nimmt 2 FOR-Schleifen und rechnet daraus (quasi rückwärts) die koord im trapez aus.

Das geht einfach - es ist denke ich das selbe wie bilineare-filterungs-funktion

Jedoch nimmst du statt RGB-Werte dann getrennt (!) zuerst X und dann Y-Werte für die Berechnung.

Fertig

http://de.wikipedia.org/wiki/Bilineares_Filtering
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Markus2

BeitragFr, Jul 08, 2005 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheShadow

Nein das war nur ein Beispiel ,
die 4 Punkte können beliebig im Fenster positioniert werden .
Da meine Texture die ich ausrechne ja rechteckig ist
muß nur der umramte Bildausschnitt ungefähr das
gleiche Verhältnis der x und y Kante haben und diese
berechnung der Texture geht ja schon .

Mit der Bezier Interpolation möchte ich z.B. ein Foto
von einer Litfaßsäule so umrechnen das ich es
mit einer frontal Projektion wieder drauf machen könnte
bei einem Zylinder .

Oder stelle dir ein Foto von einem Autoreifen Profil vor .
Diese verzerrung könnte ich zurück rechnen das man
die Texture richtig als Zylinder Projektion gekachelt wieder drauf legen könnte .

Da gibt es jetzt viele Anwendungsmöglichkeiten 8)
  • Zuletzt bearbeitet von Markus2 am Sa, Jul 09, 2005 10:25, insgesamt einmal bearbeitet
 

Dreamora

BeitragFr, Jul 08, 2005 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also willst du im Endeffekt nur perspektivische Verzerrung nur wieder "auskurieren"?
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragSa, Jul 09, 2005 1:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora

Ja , könnte man so sagen .
Aber das "nur" ist nicht so einfach wie ich das haben will Wink

PS:
Was ich davor geschrieben hatte @All,
habe ich weg editiert weil der Vorschlag ja von dir kam.
Also auf der Arbeit hatte ich es diskutiert
mit dem umrechnen in die Perspektive damit man die Winkel bekommt
und das scheint ein guter Ansatz zu sein Smile
 

Dreamora

BeitragSa, Jul 09, 2005 12:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du schonmal aus faulheit einfach versucht die Ecken des verzerrten Objektes als UV Koordinaten zu nutzen für ein Quadrat das schön vor der Kamera ist und dann einfach Texturieren? Und da dann eventuell noch Filtering drüber zu lassen (sei es nur Filtering der Grafikkarte Smile)

Ich würde das definitiv nicht so kompliziert machen für diese einfache Zielsetzung ...

Das rotieren wird dir übrigens nur bedingt helfen ... du müsstest das Projektionszentrum errechnen, damit du die Projektionsgeraden errechnen kannst um diese affine Abbildung zu invertieren.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Sa, Jul 09, 2005 13:53, insgesamt einmal bearbeitet

TheShadow

Moderator

BeitragSa, Jul 09, 2005 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
das mit der Säule würde ich ganz einfach mit SIN oder COS umrechnen - da ist keine Zauberei...

das alles kriegt man mit relativ wenig Aufwand hin... Es wird beim bezier und co benötigt
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Markus2

BeitragSa, Jul 09, 2005 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheShadow
Also versucht hatte ich das auch aber das war nix .
In der Theorie ist alles einfach Confused

@Dreamora
Das mit den UVs da bringste mich gerade auf ne neue Idee Smile
x+y+z=1 oder ?

@All
Hier ist die aktuelle Version mit Screenshot 8)
Läuft direkt einfach kopieren/einfügen Rolling Eyes
Kleine Bilder kann man noch vergrößern und
wenn das nicht nötig ist sind die Knöppe unsichtbar Shocked

https://www.blitzforum.de/viewtopic.php?p=134701
 

Dreamora

BeitragSa, Jul 09, 2005 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein die gleichung gilt leider nicht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragSa, Jul 09, 2005 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora
Ich doch die Gleichung für eine Kugel oder ?
Ich dachte gerade so das man die längen der Kanten z.B.
von p1 nach p2 und von p1 nach p3 nimmt ,
diese müßten ja bei einer Texture wo x und y gleich ist =1 sein
und im rechten Winkel ist es ja auch .
Dann müßte der Rest zu 1 z sein .
War nur sone Idee .
 

Dreamora

BeitragSa, Jul 09, 2005 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Kugel gilt x^2 + y^2 + z^2 = 1 bzw gleich radius^2 (Pythagoras in 3D)

Aber in diesem Falle handelt es sich nicht um eine Kugel sondern wenn dann einen Projektionskegel / Projektionspyramide ...
Allerdings werde ich aus deinem letzten Posting auch nicht ganz schlau muss ich zugeben Sad

Aber deine Idee bringt mich auf was:

Das Projektionszentrum kannst du einfach berechnen: Du hast ja die 2 nichtparallelen Seiten des Trapezes. Wenn diese von einer Projektion eines Quadrates / Rechteckes herrühren, so schneiden sich die 2 Geraden, auf welchen diese Seiten liegen, im Projektionszentrum. Du könntest also daraus mittels Strahlensatz und anderen Möglichkeiten auch zum Ziel kommen.

Wobei ich das verwenden der Eckpunkte als UV von 4 Vertices zu nehmen und diese danach als Quadrat / Rechteck rechtwinklick vor der Kamera zu positionieren immer noch um einiges einfacher finde Wink

Im Falle eines BM Images kannst du übrigens über image.frame[aktueller_index]. u0 v0 u1 v1 an diese Daten ran (zumindest wenn du auf OpenGL läufst, mit DX hab ichs noch nicht getestet)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

TheShadow

Moderator

BeitragSo, Jul 10, 2005 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wobei ich das verwenden der Eckpunkte als UV von 4 Vertices zu nehmen und diese danach als Quadrat / Rechteck rechtwinklick vor der Kamera zu positionieren immer noch um einiges einfacher finde


ich würde das nicht machen, weil das Ergebnis unschärfer wäre als wenn man es manuell errechnen würde... OK, Schneller wäre es aber auf jeden Fall Smile

Die Säule würde ich erst in einen Rechteck umrechnen und dann mit SIN/COS auseinanderstrecken... man könnte es in 1 längeren Rechnung erledigen... Dann evtl noch bilineares filtering drauf und dann ist es fertig
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group