Skocz do zawartości

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 / GetClientAbsAngles / GetClientEyeAngles

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 oraz moją szczątkową wiedzą i doświadczeniem w tym zakresie

 

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

Sygnatura użytkownika

Hej! Pamiętaj uhonorować reputacją KAŻDEGO użytkownika który Ci pomógł! 👮‍♂️

 

Moje pluginy: Ultimate Weather | XiaolinMod | Knife Round | Storm Circle |  AutoBunnyHop | Remove Weapons RoundEnd
Moje artykuły: Przejrzysty kod | Optymalizacja warunków IF | Usuń martwy kod | Notacja węgierska | Co to backdoor? | Jak wgrać plugin? | Lokalna kompilacja | Licencja na plugin | Wektory | Nowa składnia sm | Funkcje czasowe | Spolszczenie pluginu

  • Lubię to!
  • Dobry pomysł!
Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ostatnio przeglądający ten temat (5 użytkowników)

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ć grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...