12 KiB
WORLD
Interfejs do silnika fizycznego 3D zbudowanego na bibliotece Sekai — cienkiego wrappera Open Dynamics Engine (ODE). Świat zarządza ciałami sztywnymi, ich połączeniami i ścieżkami, oraz emituje siły, grawitację i tłumienia. Wersja 3D używana w grach Piklib. Pojęciowo odpowiednik INERTIA, ale z dostępem do trzeciej osi i własnym, znacznie szerszym API.
Każdy obiekt w świecie identyfikowany jest liczbą całkowitą (objectId). Świat ładowany jest z pliku .SEK, który zawiera definicje obiektów, ich parametrów fizycznych, siatek kolizyjnych, listy punktów na scenie oraz ich połączeń.
Typy geometrii
Wartości akceptowane przez parametr geomType metody ADDBODY:
| Wartość | Geometria |
|---|---|
0 |
prostopadłościan (box) |
1 |
cylinder |
2 |
sfera |
3 |
trimesh (siatka trójkątów; używana wyłącznie podczas ładowania z pliku .SEK) |
4 |
samochodzik (cztery koła + prostopadłościan) |
Pola
FILENAME
STRING FILENAME
Ścieżka do pliku .SEK z definicją świata fizycznego.
Metody
ADDBODY
void ADDBODY(INTEGER objectId, DOUBLE mass, DOUBLE mu, DOUBLE mu2,
DOUBLE bounce, DOUBLE bounceVelocity, DOUBLE maxVelocity,
INTEGER bodyType, INTEGER geomType,
DOUBLE dim1, DOUBLE dim2, DOUBLE dim3)
Tworzy w świecie nowe ciało fizyczne. Parametry mass, mu, mu2, bounce i bounceVelocity są mapowane bezpośrednio na odpowiednie parametry ODE: masa, tarcie, tarcie w drugim kierunku, wartość odbicia oraz minimalna prędkość wymagana do odbicia. maxVelocity ogranicza prędkość obiektu.
Wymiary dim1, dim2, dim3 zależą od geomType:
- box — długości w osiach X, Y, Z.
- cylinder —
dim1to promień,dim2wysokość;dim3ignorowane. - sfera —
dim1to promień;dim2idim3ignorowane.
Parametry
objectId— identyfikator nowego ciała.mass— masa obiektu.mu,mu2— współczynniki tarcia.bounce— wartość odbicia.bounceVelocity— minimalna prędkość wymagana do odbicia.maxVelocity— limit prędkości obiektu.bodyType— typ ciała (znaczenie zarezerwowane przez ODE).geomType— typ geometrii (zobacz Typy geometrii).dim1,dim2,dim3— wymiary obiektu zgodnie z geometrią.
Przykłady
WORLD^ADDBODY(100,10,0.0,10000.0,0.0,0.0,40000,1,2,30,16,16);
WORLD^ADDBODY(VARINT0,0.1,0.5,0.5,0.0,0.0,100000,1,2,16,16,16);
ADDFORCE
void ADDFORCE(INTEGER objectId, DOUBLE forceX, DOUBLE forceY, [DOUBLE forceZ])
Przykłada siłę do obiektu w trzech osiach. Pominięcie forceZ jest równoważne podaniu 0.0.
Parametry
objectId— identyfikator obiektu.forceX,forceY,forceZ— składowe siły.
Przykłady
WORLD^ADDFORCE(100,VARFORCEX,VARFORCEY,0);
WTEST^ADDFORCE(501,0,VARD_TMP1,0);
ADDGRAVITYEX
void ADDGRAVITYEX(INTEGER objectId, INTEGER secondObjectId, BOOL gravityEx)
Dodaje rozszerzoną grawitację pomiędzy dwoma obiektami. Pełne znaczenie nie zostało ustalone.
Przykłady
WTEST^ADDGRAVITYEX(VARI_ID,_I_,TRUE);
FINDPATH
void FINDPATH(INTEGER objectId, INTEGER pointObjectId,
INTEGER targetX, INTEGER targetY, INTEGER targetZ,
BOOL saveIntermediates, [BOOL flag])
Wyznacza ścieżkę dla obiektu między aktualną pozycją a punktem docelowym, korzystając z grafu nawigacyjnego załadowanego z pliku .SEK. Wynik jest zapamiętywany przez silnik fizyczny i wykorzystywany w kolejnych wywołaniach FOLLOWPATH.
Parametry
objectId— identyfikator obiektu, dla którego liczona jest ścieżka.pointObjectId— identyfikator punktu nawigacyjnego (zaczepu).targetX,targetY,targetZ— koordynaty punktu docelowego.saveIntermediates— gdyTRUE, zapamiętywane są punkty pośrednie ścieżki.flag— (opcjonalnie) flaga konfiguracyjna (znaczenie nieustalone).
Przykłady
WPATH^FINDPATH(100,VARIPATHID,$3,$4,0,TRUE,FALSE);
WPATH^FINDPATH(101,VARIPATHID,VARIKRETGOX,VARIKRETGOY,0,FALSE);
FOLLOWPATH
DOUBLE FOLLOWPATH(INTEGER objectId, INTEGER arrivalRadius, DOUBLE turnClamp, DOUBLE speed)
Przemieszcza obiekt wzdłuż ścieżki wyznaczonej wcześniej przez FINDPATH. Zwraca pozostały dystans do celu.
Parametry
objectId— identyfikator obiektu.arrivalRadius— promień, w którym obiekt uważany jest za zatrzymany przy celu.turnClamp— ograniczenie skrętu na jednym kroku.speed— prędkość ruchu.
Zwraca: DOUBLE — pozostały dystans.
Przykłady
WPATH^FOLLOWPATH(100,20,0.5,VARDMAXVEL);
WPATH^FOLLOWPATH(101,20,0.5,VARD_KRETSPEED);
GETANGLE
DOUBLE GETANGLE(INTEGER objectId)
Zwraca kąt wynikający z wektora prędkości obiektu (w stopniach).
Parametry
objectId— identyfikator obiektu.
Zwraca: DOUBLE — kąt w stopniach.
GETBKGPOSX
INTEGER GETBKGPOSX()
Zwraca pozycję X tła powiązanego ze światem fizycznym.
GETBKGPOSY
INTEGER GETBKGPOSY()
Zwraca pozycję Y tła powiązanego ze światem fizycznym.
GETMOVEDISTANCE
DOUBLE GETMOVEDISTANCE(INTEGER objectId)
Zwraca dystans pokonany przez obiekt od ostatniego resetu pomiaru.
Parametry
objectId— identyfikator obiektu.
GETPOSITIONX
INTEGER GETPOSITIONX(INTEGER objectId)
Zwraca pozycję X obiektu w układzie ekranu (po przesunięciu o +400 względem początku układu fizyki).
GETPOSITIONY
INTEGER GETPOSITIONY(INTEGER objectId)
Zwraca pozycję Y obiektu w układzie ekranu (z odwróconą osią — 300 - Y).
GETPOSITIONZ
INTEGER GETPOSITIONZ(INTEGER objectId)
Zwraca pozycję Z obiektu.
GETROTATIONZ
DOUBLE GETROTATIONZ(INTEGER objectId)
Zwraca kąt obrotu obiektu względem osi Z (w stopniach).
GETSPEED
DOUBLE GETSPEED(INTEGER objectId)
Zwraca prędkość obiektu (długość wektora prędkości liniowej).
JOIN
void JOIN(INTEGER firstId, INTEGER secondId,
DOUBLE anchorX, DOUBLE anchorY, DOUBLE anchorZ,
DOUBLE limitMotor, DOUBLE lowStop, DOUBLE highStop,
[DOUBLE hingeAxisX, DOUBLE hingeAxisY, DOUBLE hingeAxisZ])
Tworzy połączenie zawiasowe (hinge joint) pomiędzy dwoma ciałami. Opcjonalne argumenty wyznaczają oś obrotu — domyślnie (0, 0, 1).
Parametry
firstId,secondId— identyfikatory łączonych obiektów.anchorX,anchorY,anchorZ— punkt kotwiczenia połączenia.limitMotor— wartość siły potrzebna do zerwania połączenia.lowStop,highStop— graniczne kąty obrotu.hingeAxisX,hingeAxisY,hingeAxisZ— (opcjonalnie) oś obrotu.
Przykłady
WORLD^JOIN(199,200,400,300,0,0,-180,180);
WTEST^JOIN(VARI_ID,VARI_TMP1,VARI_X,VARI_TMP2,0,0,-180,180,0,1,0);
LINK
void LINK(INTEGER objectId, STRING objectName)
Wiąże ciało fizyczne ze zmienną ANIMO lub IMAGE — pozycja grafiki jest aktualizowana na podstawie pozycji ciała.
Parametry
objectId— identyfikator ciała.objectName— nazwa zmiennej graficznej.
Przykłady
WPATH^LINK(100,"ANNREX");
WORLD^LINK(VARINT0,VARSTRING0);
LOAD
void LOAD(STRING filename)
Resetuje silnik fizyczny i ładuje świat z pliku .SEK.
Parametry
filename— ścieżka do pliku.SEK.
Przykłady
WPATH^LOAD(SOBJECT|NAME);
MOVEOBJECTS
DOUBLE MOVEOBJECTS()
Wykonuje jeden krok symulacji i przesuwa wszystkie obiekty zgodnie z prawami fizyki. Zwraca czas, który upłynął w symulacji w tym kroku.
Zwraca: DOUBLE — czas symulacji.
Przykłady
WORLD^MOVEOBJECTS();
REMOVEOBJECT
void REMOVEOBJECT(INTEGER objectId)
Usuwa obiekt z silnika fizycznego.
Przykłady
WTEST^REMOVEOBJECT(60);
SETACTIVE
void SETACTIVE(INTEGER objectId, BOOL active, BOOL collidable)
Ustawia stan aktywności obiektu.
Parametry
objectId— identyfikator obiektu.active— czy obiekt podlega symulacji.collidable— czy obiekt bierze udział w wykrywaniu kolizji.
Przykłady
WPATH^SETACTIVE(VARI_3DPATHID,$1,$2);
SETBKGSIZE
void SETBKGSIZE(INTEGER leftX, INTEGER rightX, INTEGER topY, INTEGER bottomY)
Ustawia rozmiar prostokąta tła powiązanego ze światem.
SETG
void SETG(INTEGER objectId, DOUBLE g)
Ustawia indywidualną stałą grawitacyjną dla obiektu (modeluje magnesy). Domyślna wartość 0 oznacza brak przyciągania.
Parametry
objectId— identyfikator obiektu.g— stała grawitacyjna.
Przykłady
WTEST^SETG(VARI_ID,VARD_MAGNESREACT);
WTEST^SETG(501,-7000000);
SETGRAVITY
void SETGRAVITY(DOUBLE gravityX, DOUBLE gravityY, DOUBLE gravityZ)
Ustawia wektor grawitacji globalnej dla całego świata.
Parametry
gravityX,gravityY,gravityZ— składowe grawitacji.
Przykłady
WORLD^SETGRAVITY(0,0,-1000);
WORLD^SETGRAVITY(0,-15,0);
SETGRAVITYCENTER
void SETGRAVITYCENTER(INTEGER objectId, BOOL gravityCenter)
Włącza lub wyłącza traktowanie obiektu jako źródła centralnego pola grawitacyjnego.
Parametry
objectId— identyfikator obiektu.gravityCenter— flaga włączająca.
SETLIMIT
void SETLIMIT(INTEGER objectId, INTEGER minX, INTEGER minY, INTEGER minZ,
INTEGER maxX, INTEGER maxY, INTEGER maxZ)
Ustawia ograniczenie pozycji obiektu (prostopadłościenny obszar dozwolonego ruchu).
Parametry
objectId— identyfikator obiektu.minX,minY,minZ— dolne granice w trzech osiach.maxX,maxY,maxZ— górne granice w trzech osiach.
Przykłady
WORLD^SETLIMIT(100,0,0,0,800,600,999999);
SETMAXSPEED
void SETMAXSPEED(INTEGER objectId, INTEGER maxSpeed)
Ustawia maksymalną prędkość obiektu.
Przykłady
WORLD^SETMAXSPEED(100,200);
SETMOVEFLAGS
void SETMOVEFLAGS(BOOL moveX, BOOL moveY)
Włącza lub wyłącza ruch obiektu w osiach X i Y. Pełne znaczenie i kontekst zastosowania nie zostały ustalone.
Przykłady
WPATH^SETMOVEFLAGS(VARITEMP0,VARITEMP1);
SETPOSITION
void SETPOSITION(INTEGER objectId, DOUBLE x, DOUBLE y, DOUBLE z)
Ustawia bezwzględną pozycję obiektu (koordynaty w układzie ekranu — silnik przelicza je na układ fizyki).
Przykłady
WORLD^SETPOSITION(100,150,400,0);
WTEST^SETPOSITION(VARI_ID,VARI_X,VARI_Y,0);
SETREFOBJECT
void SETREFOBJECT(INTEGER objectId)
Ustawia obiekt jako referencyjny — używany przy obliczeniach pozycji względem niego.
Przykłady
WPATH^SETREFOBJECT(100);
SETVELOCITY
void SETVELOCITY(INTEGER objectId, DOUBLE speedX, DOUBLE speedY, DOUBLE speedZ)
Ustawia prędkość obiektu w trzech osiach.
Przykłady
WORLD^SETVELOCITY(207,5000000,0,0);
WORLD^SETVELOCITY(VARPLAYERID,0,0,0);
START
void START()
Uruchamia symulację (włącza timer silnika fizycznego).
Przykłady
WORLD^START();
STOP
void STOP()
Zatrzymuje symulację (wyłącza timer silnika fizycznego). Stan obiektów pozostaje zachowany.
Przykłady
WORLD^STOP();
UNLINK
void UNLINK(INTEGER objectId)
Zrywa powiązanie obiektu z animacją utworzone metodą LINK.
Przykłady
WTEST^UNLINK(VARI_TMP2);
Sygnały
ONINIT
Wywoływany w momencie inicjalizacji obiektu.
ONSIGNAL
Wywoływany po otrzymaniu sygnału (zobacz Zdarzenia i sygnały).