不一定是实现起来最简单的,但是理解起来很简单的一种方案

如何判断一个玩家在一个长方体内

1.思路解析

我们有的时候需要判断一个人是否在一个长方体内,比如魔改一个人物,有释放结界的能力,把矩形结界内的敌人困住。在这个问题上可以使用范围内玩家,但是不可能全部包含的住一个矩形范围(有可能大, 也有可能小)。这个时候就需要使用这个知识点了。

如果要判断一个点(玩家)是否在长方体内,只需要这个点在3组平行平面的同一侧,分别是(前后, 左右, 上下)。怎么判断呢?利用如图所示中的与法线的夹角,当一个点(如图1-1中点B)在左右面的同一侧时,与法线的夹角都是锐角或钝角;当一个点(如图1-1中点A)在左右面的不同侧时,与法线的夹角必定一个为锐角一个为钝角;实际上,我们不需要判断角度,我们只需要判断余弦值的符号即可.

但是OW没有提供直接计算的功能函数,所以我们可以使用【向量】指定法线方向和玩家到顶点的方向矢量,使用矢量间夹角计算两个矢量之间的夹角,因为有可能是负数,所以使用绝对值计算其余弦值。如果两个余弦值相乘小于0(一个是锐角,一个是钝角)则在规定范围内,否则就不在.

  • 图1 - 1

图1-1
预览

2.代码(带有注释):

规则("// 判断一个玩家是否在规定长方体内部(任意方向的长方体)")
{
	事件
	{
		持续 - 每名玩家;
		双方;
		全部;
	}
	
	条件
	{
		按钮被按下(事件玩家, 按钮(互动)) == 真;
        事件玩家.Z == 假;
	}

	动作
	{
		"// 在玩家前方生成一个矩阵,随后判定范围在这个矩阵中(示例中高度没有判定, 默认是无限高的一个长方体)"
		创建光束效果(事件玩家, 有害光束, 地图矢量(矢量(-5, 0, 3), 事件玩家, 旋转并转换), 地图矢量(矢量(5, 0, 3), 事件玩家, 旋转并转换), 颜色(红色), 可见);
		创建光束效果(事件玩家, 有害光束, 地图矢量(矢量(-5, 0, 13), 事件玩家, 旋转并转换), 地图矢量(矢量(5, 0, 13), 事件玩家, 旋转并转换), 颜色(红色), 可见);
		创建光束效果(事件玩家, 有害光束, 地图矢量(矢量(-5, 0, 3), 事件玩家, 旋转并转换), 地图矢量(矢量(-5, 0, 13), 事件玩家, 旋转并转换), 颜色(红色), 可见);
		创建光束效果(事件玩家, 有害光束, 地图矢量(矢量(5, 0, 3), 事件玩家, 旋转并转换), 地图矢量(矢量(5, 0, 13), 事件玩家, 旋转并转换), 颜色(红色), 可见);
		"// 将矩阵左下角的点放进A变量中(注意: 把矩阵想象成平面图)"
		事件玩家.A = 地图矢量(矢量(-5, 0, 3), 事件玩家, 旋转并转换);
		"// 右下角"
		事件玩家.B = 地图矢量(矢量(5, 0, 3), 事件玩家, 旋转并转换);
		"// 左上角"
		事件玩家.C = 地图矢量(矢量(-5, 0, 13), 事件玩家, 旋转并转换);
		"// 这是一个方向矢量, 代表从矩阵左下角指向右下角"
		事件玩家.D = 向量(事件玩家.A, 事件玩家.B);
		"// 右下角指向右边, 保持与D变量中向量方向相同, 矢量中的X坐标只要大于5就行"
		事件玩家.E = 向量(事件玩家.B, 地图矢量(矢量(15, 0, 3), 事件玩家, 旋转并转换));
		"// 左下角指向左上角"
		事件玩家.F = 向量(事件玩家.A, 事件玩家.C);
		"// 左上角指向上方, 道理与右下角指向右边一样"
		事件玩家.G = 向量(事件玩家.C, 地图矢量(矢量(-5, 0, 23), 事件玩家, 旋转并转换));
		事件玩家.Z = 真;
	}
}

规则("// 判断一个玩家是否在规定长方体内部(任意方向的长方体)")
{
	事件
	{
		持续 - 每名玩家;
		双方;
		全部;
	}
	
	条件
	{
		按钮被按下(事件玩家, 按钮(互动)) == 真;
        事件玩家.Z == 真;
	}

	动作
	{
		"// 获取当前玩家到矩阵左下角的水平方向"
		事件玩家.H = 向量(所选位置(事件玩家), 事件玩家.A);
		"// 同上, 只是点不同"
		事件玩家.I = 向量(所选位置(事件玩家), 事件玩家.B);
		"// 同上, 只是点不同"
		事件玩家.J = 向量(所选位置(事件玩家), 事件玩家.C);
		"// 如果这个点与左下角和右下角的角度一个是锐角一个是钝角, 则在这个左右边界之间, 如果同为锐角或同为钝角, 则在左右边界之外"
		事件玩家.K = 
		角度的余弦值(绝对值(矢量间夹角(事件玩家.D, 事件玩家.H))) * 角度的余弦值(绝对值(矢量间夹角(事件玩家.E, 事件玩家.I))) < 0 &&
		角度的余弦值(绝对值(矢量间夹角(事件玩家.F, 事件玩家.H))) * 角度的余弦值(绝对值(矢量间夹角(事件玩家.G, 事件玩家.J))) < 0;
		小字体信息(事件玩家, 事件玩家.K);
	}
}

3. 注意

由于地图工坊文本不能编辑, 游戏内无注释信息, 具体注释请看文档

思路来源:CSDN

评论
这里空空如也~
这里空空如也~