Minecraft(我的世界)中文论坛

标题: 任意多面体选择范围

作者: ruhuasiyu    时间: 2018-5-27 13:05
标题: 任意多面体选择范围
我们知道目标选择器提供了相对xyz轴平行的长方体区域的选取,如果我们想要任意多面体区域,或者玩家本地坐标下的区域时,我们可以利用如下性质:
任意平面上的有界区域,做过其中一点与该平面相切的球。当球的半径越来越大时,球面上投射到该区域的部分越来越接近该区域。

所以我们可以用球去夹出一个多面体区域来。具体而言,对于每个多边形,首先确定其法线,然后选择充分大的半径,例如1000000,然后任选多边形上一点,计算在该点相切的球的球心。注意要让球心在多面体区域外。然后给所有实体添加tag,移除各个球内的实体tag即可。

例如:选择玩家视野前方±30°角内,高为10米的的正四棱锥区域内实体。
首先
  1. execute positioned ^ ^ ^-10000 run tag @e[distance=..10010] add temp
复制代码
我们假设玩家朝向正南方(z+),则该四棱锥的底面的顶点是A=(10 tan30°,0,10)、B=(0,-10 tan30°,10)、C=(-10 tan30°,0,10)、D=(0,10 tan30°,10)。
计算法线,例如OAB(逆时针方向向正四棱锥外),
|i               j             k |
|10 tan30°  0           10|=57.7 i-57.7 j -33.33 k=(57.7,-57.7,-33.33)
|0         -10 tan30°   10|
假设球心为 (17320.50808,-17320.50808,-10000),半径为26457.5131,于是
  1. execute positioned ^17320.50808 ^-17320.50808 ^-10000 run tag @e[distance=..26457.5131] remove temp
复制代码
类似地处理其它四个面
  1. execute positioned ^-17320.50808 ^-17320.50808 ^-10000 run tag @e[distance=..26457.5131] remove temp
  2. execute positioned ^17320.50808 ^17320.50808 ^-10000 run tag @e[distance=..26457.5131] remove temp
  3. execute positioned ^-17320.50808 ^17320.50808 ^-10000 run tag @e[distance=..26457.5131] remove temp
复制代码
即可。
代码未经测试,如需使用请自行测试。




作者: langyo_v3    时间: 2018-5-27 14:57
本帖最后由 langyo_v3 于 2018-5-27 15:02 编辑

灵感很好



作者: chyx    时间: 2018-5-27 16:05
emmmm
我随便生成两个药水云 我让待探测实体选择这俩药水云中近的那个


根据选中的是哪一个可以判定出在药水云中垂面的那一侧

如果是凸多面体 可以对每个面使用这个方法来判断吧
作者: ruhuasiyu    时间: 2018-5-27 20:24
chyx 发表于 2018-5-27 16:05
emmmm
我随便生成两个药水云 我让待探测实体选择这俩药水云中近的那个

可以是可以,但是没这个必要吧?
凸多面体的每个面上选择两个向量,右手向外即可计算出向外的法向啊
作者: chyx    时间: 2018-5-28 00:31
ruhuasiyu 发表于 2018-5-27 20:24
可以是可以,但是没这个必要吧?
凸多面体的每个面上选择两个向量,右手向外即可计算出向外的法向啊 ...

没啥啦 只是个人不太喜欢在很远的区块里放置实体啦

总觉得不保险。。。
作者: ruhuasiyu    时间: 2018-5-28 01:51
chyx 发表于 2018-5-28 00:31
没啥啦 只是个人不太喜欢在很远的区块里放置实体啦

总觉得不保险。。。 ...

不用放实体啊,只是个position
作者: 丢人素学姐    时间: 2018-5-29 20:20
计算几何玩得6啊
作者: BlackCB.    时间: 2018-6-26 22:46
跟不上了==
丢脸