Du bist nicht angemeldet.

Werbeanzeige

1

31.03.2020, 20:23

Normalen Berechnung aus derivative Vektor

Hallo,
ich bräuchte etwas Unterstützung bei der Umsetzung des hier beschriebenem Verfahren Normalen zu berechnen. Link

Oder einer Alternative.
Mein Problem ist. Im Moment sind die Normalvektoren nicht richtig ausgerichtet. Manchmal zeigen sie in das innere des Planeten.
Ich benutze wie in der stackexchange Frage 3dsimplexnoise. Die Funktion gibt neben dem Noise Wert den "derivative" Vektor aus.

Ich verstehe das so.

Ich habe einen Punk p auf einer Kugel.
p normalisiert übergebe ich an die Noise Funktion, die den Noise Wert sowie den "derivative" Vektor zurück gibt.
Jetzt habe ich mir gedacht ich muss den "derivative" Vektor normalisieren damit ich die Normale habe. Dies ist aber laut der Lösung nicht so.

"Then project it into the tangent plane to the sphere passing through the point"

Soll das heissen man muss den Vektor neu ausrichten damit er in die richtige Richtung zeigt?
h⃗ =g⃗ −(g⃗ ⋅x⃗ )x⃗

g⃗ ist ja der Vektor der Noise Funktion also muss ich ja eigentlich g -(g * p) * p für h ausrechnen.
damit ich dann
n⃗ =x⃗ −s⋅h⃗ die Normale bekomme oder?

Mein Kopf macht nicht mehr mit. Bin seit 2 Tagen am überlegen wie das alles gemeint ist :thinking:

2

01.04.2020, 00:54

Einfach mit der TBN-Matrix des Punktes auf der Kugel multiplizieren, deren Zeilen (oder Spalten, je nach Konvention) tangent, bitangent und normal sind. Das sollte eigentlich funktionieren, nur an den Polen könnte das etwas komisch aussehen. Wenn das nicht geht, bin ich auch ratlos.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

3

01.04.2020, 17:00

Danke für den Tipp, aber es will irgendwie nicht :(

Hat jemand eine Ahnung wie ich den Sobel-Operator mit 3DNoise verwenden kann? So lässt sich jedenfalls eine Normale von eienr Heightmap berechnen. Ich habe das bei Terrain schon gemacht, aber wie soll ich das mit einem 3DVektor machen? Bei einer Heightmap z.B. kann man ja einfach mit den UV Koordinaten arbeiten und diese mit einem offset versehen...

hab mal eine Frage auf stackexchange gestellt:
link

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NilsJ« (01.04.2020, 22:46)


4

02.04.2020, 00:20

Hä? Was soll das denn werden?

HLSL-Quelltext

1
2
3
4
5
float2 eps = float2(0.001f, 0.f);
float3 nor = float3(getNoiseValue(normalize(TriPos + eps.xyy)) - getNoiseValue(normalize(TriPos - eps.xyy)),
                 getNoiseValue(normalize(TriPos + eps.yxy)) - getNoiseValue(normalize(TriPos - eps.yxy)),
                 getNoiseValue(normalize(TriPos + eps.yyx)) - getNoiseValue(normalize(TriPos - eps.yyx)));
float3 normal = normalize(nor);


Du musst doch auf der Kugeloberfläche weitergehen, um die Steigung auszurechnen. Nicht einfach in alle 3 Richtungen. Also das gleiche wie in 2D, nur dass du statt um ε in x- und y-Richtung eben nach "links/rechts" und "oben/unten" auf der Kugel gehen musst. Was an den Polen der Kugel passiert, kann ich dir aber auch nicht sagen. Eigentlich müsste es aber gehen, wenn du in 2 beliebige, zueinander (idealerweise) orthogonale Richtungen gehst, die Positionen der Punkte (auf der Kugel plus Verschiebung nach außen) berechnest und aus diesen 4 Punkten die Normale berechnest. 3 reichen sogar auch schon, dann hast du eine eindeutig definierte Fläche und die Normale dazu ist die Normale zu der Geometrie an der Stelle.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

5

02.04.2020, 14:53

Das macht Sinn Magogan.
Ist mir nicht in den Kopf gekommen, dass ich da in die falschen Richtungen gehe... :S

Jetzt gibt es aber ein weiteres Problem. Ich benutze ein Icosahedron. Mir fällt jetzt nicht ein wie ich einen Punkt finde der sich dann auch auf der Oberfläche befindet.
hmm...jetzt fällt mir ein, dass ich ja eigentlich P(x,y,z) in Kugelkoordinaten umrechnen kann um einfacher die Richtung zu ändern.
Oder gibt es noch eine andere Lösung?

Edit:
Hab es geschafft mit der Umrechnung in Kugelkoordinaten. :) danke Magogan für die Hilfe :thumbsup:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NilsJ« (02.04.2020, 15:59)


Werbeanzeige