lineIntersectsSurfaces: Difference between revisions
Jump to navigation
Jump to search
Lou Montana (talk | contribs) m (Text replacement - "<code>([^<]*)\[\[([a-zA-Z][a-zA-Z0-9_]+)\]\]([^<]*) *<\/code>" to "<code>$1$2$3</code>") |
m (Replaced <code> with <sqf>) |
||
(28 intermediate revisions by one other user not shown) | |||
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= < | |x1= <sqf>_intersections = lineIntersectsSurfaces [eyePos player, aimPos chopper, player, chopper, true, -1];</sqf> | ||
|x2= < | |x2= <sqf>arrow = "Sign_Arrow_F" createVehicle [0,0,0]; | ||
onEachFrame { | |||
_ins = | _ins = lineIntersectsSurfaces [ | ||
AGLToASL positionCameraToWorld [0,0,0], | |||
AGLToASL positionCameraToWorld [0,0,1000], | |||
player | |||
]; | ]; | ||
if (count _ins == 0) exitWith { arrow setPosASL [0,0,0] }; | |||
arrow | arrow setPosASL (_ins select 0 select 0); | ||
arrow | arrow setVectorUp (_ins select 0 select 1); | ||
hintSilent str _ins; | |||
};</ | };</sqf> | ||
|x3= This should detect glass windows and wire fences (since Arma v1.52): | |x3= This should detect glass windows and wire fences (since Arma v1.52): | ||
< | <sqf> | ||
arrow = "Sign_Arrow_F" | wirefence = "Land_New_WiredFence_5m_F" createVehicle position player; | ||
arrow = "Sign_Arrow_F" createVehicle [0,0,0]; | |||
_ins = | onEachFrame { | ||
_ins = lineIntersectsSurfaces [ | |||
AGLToASL positionCameraToWorld [0,0,0], | |||
AGLToASL positionCameraToWorld [0,0,1000], | |||
player, | |||
objNull, | |||
true, | |||
1, | 1, | ||
"GEOM", | "GEOM", | ||
"NONE" | "NONE" | ||
]; | ]; | ||
if (count _ins == 0) exitWith { arrow setPosASL [0,0,0] }; | |||
arrow | arrow setPosASL (_ins select 0 select 0); | ||
arrow | arrow setVectorUp (_ins select 0 select 1); | ||
hintSilent str _ins; | |||
};</ | }; | ||
</sqf> | |||
|seealso= [[lineIntersectsWith]] [[lineIntersectsObjs]] [[terrainIntersect]] [[terrainIntersectASL]] [[terrainIntersectAtASL]] [[lineIntersects]] [[intersect]] [[cursorObject]] [[cursorTarget]] [[checkVisibility]] | |seealso= [[lineIntersectsWith]] [[lineIntersectsObjs]] [[terrainIntersect]] [[terrainIntersectASL]] [[terrainIntersectAtASL]] [[lineIntersects]] [[intersect]] [[cursorObject]] [[cursorTarget]] [[checkVisibility]] | ||
Line 91: | Line 93: | ||
|timestamp= 20150827124400 | |timestamp= 20150827124400 | ||
|text= Fast check if the player is in a house: | |text= Fast check if the player is in a house: | ||
< | <sqf>KK_fnc_inHouse = { | ||
lineIntersectsSurfaces [ | lineIntersectsSurfaces [ | ||
getPosWorld _this, | |||
getPosWorld _this vectorAdd [0, 0, 50], | |||
_this, | _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) };</ | onEachFrame { hintSilent str (player call KK_fnc_inHouse) };</sqf> | ||
}} | }} | ||
Line 107: | Line 109: | ||
|timestamp= 20160130201000 | |timestamp= 20160130201000 | ||
|text= 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: | |text= 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: | ||
< | <sqf>MGI_fnc_setPosAGLS = { | ||
params ["_obj", "_pos"]; | params ["_obj", "_pos"]; | ||
_wh_pos = | _wh_pos = getPosASL _obj; | ||
_pos | _pos set [2, (ATLtoASL _pos select 2) - 10]; | ||
_ins = | _ins = lineIntersectsSurfaces [_wh_pos, _pos,_obj, objNull, true, 1, "VIEW", "FIRE"]; | ||
_surface_distance = | _surface_distance = if (count _ins > 0) then [{ (_ins select 0 select 0) distance _wh_pos }, { 0 }]; | ||
_wh_pos | _wh_pos set [2, (getPosASL _obj select 2) - (_surface_distance)]; | ||
_weaponholder | _weaponholder setPosASL _wh_pos; | ||
};</ | };</sqf> | ||
After the position (_pos) obtained in BIS_fnc_buidingPositions array: | After the position (_pos) obtained in BIS_fnc_buidingPositions array: | ||
< | <sqf>private _weaponHolder = createVehicle ["groundWeaponHolder", _pos, [], 0, "CAN_COLLIDE"]; | ||
[_weaponHolder, _pos] call MGI_fnc_setPosAGLS;</ | [_weaponHolder, _pos] call MGI_fnc_setPosAGLS;</sqf> | ||
Then fill your weapon holder. | Then fill your weapon holder. | ||
}} | }} |
Revision as of 16:06, 14 May 2022
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.
- 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 1.52
- LOD1: String - (Optional, default "VIEW") primary LOD to look for intersection. Can be one of:
- since 1.52
- LOD2: String - (Optional, default "FIRE") secondary LOD to look for intersection. See LOD1 for possible values
- since 1.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:
- 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
- Posted on Aug 27, 2015 - 12:44 (UTC)
- Fast check if the player is in a house:
- 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:
After the position (_pos) obtained in BIS_fnc_buidingPositions array: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; };Then fill your weapon holder.private _weaponHolder = createVehicle ["groundWeaponHolder", _pos, [], 0, "CAN_COLLIDE"]; [_weaponHolder, _pos] call MGI_fnc_setPosAGLS;