下方是源代码,带有注释:
function GetVector3Dot(v1, v2) --计算向量
return v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z
end
function aradius(ros1,ros2,pos1,pos2,r,angle)
--r是扇形半径,angle是角度,要表示在前方,角度为180度就行了
--ros1是物体1的朝向(Orientation),ros2是物体2的朝向(Orientation),pos1是物体1坐标,pos2是物体2坐标
local t0 = ros1.Y
local t = t0*math.pi/180 --玩家当前朝向于z轴正向夹角
local v1 = Vector3.new(math.sin(t),0,math.cos(t))*(-1) --玩家本身单位向量
local pos = pos2 - pos1
local poss = pos/(pos.X*pos.X+pos.Y*pos.Y+pos.Z*pos.Z)
local possuc = Vector3.new(poss.X,0,poss.Z)
local cos = GetVector3Dot(v1, possuc)/(angle*angle)
local j = math.acos(cos)
local jd = j*180/math.pi
if jd < angle/2 then
return true
--在范围内返回true
else
return false
end
end
--后面判断true或者false,如果是true证明物体在前面
逻辑计算大概就是,以part1为原点,给一个范围角度,计算part1向前的方向向量(单位向量),然后计算part1和part2的方向向量,高中学过,有两个点的坐标就可以计算出向量坐标,从而计算出单位向量,然后使用数量积,可以计算出part1向前单位向量和两部件方向向量的cos值,从而计算出角度,角度小于给定角度的一半,就可判断物体在范围内了。
如果加上判断距离的,就是真正的扇形了。
建议直接按照注释拿来使用。