lineIntersectsSurfaces: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - ": *<code>" to ": <code>")
m (Text replacement - "<code>([^ ]*)\[\[([a-zA-Z][a-zA-Z0-9_]+)\]\]([^ ]*)<\/code>" to "<code>$1$2$3</code>")
Line 49: Line 49:
* parentObject - the object proxy object belongs to (not always the same as intersect object) - [[objNull]] if terrain
* parentObject - the object proxy object belongs to (not always the same as intersect object) - [[objNull]] if terrain


|x1= <code>_intersections = [[lineIntersectsSurfaces]] [<nowiki/>[[eyePos]] [[player]], [[aimPos]] chopper, [[player]], chopper, [[true]], -1];</code>
|x1= <code>_intersections = lineIntersectsSurfaces [<nowiki/>[[eyePos]] [[player]], [[aimPos]] chopper, [[player]], chopper, [[true]], -1];</code>


|x2= <code>arrow = "Sign_Arrow_F" [[createVehicle]] [0,0,0];
|x2= <code>arrow = "Sign_Arrow_F" [[createVehicle]] [0,0,0];

Revision as of 12:10, 12 May 2022

Hover & click on the images for description

Description

Description:
Returns a list of intersections with surfaces and ground from begPosASL to endPosASL. Doesn't return intersection with sea surface. Works underwater, unlike lineIntersects. Hardcoded max distance: 5000m.
  • if begPosASL is under the ground and endPosASL is above it, the command will only return intersection with the ground, this is an engine limitation and none of the intersectXXX commands will work when initiated from under the ground.
  • only a single LOD is checked for intersection. LOD2 will only be checked if LOD1 is unavailable.
Groups:
Math - Geometry

Syntax

Syntax:
lineIntersectsSurfaces [begPosASL, endPosASL, ignoreObj1, ignoreObj2, sortMode, maxResults, LOD1, LOD2, returnUnique]
Parameters:
begPosASL: Array format PositionASL - virtual line start
endPosASL: Array format PositionASL - virtual line end
ignoreObj1: Object - (Optional, default objNull) first object to ignore
ignoreObj2: Object - (Optional, default objNull) second object to ignore
sortMode: Boolean - (Optional, default true) true: closest to furthest, false: furthest to closest
maxResults: Number - (Optional, default 1) max results to return. -1 to return every result
since Arma 3 logo black.png1.52
LOD1: String - (Optional, default "VIEW") primary LOD to look for intersection. Can be one of:
  • "FIRE"
  • "VIEW"
  • "GEOM"
  • "IFIRE" - ("I" stands for Indirect, almost identical to "FIRE")
  • "NONE"
  • Arma 3 logo black.png2.02 "PHYSX" - PhysX geometry LOD
  • Arma 3 logo black.png2.08 "ROADWAY" - only works from the top
since Arma 3 logo black.png1.52
LOD2: String - (Optional, default "FIRE") secondary LOD to look for intersection. See LOD1 for possible values
since Arma 3 logo black.png1.70
returnUnique: Boolean - (Optional, default true) when false, all intersections in the same object are included, otherwise only the first one
Return Value:
Array of intersections in format [[intersectPosASL, surfaceNormal, intersectObj, parentObject], ...] where:
  • intersectPosASL - the actual position where line intersects surface
  • surfaceNormal - a normal to the intersected surface
  • intersectObject - the object the surface belongs to (could be proxy object) - objNull if terrain
  • parentObject - the object proxy object belongs to (not always the same as intersect object) - objNull if terrain

Examples

Example 1:
_intersections = lineIntersectsSurfaces [eyePos player, aimPos chopper, player, chopper, true, -1];
Example 2:
arrow = "Sign_Arrow_F" createVehicle [0,0,0]; onEachFrame { _ins = lineIntersectsSurfaces [ AGLToASL positionCameraToWorld [0,0,0], AGLToASL positionCameraToWorld [0,0,1000], player ]; if (count _ins == 0) exitWith { arrow setPosASL [0,0,0] }; arrow setPosASL (_ins select 0 select 0); arrow setVectorUp (_ins select 0 select 1); hintSilent str _ins; };
Example 3:
This should detect glass windows and wire fences (since Arma v1.52): wirefence = "Land_New_WiredFence_5m_F" createVehicle position player; arrow = "Sign_Arrow_F" createVehicle [0,0,0]; onEachFrame { _ins = lineIntersectsSurfaces [ AGLToASL positionCameraToWorld [0,0,0], AGLToASL positionCameraToWorld [0,0,1000], player, objNull, true, 1, "GEOM", "NONE" ]; if (count _ins == 0) exitWith { arrow setPosASL [0,0,0] }; arrow setPosASL (_ins select 0 select 0); arrow setVectorUp (_ins select 0 select 1); hintSilent str _ins; };

Additional Information

See also:
lineIntersectsWith lineIntersectsObjs terrainIntersect terrainIntersectASL terrainIntersectAtASL lineIntersects intersect cursorObject cursorTarget checkVisibility

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
Killzone_Kid - c
Posted on Aug 27, 2015 - 12:44 (UTC)
Fast check if the player is in a house: KK_fnc_inHouse = { lineIntersectsSurfaces [ getPosWorld _this, getPosWorld _this vectorAdd [0, 0, 50], _this, objNull, true, 1, "GEOM", "NONE" ] select 0 params ["","","","_house"]; if (_house isKindOf "House") exitWith { true }; false }; onEachFrame { hintSilent str (player call KK_fnc_inHouse) };
Pierre MGI - c
Posted on Jan 30, 2016 - 20:10 (UTC)
This command is useful to place weaponholder (and then spawned weapons) on floor of houses, correcting the spawn position (can_collide) to intersect with floor: MGI_fnc_setPosAGLS = { params ["_obj", "_pos"]; _wh_pos = getPosASL _obj; _pos set [2, (ATLtoASL _pos select 2) - 10]; _ins = lineIntersectsSurfaces [_wh_pos, _pos,_obj, objNull, true, 1, "VIEW", "FIRE"]; _surface_distance = if (count _ins > 0) then [{ (_ins select 0 select 0) distance _wh_pos }, { 0 }]; _wh_pos set [2, (getPosASL _obj select 2) - (_surface_distance)]; _weaponholder setPosASL _wh_pos; }; After the position (_pos) obtained in BIS_fnc_buidingPositions array: private _weaponHolder = createVehicle ["groundWeaponHolder", _pos, [], 0, "CAN_COLLIDE"]; [_weaponHolder, _pos] call MGI_fnc_setPosAGLS; Then fill your weapon holder.