Po co osobna kolizja?
Postacie, auta i kule w GTA SA odbijają się od kolizji modelu, nie od tego, co widać. Ładny model ma dziesiątki tysięcy trójkątów, a kolizja potrzebuje ich dużo mniej: mniej pracy dla gry przy każdym kroku, strzale i zderzeniu.
Generator robi plik .col w formacie COL3, takim samym jak w grze. Upraszcza model metodą QEM (łączy krawędzie tam, gdzie kształt prawie się nie zmienia), więc płaskie ściany, kąty i krawędzie zostają na miejscu nawet przy małej liczbie trójkątów. Pod podglądem widzisz, o ile najbardziej i średnio kolizja odstaje od modelu.
Krok po kroku
- Wrzuć model na pole wyżej. Model
.gltfwrzuć razem z plikiem.bin(zaznacz oba naraz). - Wybierz tryb i liczbę trójkątów. Wynik liczy się sam po każdej zmianie; pomarańczowa siatka w podglądzie to kolizja.
- Odznacz materiały bez kolizji (szyby, liście, firanki) i ustaw powierzchnię: domyślną dla całości albo osobną dla materiału.
- Pobierz plik .col, włóż go do zasobu obok modelu i wpisz w
meta.xml. - Wczytaj go w skrypcie klienta przed podmianą modelu:
<!-- meta.xml -->
<file src="lampa.glb" />
<file src="lampa.col" />
<script src="client.lua" type="client" />
-- client.lua
local col = engineLoadCOL(":moj_zasob/lampa.col")
engineReplaceCOL(col, 1337)
engineReplaceModel(engineLoadMesh(":moj_zasob/lampa.glb"), 1337)
Osie i jednostki są liczone tak samo jak przy engineLoadMesh, więc kolizja leży dokładnie pod modelem, bez przesuwania.
Który tryb wybrać?
| Tryb | Co robi | Do czego |
|---|---|---|
| Siatka | Uproszczona siatka trójkątów, dokładnie wzdłuż modelu. | Budynki, wnętrza, schody, rampy, wszystko z wklęsłościami. |
| Otoczka | Najmniejsza wypukła bryła, która obejmuje cały model. | Kamienie, rzeźby, skrzynie o nieregularnym kształcie. Bez wnęk i przejść. |
| Pudełka | Kilka prostopadłościanów ułożonych z wokseli. | Meble, ogrodzenia, stragany. Bardzo tanie dla gry. |
| Pudełko | Jedno pudełko na wymiar modelu. | Skrzynie, kontenery, automaty. |
| Kula | Najmniejsza kula wokół modelu. | Beczki, piłki, krzaki, drobne przedmioty. |
Ile trójkątów ustawić?
- 50–300: drobne przedmioty: słupek, ławka, kosz.
- 300–1500: meble, auta-dekoracje, małe budynki.
- 1500–6000: budynki z wnętrzem, mosty, rampy do jazdy.
- Do 12 000: duże kawałki mapy. Więcej zwykle nie poprawia jazdy, a obciąża grę.
Patrz na „największy błąd kształtu”. Do chodzenia wystarcza kilka centymetrów; jeśli błąd rośnie do dziesiątek centymetrów, postać będzie wisieć w powietrzu albo wchodzić w ściany. Format COL3 mieści najwyżej 65 535 trójkątów, a model musi się zmieścić w 255 m od swojego środka.
Materiały i powierzchnie
Lista materiałów pokazuje, z czego składa się model. Materiały, które wyglądają na przezroczyste (szkło, okna, liście, tekstury z alfą), są od razu odznaczone: drzewo koliduje pniem i gałęziami, nie koroną. Możesz to zmienić.
Powierzchnia decyduje o dźwięku kroków, iskrach przy strzale i śladach opon. Ustaw jedną dla całości albo inną dla każdego materiału, np. drewno dla podłogi i szkło dla okien. Powierzchnia działa w trybie „Siatka”; pudełka, otoczka i kula dostają powierzchnię domyślną.
Formaty i osie
- FBX (binarny i tekstowy): jednostki i oś pionowa z pliku, przekształcenia obiektów.
- OBJ, glTF, GLB: oś Y w górę zamieniana na Z w górę, jak w grze. glTF z przekształceniami węzłów.
- DFF z GTA SA: ramki RenderWare; pomija modele LOD (
_vlo), części uszkodzone (_dam) i koła. - 3DS, STL, PLY: współrzędne bez zmian, w metrach.
- COL: wrzuć gotowy plik
.col(COLL, COL2, COL3, COL4), żeby obejrzeć jego kolizję.
Jeden metr w grze to jedna jednostka. Model z Blendera zapisany w metrach ma od razu dobry rozmiar; podgląd pokazuje wymiary pod obrazem.
Bez pliku: kolizja liczona w grze
Ten sam generator jest w kliencie gry. engineReplaceModel bez pliku .col robi kolizję sam (do 12 000 trójkątów, bez przezroczystych materiałów). Własne ustawienia podajesz w engineGenerateCOL:
local mesh = engineLoadMesh(":moj_zasob/dom.fbx")
local col = engineGenerateCOL(mesh, { mode = "mesh", triangles = 2500, material = 43, skipTransparent = true })
if col then
engineReplaceCOL(col, 1337)
outputChatBox(("kolizja: %d z %d trojkatow, blad %.2f m"):format(col.generatedFaces, col.originalFaces, col.deviation or 0))
end
Gotowy plik jest lepszy dla dużych modeli: gra nie liczy nic przy wejściu na serwer, a Ty widzisz wynik przed wydaniem. Pod podglądem generatora jest gotowe wywołanie z Twoimi ustawieniami. Wszystkie opcje opisuje dokumentacja engineGenerateCOL.
Problemy
- Postać przechodzi przez ścianę: ściana jest za cienka albo za mało trójkątów. Zwiększ liczbę trójkątów albo pogrub ścianę w modelu.
- Postać wisi nad podłogą: sprawdź „największy błąd kształtu” i zwiększ liczbę trójkątów. W trybie „Otoczka” wnęki są zawsze zamknięte.
- Kolizja jest obok modelu: model ma przesunięty środek albo niezastosowane przekształcenia. W Blenderze: Object → Apply → All Transforms, potem eksport.
- „Model sięga dalej niż 255 m”: podziel model na kilka obiektów.
- Brakuje pliku .bin: zaznacz razem
.gltfi.binalbo zapisz model jako.glb.