在3d中排序对象

时间:2018-12-31 11:29:23

标签: javascript arrays sorting math perspective

因此,我正在开发一种具有固定摄像机位置的 3d游戏。我有很多实体,每个实体都有这些属性:

  • 位置(coordinateX,coordinateY,coordinateZ)
  • Hitbox(大小X,大小Y,大小Z)

例如,可以通过以下方式构造实体:

  • 位置(3,4,9)
  • Hitbox(2、3、1)

现在我要在3d地图上绘制许多实体。由于我想在背景中的对象前面绘制前景中的对象,因此必须对画布中的对象的绘制进行排序。这意味着必须先绘制其他对象后面的对象,依此类推...

我已经尝试了许多个小时,以弄清楚如何对对象进行排序。使用此排序功能,我走到了尽头,因为不幸的是,计算无法正常进行。我完全不知道该如何解决这个问题,但我认为将我的想法添加到问题中对我们所有人来说并不算太坏。

enter image description here

img

let objects = {
  entity1: {
    position: {
      x: 0,
      y: 10,
      z: 5
    },
    hitbox: {
      sizeX: 4,
      sizeY: 1
    }
  },
  entity2: {
    position: {
      x: 4,
      y: 2,
      z: 4
    },
    hitbox: {
      sizeX: 3,
      sizeY: 3
    }
  }
}


let layeredObjects = Object.values(objects).sort((itemA, itemB) =>  {
  if ((itemA.position.x - itemA.hitbox.sizeX < itemB.position.x + itemB.hitbox.sizeX) &&
    (itemA.position.y + itemA.hitbox.sizeY < itemB.position.y - itemB.hitbox.sizeY) ||
    (itemA.position.x + itemA.hitbox.sizeX < itemB.position.x - itemB.hitbox.sizeX)) return -1;
  return 1;
})

console.log(layeredObjects)


因此,针对我的问题的最佳解决方案是一种方法,该方法能够以易于将它们绘制到画布中的方式返回排序的实体(层)。

我很高兴您的帮助。


0 个答案:

没有答案