Oberflächennormale ausrechnen
Übersicht

![]() |
Markus2Betreff: Oberflächennormale ausrechnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
ich brauche was spezielles ![]() 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 . |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier mein Lieblings-TUT dazu:
http://www.lighthouse3d.com/op...p3?normals |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 . |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
uff - das geht denke ich nicht direkt.... | ||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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) |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
*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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Ja , könnte man so sagen . Aber das "nur" ist nicht so einfach wie ich das haben will ![]() 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 ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@TheShadow
Also versucht hatte ich das auch aber das war nix . In der Theorie ist alles einfach ![]() @Dreamora Das mit den UVs da bringste mich gerade auf ne neue Idee ![]() x+y+z=1 oder ? @All Hier ist die aktuelle Version mit Screenshot 8) Läuft direkt einfach kopieren/einfügen ![]() Kleine Bilder kann man noch vergrößern und wenn das nicht nötig ist sind die Knöppe unsichtbar ![]() https://www.blitzforum.de/viewtopic.php?p=134701 |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein die gleichung gilt leider nicht. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 ![]() 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. |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group