All blog entries, ordered from most recent. Entry count: 1198.
# Nowe zdjęcia w galerii
Sat
22
Mar 2008
Umieściłem dużo nowych zdjęć w Galerii. Zapraszam do katalogów: Przyroda, Technika, Miasto, Uczelnia, Warszawa, Tekstury, Rozne fotki.
Wiem, że fotograf ze mnie kiepski (aparat też, tam gdzie zdjęcia robiłem komórką), ale w końcu tu nie o żaden artyzm chodzi. Nie twierdzę też, że nie mam żadnych innych zdjęć, ale tych na których są moi znajomi i ich rzeczy/mieszkania nie będę pokazywał publicznie.
Przy okazji życzę wszystkim zdrowych i wesołych Świąt !!!
# 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
# Visual AssistX jest fajny
Tue
18
Mar 2008
Trzy razy próbowałem przekonać się do Visual AssistX instalując działającą przez miesiąc wersję testową. To rozbudowana wtyczka do Visual Studio (nie do wersji Express), która wzbogaca go o naprawdę ciekawe funkcje wspomagające pisanie kodu i zastępuje te już istniejące dużo lepiej zrealizowanymi. Wśród nich są różnorodne i świetnie pomyślena możliwości nawigacji po kodzie, działające prawie bezbłędnie podpowiedzi (IntelliSense) i ulepszone kolorowanie składni. Za każdym razem bardziej denerwował mnie niż pomagał, ale ostatnio tak się do niego przyzwyczaiłem, że nieprzyjemnie będzie, kiedy skończy się okres testowy. To jest chyba kwestia posiadania dostatecznie szybkiego komputera (AssistX bardzo "zamula"). Szkoda, że pełna wersja kosztuje $99.
Comments | #visual studio #tools Share
# Mały komiks
Sun
16
Mar 2008
Wymyśliłem i zrobiłem ostatnio mały komiks :)
Comments | #warsztat #humor Share
# IGK Quiz 2008
Sat
15
Mar 2008
Jest pomysł, żeby na tegorocznej konferencji IGK urządzić nieoficjalny konkurs/teleturniej/quiz z pytaniami dla programistów, wzorowany trochę na Programmer's Challenge z amerykańskiej konferencji GDC. Napisałem już odpowiedni program - oto zrzuty ekranu:
Teraz prośba do was o pomoc przy układaniu pytań. Więcej informacji i dyskusja w tym wątku forum.
Comments | #events #warsztat #igk Share
# Cząsteczki stanowe i bezstanowe
Fri
14
Mar 2008
Wrócę jeszcze do tematu efektów cząsteczkowych, żeby opisać coś, co dla wielu jest oczywiste, ale dla każdego przecież kiedyś nie było. Mnie do końca rozjaśnił tą sprawę referat mINA87 z ubiegłorocznej IGK pt. "Zaawansowane i efektywne systemy cząsteczkowe w grach komputerowych". Otóż efekty cząsteczkowe mogą być stanowe lub bezstanowe.
Efekty cząsteczkowe bezstanowe to takie, w których wszystkie parametry cząstki (pozycja, rozmiar, kolor, przezroczystość, orientacja) mogą być w dowolnej chwili wyliczone wg określonego, stałego wzoru w funkcji czasu (np. wg funkcji liniowej, kwadratowej, jakiejś z sinusem czy interpolacji między podanymi punktami). Ich zaletą jest łatwość zarządzania i przeliczania, także całkowicie za pomocą Vertex Shadera na GPU.
Efekty cząsteczkowe stanowe to takie, w których zapamiętane są bieżace parametry każdej cząsteczki. Są one aktualizowane wg pewnych zależności na podstawie parametrów poprzednich i delty czasu. Każda cząsteczka ma też czas życia, a nowe są tworzone przez tzw. emiter. To podejście pozwala sterować cząsteczkami w sposób interaktywny, np. zostawiać dym za latającą w dowolny sposób rakietą albo liczyć kolizje iskier odbijających się od ścian i podłogi.
Efekt cząsteczkowy napisałem już bardzo dużo razy - ostatnio wczoraj :) Może kiedyś opiszę w jakimś małym artykule, jak dokładnie to robię.
# D3DFVFCAPS_PSIZE
Wed
12
Mar 2008
Wiem, że mechanizm Point Sprites jest przestarzały i ma wielu przeciwników, ale czasem jest dobrym rozwiązaniem. Ta notka będzie dla tych, którzy go stosują. Mogą się oni nieprzyjemnie zdziwić (tak jak ja ostatnio), że na niektórych kartach graficznych cząsteczki mają złą wielkość (np. są ogromne zamiast takich jakie mają być albo nie widać ich w ogóle).
Winny jest D3DFVFCAPS_PSIZE. Ten Caps mówi, czy rozmiar cząsteczki może być brany ze struktury wierzchołka o semantyce D3DFVF_PSIZE. Co ciekawe, legitymują się nim wszystkie, nawet stare karty firmy ATI, ale z kart firmy NVIDIA tylko te należące do generacji GeForce 6 i nowszych.
Co wobec tego zrobić? Kiedy rozmiar punktu nie może być brany z wierzchołka, jest odczytywany z ustawienia D3DRS_POINTSIZE. Na szczęście nawet wtedy wierzchołek może zawierać element D3DFVF_PSIZE, tylko on po prostu nie działa. Tak więc prawidłowym rozwiązaniem jest używać D3DFVF_PSIZE jeśli jest taka potrzeba, ale na wszelki wypadek wyliczyć też jakiś średni rozmiar cząsteczki i wpisać go do D3DRS_POINTSIZE.
Comments | #rendering #directx Share
# Cała prawda o Warsztacie
Mon
10
Mar 2008
Siedząc na co dzień na Warsztacie nie potrafimy zobaczyć go z boku, tak jak widzą go inni. Od czasu do czasu docierają tylko do nas signały na temat opinii różnych grup, nie zawsze pozytywne. Dlatego ciekaw jestem, co sądzą o nas początkujący pasjonaci programowania, a co sądzą zawodowi programiści? Co sądzą demoscenowcy, graficy, informatycy z innych branż?
Może dla niektórych jesteśmy grupą zbyt hermetyczną i niechętną nowym? Może dla kogoś poziom naszych problemów programistycznych jest za wysoki albo przeciwnie, za niski? Może dla niektórych jesteśmy bandą oszołomów, którzy zajmują się trudną i nieopłacalną dziedziną? A może wręcz zgrają dzieciaków, którzy tylko myślą, że coś potrafią?
Przydałoby się takie miejsce, gdzie różni ludzie mogliby się szczerze wypowiedzieć co myślą o Warsztacie. To by było z korzyścią dla wszystkich.