我好人二三搅 发表于 2021-5-31 12:06:58

扇形计算法,可用于判断攻击方向,前方是否有玩家等等

下方是源代码,带有注释:
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值,从而计算出角度,角度小于给定角度的一半,就可判断物体在范围内了。
如果加上判断距离的,就是真正的扇形了。


建议直接按照注释拿来使用。

匣中剑他娘官 发表于 2021-5-31 12:07:53

GetVector3Dot 直接用 Vector3:Dot(other) 就可以。
如果我不知道前面有没有物体 有没有办法可以获取到,比如直接返回我前方 给定距离 给定夹角范围内的对象列表。

天亮再走己 发表于 2021-5-31 12:08:35

可以的,把需要检测的物体放进一个文件夹,
local part = script.Parent
local this = {}
for k,v in pairs(文件夹:GetChildren()) do
–这里写的是获取v和part的距离
if 距离<15 and aradius(ros1,ros2,pos1,pos2,r,angle) then--如果小于15距离和在夹角范围内
–将v存进this表里
end
end
–最后this表就是在范围的对象了,如果对象是分组的模型,那就得加上ClassName的判定等等。

haranN 发表于 2021-5-31 12:08:48

不错~~ 回头试试

就放荡不羁就h 发表于 2021-5-31 12:09:23

666,谢谢大佬分享

静美人2017 发表于 2021-5-31 12:09:51

谢谢 在群里收到你的回复了

因为我是真真 发表于 2021-5-31 12:10:37

上面的代码有一些小缺陷,这是完美版的扇形检测代码
   function GetVector3Dot(v1, v2) --计算向量       return v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z   end   function skill.aradius(ros1,ros2,pos1,pos2,r,angle)      --r是扇形半径,angle是角度      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/math.sqrt(pos.X*pos.X+pos.Y*pos.Y+pos.Z*pos.Z)      local possuc = Vector3.new(poss.X,0,poss.Z)      local cos = skill.GetVector3Dot(v1, possuc)      local j = math.acos(cos)      local jd = j*180/math.pi      return jd < angle/2    end

雪域蓝眸蓝nz 发表于 2021-5-31 12:10:45

分享另一种方法,获取部件A与部件B的角度差。 正面是0度, 正侧面是90度 反面是180度。
--玩家角色朝向(部件A所面对的方向)local AFacing = Character.HumanoidRootPart.CFrame.LookVector--从部件A到部件B的方向local Vector = (PartB.Position - Character.HumanoidRootPart.Position).unit--弧度local Angle = math.acos(AFacing:Dot(Vector))--输出角度差print(math.deg(Angle))
页: [1]
查看完整版本: 扇形计算法,可用于判断攻击方向,前方是否有玩家等等