Raycasting

Výsledky raycastu

Vysvětluje managed fields a bezpečné rozlišení zásahu, minutí a chyby.

Běžný closest-hit dotaz vrací úplný managed struct. Časná high-level validační chyba může vrátit pouze minimální {hit:false}, proto musí být jolt_get_error() přečteno ihned po volání, ještě než se použijí volitelná result fields.

Closest-hit výsledek nyní obsahuje také ray:{world,origin,target} při platném zásahu i minutí. Do JoltRenderSurface.set_touch_raycast() předávejte celý čerstvý výsledek, nikdy result.hit. Kontaktní pole stále vyžadují hit=true; při časné chybě validace mohou metadata ray chybět.

Fields běžného closest-hit výsledku#

FieldTypVýznam
hitBooleantrue, když bylo zasaženo spravované rigid body.
bodyJoltBody | undefinedNamapovaný JoltBody, nebo undefined při minutí či neúspěšném mapování.
body_handleRealNeprůhledný veřejný generational body handle rozšíření; nejde o Jolt BodyID.
entityAnyAktuální hodnota JoltBody.user_data, nebo undefined.
positionStruct {x:Real, y:Real, z:Real}World-space bod zásahu {x,y,z} ve veřejném Z-up systému.
normalStruct {x:Real, y:Real, z:Real}World-space normála povrchu {x,y,z} ve veřejném Z-up systému.
fractionRealNormalizovaná poloha na úsečce, běžně od 0 do 1.
distanceRealWorld-space vzdálenost od počátku.
error_codeRealStav nativního výsledku běžného low-level dotazu.
error_messageStringNativní zpráva; prázdná při platném zásahu nebo minutí.

Rozhodující kontrola stavu#

GML
var result = jolt_raycast(x1, y1, z1, x2, y2, z2, filter);
var error = jolt_get_error(); // Přečtěte před dalším Jolt voláním.

if (error.code != JOLT_ERROR_NONE) {
    show_debug_message(error.context + ": " + error.message);
}
else if (!result.hit) {
    // Platné minutí. Nepoužívejte contact fields jako zásah.
}
else {
    var point = result.position;
    var normal = result.normal;
    var body = result.body;
    var data = result.entity;
}

Stavy výsledku#

StavRozpoznání
Closest hitjolt_get_error().code je NONE a result.hit je true.
Closest missError code je NONE a result.hit je false.
Closest errorjolt_get_error().code je nenulový; result může obsahovat pouze hit=false.
All-hit successError code je NONE; pole může obsahovat nula nebo více hits.
All-hit errorError code je nenulový; vrácené pole je prázdné.

Fraction a distance#

Pro endpoint formu je maximální vzdáleností délka od origin k endpointu. distance se rovná fraction vynásobené touto délkou. position již obsahuje world-space bod, takže jej obvykle není nutné dopočítávat.

Body, handle a user data#

Native body ukládá veřejný handle rozšíření ve svém user-data slotu. Wrapper ověří handle proti managed registry, zpřístupní jej jako body_handle, namapuje body na JoltBody a poté zkopíruje JoltBody.user_data do entity. entity patří volajícímu a nemusí jít o GameMaker instance.

Fields, které nejsou dostupné#

  • Jolt BodyID
  • SubShapeID nebo compound child
  • Triangle nebo face index
  • Physics material
  • Motion type, layer nebo sensor flag

Low-level result struct#

GML
{
    hit, error_code, error_message, body,
    x, y, z,
    normal_x, normal_y, normal_z,
    fraction, distance,
    position, normal
}

Low-level body je číselný veřejný handle rozšíření. Managed forma jej namapuje na JoltBody a číslo zachová jako body_handle.

Nové související postupy#