萝卜说 - 罗布乐思 - 口袋核心

查看: 793|回复: 7

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

[复制链接]

0

收听

0

听众

59

帖子

正式用户

Rank: 1

萝卜币
101
发表于 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值,从而计算出角度,角度小于给定角度的一半,就可判断物体在范围内了。
如果加上判断距离的,就是真正的扇形了。


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

收听

0

听众

46

帖子

正式用户

Rank: 1

萝卜币
82
发表于 2021-5-31 12:07:53 | 显示全部楼层
GetVector3Dot 直接用 Vector3:Dot(other) 就可以。
如果我不知道前面有没有物体 有没有办法可以获取到,比如直接返回我前方 给定距离 给定夹角范围内的对象列表。
回复

使用道具 举报

0

收听

0

听众

49

帖子

正式用户

Rank: 1

萝卜币
84
发表于 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的判定等等。
回复

使用道具 举报

0

收听

0

听众

51

帖子

正式用户

Rank: 1

萝卜币
69
发表于 2021-5-31 12:08:48 | 显示全部楼层
不错~~ 回头试试
回复

使用道具 举报

0

收听

0

听众

47

帖子

正式用户

Rank: 1

萝卜币
69
发表于 2021-5-31 12:09:23 | 显示全部楼层
666,谢谢大佬分享
回复

使用道具 举报

0

收听

0

听众

45

帖子

正式用户

Rank: 1

萝卜币
61
发表于 2021-5-31 12:09:51 | 显示全部楼层
谢谢 在群里收到你的回复了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

收听

0

听众

35

帖子

正式用户

Rank: 1

萝卜币
52
发表于 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
回复

使用道具 举报

0

收听

0

听众

46

帖子

正式用户

Rank: 1

萝卜币
65
发表于 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))
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| |京公网安备11010502045240号

Copyright © 2001-2013 Comsenz Inc.   All Rights Reserved.

Powered by Discuz! X3.4  备案:京ICP备2021013067号-2

快速回复 返回顶部 返回列表