Autor Wątek: Interpolacja normalnych  (Przeczytany 3332 razy)

Offline Real_Noname

  • Użytkownik

# Luty 05, 2006, 00:39:22
Swojego czasu siedziałem z ołówkiem przy notesie i sobie wyliczyłem jak interpolować Vertex'y do animacji. Równanie jest proste (?):

Vw = V1 + ( V2 - V1 ) * dt;

V1 - wierzchołek z klatki pierwszej.
V2 - wierzchołek z klatki drugiej.
Vw - wierzchołek wynikowy.
dt = delta czasu.

ALE, większy problem okazał się z normalnymi. W pierwszej wersji algorytmu obliczałem interpolacje normalnych tak:

vec3 t1 = V1 + N1;
vec3 t2 = V2 + N2;
Nw = t1 + ( t2 - t1 ) * dt - Vw;

V1, V2, Vw - jak z powyższego równania.
t1, t2 - wektory pomocnicze.
N1 - normalna z pierwszej klatki
N2 - normalna z drugiej klatki
Nw - normalna wynikowa.

Moje pytanie, to czy nie da się ominąć dodawania wierzchołków w równaniu. Po mojej głowie chodzi coś przy użyciu samych normalnych, ale mój mózg nie chce za chiny kooperować, przy wymyśleniu odpowiedzniej rzeczy.

Uff, dziękuje za przeczytanie moich wypocin i za każdą pomoc dziękuje także.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Luty 05, 2006, 00:54:20
Cytuj
Moje pytanie, to czy nie da się ominąć dodawania wierzchołków w równaniu.
Da się. Trzeba je po prostu pominąć - wynik będzie taki sam (podstaw t1, t2 i Vw do równania i przekształć). :)

Nw = N1 + ( N2 - N1 ) * dt;Wynikową normalną należy oczywiście znormalizować. :)

Offline Real_Noname

  • Użytkownik

# Luty 05, 2006, 00:59:38
Kurde, to dlatego mi coś źle wychodziło - zapomniałem znormalizować  ;D

thx.

Offline counterClockWise

  • Użytkownik

# Luty 09, 2006, 13:31:22
Jak to jest w końcu z formalnym nazewnictwem?

Dla mnie zawsze wektor normalny do płaszczyzny to był wektor ortogonalny i znormalizowany, a nieznormalizowany "prostopadły wektor" to tylko wektor ortogonalny.

bies

  • Gość
# Luty 09, 2006, 13:48:23
Dla mnie zawsze wektor normalny do płaszczyzny to był wektor ortogonalny i znormalizowany, a nieznormalizowany "prostopadły wektor" to tylko wektor ortogonalny.
Nie ma czegoś takiego jak 'wektor ortogonalny'. Wektor może być ortogonalny z innym wektorem jeśli ich iloczyn skalarny jest równy 0.
Wektor normalny płaszczyzny A jest ortogonalny z każdym wektorem zawartym w płaszczyźnie A.

Zresztą:
http://pl.wikipedia.org/wiki/Ortogonalno%C5%9B%C4%87
http://pl.wikipedia.org/wiki/Iloczyn_skalarny
http://pl.wikipedia.org/wiki/Wektor_normalny

Offline counterClockWise

  • Użytkownik

# Luty 09, 2006, 14:27:22
Chodziło mi właśnie o ortogonalność do wektorów zawartych w danej płaszyźnie :)
A wektor normalny jest ortogonalny z każdym wektorem płaszyzny i jego metryka wynosi 1, jest więc ortonormalny względem wektorów płaszyzny, czy tak?

bies

  • Gość
# Luty 09, 2006, 14:52:20
A wektor normalny jest ortogonalny z każdym wektorem płaszyzny i jego metryka wynosi 1, jest więc ortonormalny względem wektorów płaszyzny, czy tak?
IMO raczej nie (ja sie z takim stwierdzeniem nie spotkałem). Mówi się po prostu, że wektor A jest prostopadły/ortogonalny do wektora B i dodatkowo wektory są długości jeden, albo że zbiór wektorów A i B jest ortonormalny.
Jak chcesz to mogę ci wysłać skrypt z algebry liniowej, tam sobie doczytasz.

bies

  • Gość
# Luty 09, 2006, 15:25:40
Cytat: counterClockWise
A wektor normalny jest ortogonalny z każdym wektorem płaszyzny i jego metryka wynosi 1, jest więc ortonormalny względem wektorów płaszyzny, czy tak?
Nie, wektor normalny (czyli prostopadły) nie musi być znormalizowany (czyli o długości 1). Te dwa pojęcia mimo, że brzmią podobnie nie są ze sobą związane. Tyle algebry, grafika 3D ,,trochę'' zmienia warunek prostopadłości.

Offline Demon

  • Użytkownik

# Luty 09, 2006, 15:33:23
Cytat: counterClockWise
A wektor normalny jest ortogonalny z każdym wektorem płaszyzny i jego metryka wynosi 1, jest więc ortonormalny względem wektorów płaszyzny, czy tak?
Nie, wektor normalny (czyli prostopadły) nie musi być znormalizowany (czyli o długości 1). Te dwa pojęcia mimo, że brzmią podobnie nie są ze sobą związane. Tyle algebry, grafika 3D ,,trochę'' zmienia warunek prostopadłości.

Wektor normalny musi/nie musi być znormalizowany w zależności od tego czy api graficzne toleruje nieznormalizowane wektory normalne (w opengl trzeba ustawić odpowiednio w maszynie stanów żeby ogl sam sobie normalizował wektory normalne). Jednak kiedy grę już bedziesz chciał wypuścić na światło dzienne to i tak w plikach modeli będziesz miał zapisane wektory normalne już znormalizowane (bo przecież sqrt jest dosyć kosztowną operacją, a przecierz model tak czy siak będzie miał na stałe przyporządkowane wektory normalne, no chyba że to model dynamiczny, który w zależności od pewnych czynników w grze zmienia położenie swoich vertexów)

Offline counterClockWise

  • Użytkownik

# Luty 09, 2006, 15:54:12
No ok. Właśnie chodziło mi o formalne stwierdzenie. Dzieki.

Jak chcesz to mogę ci wysłać skrypt z algebry liniowej, tam sobie doczytasz.

Mam swoje papierowe, miałem kiedyś algebrę na uczelni.

bies

  • Gość
# Luty 09, 2006, 15:59:49
Demon: Zauważyłeś może, że pisałem o algebrze? Tam definicja jest jednoznaczna.

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Luty 09, 2006, 18:16:09
Cytuj
Dla mnie zawsze wektor normalny do płaszczyzny to był wektor ortogonalny i znormalizowany
To grafika, a nie matma. ;) Tutaj nawet trójkąty nie są płaskie (a przynajmniej oglądającemu ma się wydawać, że nie są). :)

Cytuj
(w opengl trzeba ustawić odpowiednio w maszynie stanów żeby ogl sam sobie normalizował wektory normalne)
1. To, że w OpenGL ustawiasz stany nie znaczy, że OpenGL jest maszyną stanów.
2. Nic nie musisz ustawiać, jak korzystasz z vertex shaderów - po prostu normalizujesz sobie sam. :)

Cytuj
(bo przecież sqrt jest dosyć kosztowną operacją, a przecierz model tak czy siak będzie miał na stałe przyporządkowane wektory normalne, no chyba że to model dynamiczny, który w zależności od pewnych czynników w grze zmienia położenie swoich vertexów)
Sqrt jest dosyć tani, zwłaszcza jeżeli wyznaczasz normalne podczas ładowania obiektu (co pozwala zaoszczędzić sporo miejsca - ma to znaczenie, jeżeli masz dużo modeli i rozprowadzasz program przez sieć). :)

Offline Demon

  • Użytkownik

# Luty 10, 2006, 00:18:50
Cytuj
2. Nic nie musisz ustawiać, jak korzystasz z vertex shaderów - po prostu normalizujesz sobie sam.

Pewnie, super nie uruchomię twojej gry na moim kompie bo moja grafa nie obsługuje vertex shaderów, a przecież wystarczyło znormalizować wektory wcześniej...

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Luty 10, 2006, 00:47:02
Cytuj
Pewnie, super nie uruchomię twojej gry na moim kompie bo moja grafa nie obsługuje vertex shaderów, a przecież wystarczyło znormalizować wektory wcześniej...
1. Jeżeli modele są skalowane, to normalne siłą rzeczy też się denormalizują.
2. Brak obsługi vs przez kartę to nie problem - większość obecnie wspieranych sterowników OpenGL emuluje vertex shadery na CPU, jeżeli karta ich nie wspiera (w przeciwieństwie do pixel shaderów, emulacja VS na CPU nadal pozwala na sensowne osiągi). W Direct3D można włączyć software'owe przetwarzanie wierzchołków (co powoduje emulację vs2.0) podczas tworzenia device'a.
3. Mój aktualny silnik i tak w vertex shaderze liczy nieco więcej rzeczy (np. animacja na kościach i przygotowanie danych dla oświetlenia per-pixel), więc i tak potrzebuję vertex shaderów. :)