Tag: math

Entries for tag "math", ordered from most recent. Entry count: 68.

Uwaga! Informacje na tej stronie mają ponad 6 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

Pages: > 1 ... 5 6 7 8 9 >

# Nowy artykuł - Kwaterniony w praktyce

Tue
20
May 2008

Mój następny artykuł nosi tytuł Kwaterniony w praktyce. Przeznaczony jest dla tych, którzy znają już podstawy matematyki potrzebnej w programowaniu grafiki 3D (wektory, macierze), ale dotychczas omijali temat kwaternionów szerokim łukiem myśląc, że są bardzo trudne. Artykuł pokazuje (mam nadzieję), że nie ma w nich żadnej czarnej magii - są po prostu wygodnym narzędziem do zapisywanie obrotów i orientacji w 3D, z którego można się nauczyć korzystać bez rozumienia, że kwaternion to rozszerzenie liczb zespolonych mające trzy pierwiastki urojone :) Zamiast wzorów pokazałem fragmenty kodu C++.

Comments | #productions #math Share

# Floor, ceil i reszta

Fri
09
May 2008

Mieliśmy właśnie przed chwilą na IRC-u dyskusję o zasadach, według jakich działa zaokrąglanie/obcinanie liczb zmiennoprzecinkowych przez funkcje floor, ceil i rzutowanie na int. Przypomniałem sobie, że to temat, z którym nieraz się już spotkałem i pomyślałem, że warto to usystematyzować:

x          -2.9  -2.2   2.2   2.9
---------------------------------
(int)x     -2    -2     2     2
floor(x)   -3.0  -3.0   2.0   2.0
ceil(x)    -2.0  -2.0   3.0   3.0
round(x)   -3.0  -2.0   2.0   3.0

Problem w tym, że funkcji zaokrąglającej round w C++ nie ma, trzeba ją sobie napisać. Podobnie brakuje funkcji zostawiającej samą część ułamkową 0..1, a jest ona bardzo potrzebna np. do robienia funkcji okresowych i występuje np. w języku HLSL jako frac.

inline int round(float x) {
  return (int)(x+0.5f);
}
inline float frac(float x) {
  return x - (float)(int)(x);
}

Nie jestem tylko pewny, czy rzutowanie na int faktycznie zawsze obcina część ułamkową. Na moim Visual C++, Windows XP i procesorze Intel Core2Duo 32bit tak jest, ale nie zaglądałem do standardu C++, więc nie wiem czy tak samo jest wszędzie. Wkrótce jakiś językoznawca powinien wyjaśnić tą kwestię w tym wątku forum. Gdyby się jednak okazało, że nie można polegać na tym rzutowaniu, funkcję obcinającą część ułamkową można sobie napisać samemu:

inline float trunc(float x) {
  return (x < 0.0f) ? ceilf(x) : floorf(x);
}

Takich niby prostych (prostych dla tego co już je zna) sztuczek matematycznych jest bardzo dużo. Przydałoby się je kiedyś porządnie spisać :) Na przykład ta nasza dyskusja IRC-owa zaczęła się od pytania, jak obciąć liczbę do 2 miejsc po przecinku. Rozwiązaniem jest:

y = (float)(int)(x * 100.0f) / 100.0f;

Comments | #c++ #math #algorithms Share

# Policzone tangenty do mapy

Thu
01
May 2008

Wieści z pierwszej linii frontu: Chyba udało mi się policzyć normalne i tangenty dla mapy Indoor, z wygładzeniem zależnie od kąta krawędzi. Wzory na tangenty wziąłem z tego artykułu. Ciekawy patent wymyśliłem, żeby w poszukiwaniu wierzchołków leżacych w pobliżu nie działać ze złożnością kwadratową. Otóż posortowałem wierzchołki w każdej grupie (rysowane danym materiałem) wg współrzędnej X. Potem dla każdego wierzchołka przeglądam tylko kilka następnych, tak długo jak (v2.x - v1.x) < EPSILON_DIST. Czyż to nie dużo prostsze, niż jakieś Octree czy k-d tree? :D

Mapa Indoor - Normal

Comments | #rendering #math Share

# GameDev Calc

Fri
18
Apr 2008

Opublikowałem moją nową małą, wielką produkcję. Jest mała, bo kodowanie wcale nie wymagało dużo pracy, ale wielka, bo od dawna bardzo chciałem to napisać. To GameDev Calc - kalkulator dla programistów gier.

Pobierz: GameDevCalc_1-0.zip (53.06 KB)

Jednostką danych jest wektor 1-4 liczb zmiennoprzecinkowych, który można traktować jako wektor (x,y,z,w) lub kolor (r,g,b,a). Oprócz podstawowych operacji jak dodawanie, mnożenie czy sinus, dostępne są operacje wektorowe, np. normalizacja wektora, a także zamiana kątów na stopnie i radiany, zamiana kolorów na RGB i HSB, znajdowanie współczynników funkcji liniowej i kwadratowej oraz wiele innych. Zamiast tylko ostatnio wprowadzonej liczby, widoczna jest cała historia obliczeń w postaci stosu i na tym stosie są przeprowadzane wszystkie operacje. Dane można wprowadzać i wyprowadzać w dowolnym wybranym formacie, np. jako "D3DXVECTOR4(0.0f, 0.5f, 0.752f, 1.0f)" albo "0xFF0080C0". Platforma: Windows. Język: C#. Licencja: GNU GPL.

Comments | #productions #tools #math Share

# Przekształcenie wektora przez macierz

Thu
20
Mar 2008

Transformację w 3D opisuje macierz 4x4. Pełne przekształcenie punktu (x,y,z) przez taką macierz polega na pomnożeniu (x,y,z,1) przez tą macierz, a potem podzieleniu trzech pierwszych składowych przez składową czwartą w. Używamy tu tzw. współrzędnych jednorodnych (ang. Homogeneous Coordinates). W D3DX dokonuje tego funkcja D3DXVec3TransformCoord.

Przekształcenie wektora wskazującego kierunek (w przeciwieństwie do punktu opisującego położenie) musi nie brać pod uwagę translacji, czyli czwartego wiersza macierzy. Dlatego przekształcenie wektora polega zwykle na pomnożeniu (x,y,z) przez podmacierz 3x3 tej macierzy. W D3DX dokonuje tego funkcja D3DXVec3TransformNormal.

Jeśli ten wektor jest wektorem normalnym wierzchołka siatki, teoretycznie należy go przekształcić przez odwrotność transpozycji (lub transpozycję odwrotności - to bez różnicy) tej macierzy, której używamy do przekształcania pozycji wierzchołków. W praktyce jednak, jeśli podmacierz 3x3 tej macierzy zawiera tylko rotację (i ewentualnie skalowanie proporcjonalne), a nie zawiera skalowania nieproporcjonalnego ani ścinania, wektory bazowe w tej macierzy są ortogonalne, więc jej odwrotność jest równa jej transpozycji i te przekształcenia się znoszą. Dlatego wystarczy przekształcić wektor wprost przez daną macierz, bez odwracania i transponowania (a wynik ewentualnie znormalizować, jeśli było skalowanie).

W swojej bibliotece matematycznej mam jeszcze jedną funkcję, nazwaną po prostu Transform. Przekształca ona punkt (x,y,z,1) przez podmacierz 4x3 podanej macierzy, nie wyliczając współczynnika w i nie dzieląc przez niego. To znacznie przyspiesza obliczenia względem funkcji TransformCoord i wystarcza wszędzie tam, gdzie macierz nie zawiera przekształcenia perspektywicznego, bo jej czwarta kolumna jest wtedy zawsze równa (0,0,0,1).

Za wszelkie uproszczenia przepraszam. Możnaby o tym dużo pisać. Chciałem tu tylko pokazać, że teoretyczne "pomnożyć wektor przez macierz" przybiera w praktyce różne formy i trzeba umieć prawidłowo je stosować.

Comments | #math #directx Share

# Quady zwrócone w stronę kamery

Fri
23
Nov 2007

Berg zadał wczoraj na forum pytanie o to, jak napisać w DirectX quady zwrócone zawsze w stronę kamery w celu zrobienia efektu cząsteczkowego (particle system). Naszła mnie ochota, żeby w odpowiedzi opisać to dokładnie i tak powstała długa wiadomość, która może się komuś przydać. Dlatego postanowiłem tutaj również ją zareklamować :) Odp: Quady zwrócone w stronę kamery

Comments | #rendering #math #algorithms Share

# Ściąga ze Specular

Wed
31
Oct 2007

Spodobało mi się to robienie graficznych mini-lekcji z podstawami programowania grafiki :) Napiszcie co o tym sądzicie - może zrobię jeszcze inne.

Tymczasem przygotowałem ściągę ze wzorami na odblask (ang. Specular). Wykorzystuje on, podobnie jak prawo Lamberta, iloczyn skalarny (ang. Dot Product), a dodatkowo używa potęgowania. Są dwie metody liczenia odblasku:

Comments | #math #teaching #rendering Share

# Co to jest Half-Lambert

Tue
23
Oct 2007

Dziś chciałem wam przybliżyć efekt Half-Lambert. Prawo Lamberta mówi, że jasność powierzchni w danym miejscu jest wprost proporcjonalna do cosinusa kąta między wektorem kierunku DO źródła światła, a wektorem normalnym prostopadłym do powierzchni w tym miejscu. Ten z kolei jest równy iloczynowi skalarnemu (Dot Product) między tymi wektorami, o ile są znormalizowane. W ten sposób działa podstawowy wzór na oświetlenie "rozproszone" (Diffuse). Wygląda dobrze, ale ma tą wadę, że cała połowa powierzchni obiektu - ta zwrócona tyłem do źródła światła - jest kompletnie czarna.

Rozwiązaniem jest Half-Lambert, czyli takie przeskalowanie wyniku iloczynu skalarnego, by każdy fragment powierzchni otrzymał jakieś oświetlenie, z wyjątkiem miejsca zwróconego dokładnie przeciwnie do źródła światła. Wygląda to brzydko i nienaturalnie, ale w pewnych specyficznych sytuacjach może się przydać. Ja na przykład użyłem tego przy renderowaniu liści drzew.

Comments | #rendering #teaching #math Share

Pages: > 1 ... 5 6 7 8 9 >

[Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2026