←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Jak wyznaczyć origin znajdują...


Zablokowany

  • +
  • -
Ossal - zdjęcie Ossal 15.02.2015

Pytanie dość proste, odpowiedź nie koniecznie, siedzę nad tym trochę i nie wiele wymyśliłem :P
Chodzi o to, że potrzebuje funkcji wyznaczającej origin za plecami gracza jednostek X, za plecami czyli dokładnie przeciwny kierunek do miejsca w które gracz mierzy. Powiedzmy że mamy coś takiego:
amxx_1423959383__taga.png
 

A - Gracz
B - Miejsce w które mierzy
C - szukany punkt
x - odległość (zmienna do ustalenia późniejszego :D)

Czyli potrzebuję punkt po przeciwnej względem gracza stronie od miejsca gdzie mierzy (np get_user_aiming)
Oczywiście nie bierzemy pod uwagę wysokości (origin[2]) tylko [0] i [1].
Zacząłem już nawet rozpisywać funkcję i szukać na to matematycznego wzoru, ale utknąłem :P

Doszedłem do tego tylko że C znajduję się na tej samej prostej co A i B i kombinowałem z tym coś :)
Ma ktoś pomysł co zrobić?
Jeżeli odpowiedź  jest banalnie prosta to sory, zawiesiłem się :D

PS najlepiej origin we Float :D


Użytkownik Ossal edytował ten post 15.02.2015 01:28
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 15.02.2015

Warto użyć wektorów :) Oczywiście w matematycznym sensie.

Zakładam, że A i B są tablicami 3 elementowymi, zawierającymi współrzędne X, Y, Z.

1. najpierw wyznaczmy wektor patrzący w kierunku z A na B:

Z[0] = B[0] - A[0]
Z[1] = B[1] - A[1]
Z[2] = B[2] - A[2]
Zauważmy, że jest to wektor niezaczepiony (tj nie posiada współrzędnych początku i końca, posiada tylko przemieszczenie).

Teraz skróćmy (lub wydłużmy) wektor do długości x:

// tworzymy kwadrat bieżącej długości wektora. Szkoda operować na właściwych odległościach, lepiej uniknąć pierwiastkowania. 
sqdist = Z[0]*Z[0] + Z[1] * Z[1] + Z[2] * Z[2] 
sqx = x*x

// obliczamy proporcję między długością, którą chcemy otrzymać, a długością którą mamy. Tu już wyciągamy pierwiastek
multipler = sqrt(sqx / sqdist) 

// mnożymy Z przez tą proporcję
Z[0] *= multipler
Z[1] *= multipler
Z[2] *= multipler
Teraz wystarczy obrócić wektor i zaczepić go w punkcie A


Z[0] = -Z[0]
Z[1] = -Z[1]
Z[2] = -Z[2]

Z[0] += A[0]
Z[1] += A[1]
Z[2] += A[2]
I tak oto nasz wektor Z stał się punktem Z... a właściwie punktem C, czyli szukanym przez nas.
Odpowiedz

  • +
  • -
Ossal - zdjęcie Ossal 15.02.2015

Całkiem sensownie napisane, mógłby ktoś z tego zrobić stocka? :D


GwynBleidD (16.02.2015 12:19):
Lenistwo poziom master... wystarczy poskładać kod do kupy i wrzucić w funkcję...
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 16.02.2015

Puszczamy traceline na interesujaca nas odleglosc, lapiemy punkt, odejmujemy od niego origin gracza, zrobione.


GwynBleidD (16.02.2015 12:19):
Dość kosztowna obliczeniowo metoda :)
grankee (16.02.2015 23:06):
Czemu? Nikt nie mówił, że to ma być w prethinku, a jednorazowo chyba nie powali serwera :)
GwynBleidD (17.02.2015 12:44):
trochę jak strzelanie armatą do muchy, jeśli potrzebujemy stałą odległość od jakiegoś punktu to szkoda używać traceline. Traceline przydaje się gdy musimy np tą odległość określić lub zbadać co jest np na torze lotu pocisku.
grankee (17.02.2015 16:07):
ale zabijesz :D no dobra może i racja
Odpowiedz

  • +
  • -
Najlepsza odpowiedź sebul - zdjęcie sebul 16.02.2015

http://amxx.pl/topic...rzedza-graczem/
Odpowiedz

  • +
  • -
Ossal - zdjęcie Ossal 18.02.2015

Dzięki :)

Odpowiedz

  • +
  • -
radim - zdjęcie radim 19.02.2015

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
Odpowiedz
Zablokowany