lineIntersectsSurfaces: Difference between revisions
Jump to navigation
Jump to search
Lou Montana (talk | contribs) m (Text replacement - "\| *arma3 * * *\| *([0-2]\.[0-9]{2}) * " to "|game1= arma3 |version1= $1 ") |
Lou Montana (talk | contribs) m (Text replacement - "</dd> <dt></dt>" to "</dd> <dt></dt>") |
||
Line 94: | Line 94: | ||
[[onEachFrame]] {[[hintSilent]] [[str]] ([[player]] [[call]] KK_fnc_inHouse)};</code> | [[onEachFrame]] {[[hintSilent]] [[str]] ([[player]] [[call]] KK_fnc_inHouse)};</code> | ||
</dd> | </dd> | ||
<dt></dt> | <dt></dt> | ||
<dd class="notedate">Posted on January 30, 2016 - 20:10 (UTC)</dd> | <dd class="notedate">Posted on January 30, 2016 - 20:10 (UTC)</dd> |
Revision as of 15:03, 19 June 2021
Description
- Description:
- Returns list of intersections with surfaces from begPosASL to endPosASL. If there is ground intersection, it is also included. Works on units. Works underwater. Doesn't return intersection with sea surface. Hardcoded max distance: 5000m. By default, for speed purposes, command will return only 1st intersection with unique objects. Since Arma 3 v1.70, this could be tweaked with an optional param.
Since Arma v1.52 it is possible to indicate primary and secondary LOD to look for intersection. Available options are:
- "FIRE"
- "VIEW"
- "GEOM"
- "IFIRE" - ("I" stands for Indirect, practically the same as FIRE)
- "NONE"
- "PHYSX" - PhysX geometry LOD (since Arma 3 v2.01.146666)
Default LODs are "VIEW" and "FIRE"
- Groups:
- Math - Geometry
Syntax
- Syntax:
- lineIntersectsSurfaces [begPosASL, endPosASL, ignoreObj1, ignoreObj2, sortMode, maxResults, LOD1, LOD2, returnUnique]
- Parameters:
- [begPosASL, endPosASL, ignoreObj1, ignoreObj2, sortMode, maxResults, LOD1, LOD2]: Array
- begPosASL: PositionASL - virtual line start
- endPosASL: PositionASL - virtual line end
- ignoreObj1 (Optional): Object - first object to ignore or objNull: Default: objNull
- ignoreObj2 (Optional): Object - second object to ignore or objNull: Default: objNull
- sortMode (Optional): Boolean - true: closest to furthest, false: furthest to closest. Default: true
- maxResults (Optional): Number - Max results to return. -1 to return every result. Default: 1
- LOD1 (Optional): String (added in v1.52) - Primary LOD to look for intersection. Default: "VIEW"
- LOD2 (Optional): String (added in v1.52) - Secondary LOD to look for intersection. Default: "FIRE"
- returnUnique (Optional): Boolean (added in v1.70) - When false, all intersections in the same object are included not just the 1st one. Default: true
- 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:
- lineIntersectsWithlineIntersectsObjsterrainIntersectterrainIntersectASLterrainIntersectAtASLlineIntersectsintersectcursorObjectcursorTargetcheckVisibility
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
- Posted on August 27, 2015 - 12:44 (UTC)
- Killzone Kid
-
Fast check if object 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)};
- Posted on January 30, 2016 - 20:10 (UTC)
- Pierre MGI
-
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:_weaponholder = createVehicle ["groundWeaponHolder", _pos, [], 0, "CAN_COLLIDE"]; [_weaponholder,_pos] call MGI_fnc_setPosAGLS; Then fill your weapon holder.