Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Zewnętrzny przewodnik W2S
#1
Jest to napisane z myślą o grach w Unity, ale będzie to miało wpływ na każdą grę z pewnymi modyfikacjami. Nie jestem ekspertem od tego tematu, więc jeśli zauważysz jakiekolwiek błędy, możesz je wskazać.     Reading / References Perspektywa Projekcja   Euler Angles   Macierz rotacji   Nie panikuj, jeśli te wyglądają zniechęcająco, pojęcia są dość proste i przejdę je później.     Wprowadzenie Jest kilka rzeczy, które musisz wiedzieć, zanim uzyskasz zewnętrzny świat do pracy na ekranie. Musisz znać FOV gry, wymiary ekranu, czy używane są współrzędne lewostronne lub praworęczne i konwencja rotacji używana przez silnik gry. Wiele gier Unity ma suwak FOV, wymiary ekranu można łatwo określić, a EunerAngles Unity są zewnętrzne i w kolejności z-x-y. Unity używa również lewego układu współrzędnych.   Istnieją trzy główne kroki związane z obliczaniem pozycji ekranu punktu w przestrzeni świata. Najpierw musisz obliczyć długość ogniskowej kamery. Należy to zrobić tylko raz, ponieważ nie ulegnie zmianie, chyba że zmienią się wymiary pola widzenia lub ekran. Następnie musisz przesunąć i obrócić punkt, aby zrekompensować pozycję i obrót kamery do gry. Na koniec musisz użyć prostej geometrii, aby obliczyć pozycję x i y ekranu.     1. Obliczanie długości ogniskowej   Na powyższym diagramie θ to połowa FOV, h to połowa wysokości ekranu, a f to długość ogniskowej kamery do gier. Używając trygonometrii, mamy opaleniznę (θ) = h / f, którą przestawiamy, aby uzyskać f = h / tan (θ). Zakładając, że FOV jest w radianach, wygląda to tak:     Kod:   float focalLength = (wysokość / 2f) / tan (FOV / 2f);   2. Zastosowanie transformacji kamery Najpierw skompensuj pozycję kamery, odejmując pozycję kamery od punktu docelowego.   Następnie musisz zrekompensować rotację kamery. Odbywa się to poprzez obrót nowego punktu wokół punktu początkowego przez odwrócenie obrotu kamery (to jest uczynienie jej ujemnym). Aby wykonać ten obrót, mnożymy nowy punkt przez macierz obrotu. Macierz zależy od kolejności obrotów i od tego, czy są one zewnętrzne czy wewnętrzne.   Możemy po prostu skopiować z tej tabeli; dotyczy to jednak wewnętrznych obrotów i zakłada praworęczny układ współrzędnych. To są proste problemy do naprawienia - zewnętrzna macierz rotacji jest odpowiednikiem macierzy rotacji wewnętrznej dla rotacji stosowanej w odwrotnej kolejności (więc używamy macierzy Yxz) i możemy po prostu wykonać wszystkie rotacje, a składowa z punktu docelowego ujemna przekształcić go w praworęczny układ współrzędnych.       Kod:   / * Przetłumacz przez - camerapos * / camerapos = new Vector3f (camerapos. X, camerapos. Y, - camerapos. Z); point = new Vector3f (punkt x, punkt y, - punkt. z); point - = camerapos; / * Zbuduj macierz rotacji Obrót byłby tu ujemny, aby uwzględnić przeciwny kierunek obrotów w leworęcznym układzie współrzędnych Unity, ale ponieważ robimy je ujemne już to anuluje * / float cosX = Cos (camerarot. X); float cozy = Cos (operator) y); float cosZ = Cos (camerarot. z); float sinX = Sin (camerarot. x); float sinY = Sin (camerarot. y); float sinZ = Sin (camerarot. z); float [3, 3] matrix = new float [3, 3]; matrix [0, 0] = cosZ * cozy - sinZ * sinX * sinY; matrix [0, 1] = - cosX * sinZ; matrix [0, 2] = cosZ * sinY + cozy * sinZ * sinX; matrix [1, 0] = przytulny * sinZ + cosZ * sinX * sinY; matrix [1, 1] = cosZ * cosX; matrix [1, 2] = sinZ * sinY - cosZ * cozy * sinX; matrix [2, 0] = - cosX * sinY; matrix [2, 1] = sinX; matrix [2, 2] = cosX * cozy; / * Zastosuj macierz obrotu do punktu docelowego * / Vector3f rotatedPoint; rotatedPoint. x = macierz [0, 0] * punkt. x + macierz [0, 1] * punkt. y + macierz [0, 2] * punkt. z; rotatedPoint. y = macierz [1, 0] * punkt. x + macierz [1, 1] * punkt. y + macierz [1, 2] * punkt. z; rotatedPoint. z = macierz [2, 0] * punkt. x + macierz [2, 1] * punkt. y + macierz [2, 2] * punkt. z; / * Przywróć leworęczny układ współrzędnych * / punkt = Vector3 (obróć punkt x, obróć punkt y, - obrócony punkt z);   Zwróć uwagę, że jeśli składowa z punktu obrotu jest ujemna, to jest za kamerą i nie należy jej rysować.     3. Obliczanie pozycji ekranu   Na powyższym diagramie możemy użyć czerwonych i zielonych trójkątów zamkniętych przez linię do przekształconego punktu docelowego, aby zapisać stosunek focalLength / point.z = Δx / point.x, gdzie Δx jest przesunięciem współrzędnej ekranu x z środek ekranu. Możemy to zmienić, aby uzyskać Δx = focalLength * point.x / point.z, a następnie użyć tego, aby uzyskać:     Kod:   float screenX = focalLength * point. x
Reply
#2
Twój kod wygląda całkiem nieźle, nie miałem czasu, aby przetestować go samemu i przejrzeć go bardziej szczegółowo, ale zrobię to, kiedy będę miał czas. Dodanie obliczenia długości ogniskowej i niektórych trygonometrii może dać dokładniejsze wyniki przy użyciu Twojej metody.
Reply
#3
Trygonometria jest już w użyciu, po prostu wymaga regulacji ogniskowej kamery, jak sądzę. To, co kocham w tej technice, to to, że jest niezależna od gry i koduję ESP, który jest tak niezależny, jak to tylko możliwe. Jednak droga jest nadal długa, jak widać na mojej mapie myśli: http://imageshack.com/a/img923/5954/22MJkN.png
Reply
#4
To może być głupie pytanie, ale czy działałoby to w Rust (Experimental)?
Reply
#5
Zacytować: Originally Posted by lucasman22 To może być głupie pytanie, ale czy działałoby to w Rust (Experimental)? Tak, właśnie tego używam.
Reply
#6
Zrobiłem już scenariusz, aby broń pozostała w The Middle Problemem, który mam teraz, jest rozpylanie z pistoletem w lewo i prawo, możesz mi w tym pomóc. z AHK PS: Rust Game!
Reply
#7
Zacytować: Napisał pierwotnie TheDevilHunt Zrobiłem już scenariusz, aby broń pozostała w The Middle Problemem, który mam teraz, jest rozpylanie z pistoletem w lewo i prawo, możesz mi w tym pomóc. z AHK PS: Rust Game! ?
Reply
#8
Jak powinny wyglądać wartości dla cosX i sinX?
Reply
#9
Zacytować: Originally Posted by lucasman22 Jak powinny wyglądać wartości dla cosX i sinX? niższy niż 1 sinus cos / sin reprezentuje proporcję między przeciwległą / sąsiednią stroną a przeciwprostokątną (podstawowa trygonometria 8/9. w Niemczech)
Reply
#10
dzięki Bogu przewodnikowi
Reply




Users browsing this thread: 1 Guest(s)