Skocz do zawartości
Vasto_Lorde

[Poradnik] Jak działają wektory i punkty w przestrzeni 3D?

Rekomendowane odpowiedzi

Jak działają wektory i punkty w przestrzeni 3D?

 

 

1. Wprowadzenie - Co to w ogóle jest punkt lub wektor?

I. Punkt w przestrzeni trójwymiarowej (3D) posiada trzy liczby określające jego pozycję w przestrzeni. Liczba X określa odległość punktu od środka przestrzeni na osi X (oś ox). Liczba Y określa odległość punktu od środka przestrzeni na osi Y (oś oy). Liczba Z określa odległość punktu od środka przestrzeni na osi Z (oś oz). Taki układ przedstawia nam obraz: 

image.png.c07ff1f47ab86d2a5c6c46b947499746.png

Jak widzimy, każda oś odpowiednio x, y oraz z odpowiada za przesunięcie punktu u . Działając na osi x przesuwamy punkt u od przodu do tyłu, oś y pozwala nam na przesunięcie punktu na prawo lub na lewo, natomiast oś z w górę lub w dół.


Załóżmy, że chcemy napisać gdzie dokładnie znajduje się nasz punkt u w przestrzeni. Zapisujemy to w następujący sposób:

(x, y, z)


Teraz żeby określić dokładną odległość, za literki x, y, z podstawiamy liczby

 

II. Wektor jest to matematyczny obiekt posiadający własności takie jak: długość, zwrot. Podobnie jak punkt, wektor określa się za pomocą trzech wartości, które również można zapisać jako:

(x, y, z)

W tym przypadku taki zapis nie oznacza punktu w przestrzeni 3D ale wektor przeniesienia w jakim kierunku i z jaką siłą coś zostało przeniesione. Także zapis może być identyczny, lecz to w jaki sposób go pobierzemy/wykorzystamy w kodzie programu definiuje jego zawartość.

 

Kilka wzorów :
- Aby obliczyć długość wektora musimy skorzystać ze wzoru √(a2^+b^2+c^2)  [słownie: pierwiastek z a do kwadratu dodać b do kwadratu dodać c do kwadratu]

- Wektor możemy określić również przez dwa punkty w przestrzeni. Jego początek i jego koniec. Spójrzmy jeszcze raz na obrazek 

image.png.c07ff1f47ab86d2a5c6c46b947499746.png

W takim przypadku gdy punkt wyjściowy układu (0,0,0) jest równy początkowi wektora, łatwo możemy obliczyć czarny wektor na rysunku ponieważ wzór wynosi: (x2 - x1, y2 - y1, z2 - z1), gdzie odpowiednio (x1, y1, z1) oraz (x2, y2, z2) to punkt początkowy i punkt końcowy wektora.  Musimy jednak pamiętać, że wektor w przestrzeni 3D nie zawsze ma swój początek w (0,0,0).

 

 

2. Po co nam taka wiedza w sourcemodzie?

Każdy obiekt w CS:GO ma swój origin, czyli punkt w przestrzeni który określa gdzie się on znajduje. A takowymi przestrzeniami są mapy w CS:GO. Każda mapa jest osadzona w jakiejś przestrzeni 3D i każdy obiekt na tej mapie posiada origin, tablicę z trzema wartościami (x, y, z) by określić w jakim miejscu się znajduje.

Jeśli chodzi o wektory, to każdy obiekt ma dwa wektory określające jego "zachowanie" w grze. Pierwszy to velocity(dosłownie prędkość) i określa on z jaką mocą poruszamy się w jakim kierunku czy to chodząc klawiszami WSAD czy spadając z wysokości czy skacząc (to samo tyczy się zwykłych obiektów takich jak bronie na ziemi). Drugi wektor to angle czyli wektor kąta/obrotu obiektu. Nie jest to typowy wektor opisany powyżej, po prostu to w którą stronę obrócony jest obiekt określają te trzy wartości (x, y, z).

 

 

3. Praktyczne zastosowanie

GetClientAbsOrigin
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! / GetClientAbsAngles
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! / GetClientEyeAngles
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

Zgodnie z dokumentacją dzięki tym funkcjom możemy pobrać podstawowe wartości dotyczące wektorów graczy. Wszystkie trzy wyglądają mniej więcej tak:

Spoiler

NazwaFunkcji(int client, float vector[3]);

 

W każdym przypadku potrzebujemy indeksu klienta oraz tablicy zawierającej trzy miejsca.  Do tablicy podanej w funkcji zostaje przekazana dana wartość, wektor zawierający trzy liczby z przecinkiem. Co możemy zrobić z tymi wartościami? Pluginy na teleportacje, zatrzymywanie graczy na respawnie, efekty odurzenia, aimbota i dużo innych.  Przykład praktyczny:
 

Spoiler

float clientOrigin[3];
//pobieramy origin gracza
GetClientAbsOrigin(client, clientOrigin);
//przesunięcie punktu w przestrzeni o 5 w dół ([2] odpowiada za oś Oz)
clientOrigin[2] -= 5.0;
//teleportacja gracza w nowe miejsce, co najprawdopodobniej unieruchomi go w ziemi jeśli na niej stoi
TeleportEntity(client, clientOrigin, NULL_VECTOR, NULL_VECTOR);

 

Pamiętajmy jednak, że nie da się tak łatwo przeteleportować gracza po osiach Ox i Oy, ponieważ miejsce i zwrot środka układu jest zawsze takie samo i nie obraca się ono zgodnie z graczem. Więc jeśli od pobranej wartości origin odejmiemy -5 z [0] (oś Ox) to nie przeniesie gracza w lewo względem jego pozycji, tylko względem ustawienia środka układu!

 

 

Bibliografia

Tutorial powstał z pomocą https://pl.wikipedia.org/wiki/Wektor
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! oraz moją szczątkową wiedzą i doświadczeniem w tym zakresie

 

*Uprasza się o nie kopiowanie poradnika bez wcześniejszego zapytania autora o zgodę

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...