UE5中3x3x3立方体阵列起点到终点的途经立方体数量计算方法
3x3x3立方体阵列途经Actor数量计算方案(Unreal Engine)
核心思路
用3D版Bresenham算法遍历起点到终点直线经过的所有网格坐标,每个坐标对应一个立方体Actor,统计遍历到的坐标总数即可得到途经的立方体数量。
具体实现步骤
- 给立方体绑定网格坐标:在立方体蓝图中添加三个整数变量
XGrid、YGrid、ZGrid,放置阵列时给每个立方体设置对应的三维坐标值(比如从(0,0,0)到(2,2,2))。 - 获取起点终点的网格坐标:通过射线投射或直接引用起点(绿色)、终点(红色)Actor,读取它们的
XGrid、YGrid、ZGrid值,记为Start(Xs,Ys,Zs)和End(Xe,Ye,Ze)。 - 实现3D Bresenham算法计数:
- 计算三个轴的差值与绝对值:
Dx = Xe - Xs、Dy = Ye - Ys、Dz = Ze - Zs;AbsDx = Abs(Dx)、AbsDy = Abs(Dy)、AbsDz = Abs(Dz)。 - 确定各轴步进方向:
StepX = 1(若Dx>0),否则为-1;同理得到StepY、StepZ。 - 初始化误差项:
Err1 = AbsDx - AbsDy、Err2 = AbsDx - AbsDz。 - 循环遍历:从起点坐标开始,根据误差项判断每一步的轴移动方向,每移动到一个新坐标就将计数+1,直到到达终点坐标。起点本身算第一个,终点算最后一个。
- 计算三个轴的差值与绝对值:
代码示例(C++)
int CountPassedCubes(int Xs, int Ys, int Zs, int Xe, int Ye, int Ze) { int CubeCount = 1; // 起点计入数量 int Dx = Xe - Xs; int Dy = Ye - Ys; int Dz = Ze - Zs; int AbsDx = FMath::Abs(Dx); int AbsDy = FMath::Abs(Dy); int AbsDz = FMath::Abs(Dz); int StepX = Dx > 0 ? 1 : -1; int StepY = Dy > 0 ? 1 : -1; int StepZ = Dz > 0 ? 1 : -1; int Err1 = AbsDx - AbsDy; int Err2 = AbsDx - AbsDz; int CurrentX = Xs, CurrentY = Ys, CurrentZ = Zs; while (CurrentX != Xe || CurrentY != Ye || CurrentZ != Ze) { int Err1Double = 2 * Err1; int Err2Double = 2 * Err2; // 处理X-Y平面的误差 if (Err1Double > -AbsDy) { Err1 -= AbsDy; CurrentX += StepX; } if (Err1Double < AbsDx) { Err1 += AbsDx; CurrentY += StepY; } // 处理X-Z平面的误差 if (Err2Double > -AbsDz) { Err2 -= AbsDz; CurrentX += StepX; } if (Err2Double < AbsDx) { Err2 += AbsDx; CurrentZ += StepZ; } CubeCount++; } return CubeCount; }
蓝图实现提示
如果用蓝图实现,可将上述逻辑拆分为节点:用整数运算节点计算差值、绝对值、步进方向,用循环节点执行遍历,用变量维护误差项和当前坐标,每次循环更新计数。
内容的提问来源于stack exchange,提问作者Bakterhaz
相关产品推荐
相关产品推荐

