Rotacje, wektory i reszta matematyki w zEngine 3085 8

O temacie

Autor Siemekk

Zaczęty 18.01.2018 roku

Wyświetleń 3085

Odpowiedzi 8

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Siemanko. Otóż teraz mam trochę czasu na naukę a raczej czytanie więc chciałbym się dowiedzieć co powinienem wiedzieć o matematyce w tym silniku. Wiem że są wektory macierze itp. Ale czego mam się jak najwięcej nauczyć (Chodzi mi o wyliczanie pozycji vobów pracach na vertexach i ogólnie całych zasadach matematycznych. Więc moje pytanie brzmi od czego zacząć?
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Z książek to "Podstawy grafiki komputerowej" Shirleya. Można też posiłkować się wikipedią w tym temacie, aby nauczyć się podstaw. Do tego algebra liniowa. Większość to operacje na macierzach, wektorach (obroty, przesuwanie, skalowanie obiektów).

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Ok dzięki. Mam jeszcze jedno pytanie, mianowicie ci taki wzór ma jakąś fachową nazwę?
static float resistance     = 0.98f;                // opór przykładowo powietrze
static float acceleration   = 1.25f;                // Przyśpieszenie
 
static  vector2D position = 3000;                     // Pozycja fizycznego punktu - start pos
static  vector2D inertia  = 0;                        // Ruch bezposredni
zVEC2  target   = vector2D(1000, 2000);   // Pozycja celu
 
// Kierunek
(inertia += vector2D(target - position).Normalize() * acceleration) *= resistance;
 
// Zastosuj wektor
position += inertia;
 
Chciałbym wiedzieć czy to jest liczone z jakiegoś wzoru o fachowej nazwie ;)
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Nie, powiedziałbym że ten wzór jest wręcz oczywisty poza kawałkiem z normalize - ta metoda "wyciąga" z wektora kierunek, ignorując jego długość. Swoją drogą jestem zdziwiony że to się kompiluje - używasz rvalue (a nie referencji do zmiennej) jako lewego operandu *= . Co to ma właściwie robić?

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Z tego co pamiętam ten kod powodował że obiekt krążył wokół punktu. Ogólnym zamierzeniem było stworzenie krzywych Beziera, po to aby na ekranie wyświetlane były łuki, jednak nigdzie nie mogę znaleźć do tego informacji.
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Mam na myśli pytanie co ma robić konstrukcja tego typu:
(a += b) *= c;
//edit:
Wygląda na to że w C++ (a += b) zwraca referencję do a którą można nie tylko odczytać, ale i modyfikować. Końcowy rezultat jest taki jakbyśmy zrobili
a += b;
a *= c;
Możesz w tym języku kodzić przez lata i wciąż uczyć się okropieństw na jego temat...

Siemekk

Siemekk

Złote Wrota
Untersturmfuhrer
posty2143
Propsy1151
ProfesjaProgramista
  • Złote Wrota
  • Untersturmfuhrer
Lekki odkop. Ktoś może ogarnia, jak przesunąć pozycję obiektu, za pomocą wektora?
Mam macierz 4x4. Wyciągam z niej pozycję przedmiotu za pomocą:
trafo.GetTranslation();
I chcę go przemieścić względem prawego wektora.
trafo.GetRightVector();
Ale jak mogę to zrobić? Nie jestem najlepszy z tych matematycznych części, ale powoli zaczynam je rozumieć. Wszystkie wartości macierzy są mniejsze od 1 i większe od -1. Są to kąty Eulera, wiem jak je przerobić na kąty, ale nie wiem jak przesunąć pozycję względem wektora (kąta). Na internecie nic nie znalazłem. Ktoś mógłby pomóc lekko?
 

P.S A Splash w szafie i nie ma psychy by mi dać bana.

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Wydaje mi się, że wektor zapisujesz jako macierz przekątniową i wtedy możesz dodać obie macierze do siebie.
Wektor [x y z 1]^(-1) zapiszesz jako macierz [x 0 0 0] [0 y 0 0] [0 0 z 0] [0 0 0 1] (w nawiasach kwadratowych kolejne wiersze).

neko

neko

Użytkownicy
BE CURIOUS!
posty20
Propsy11
ProfesjaProgramista
  • Użytkownicy
  • BE CURIOUS!
Co to znaczy przemieścić względem prawego wektora, masz na myśli w jego stronę? Jeżeli chcesz wektor [x y z 1] przemieścić o [x0 y0 z0 1] to mnożysz wektor o taką macierz,
(jeszcze najpierw trzeba transponować wektor)

(1 0 0 x0) (x)
(0 1 0 y0) (y)
(0 0 1 z0) (z)
(0 0 0 1  ) (1),

czyli u ciebie w ostatniej kolumnie tej macierzy będą współrzędne prawego wektora,

https://learnopengl.com/Getting-started/Transformations ogólnie po tym rozdziale tego tutka powinno ci się rozjaśnić jeśli chodzi o matmę :D
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry