我目前正在使用 Java 开发 3D 引擎,并且遇到了一些问题。例如,以可靠、简单的方式创建 3D(或 2D 或 1D)几何图形的可靠方法。当然,对此没有真正、直接的答案,但我主要期待这是一篇讨论型帖子。但是,尽管如此,我正在寻找一种简单而可靠的方法来实例化几何在我的 3D 引擎中。
(作为我的意思的一个例子,我目前的所有东西都是由 3D 点组成的(实际上是这样),但是告诉引擎这些点组成是一项艰巨的任务,因此很难获得可靠的几何图形. 我需要一个更可靠的系统,而不是仅仅使用许多点。)
我目前正在使用 Java 开发 3D 引擎,并且遇到了一些问题。例如,以可靠、简单的方式创建 3D(或 2D 或 1D)几何图形的可靠方法。当然,对此没有真正、直接的答案,但我主要期待这是一篇讨论型帖子。但是,尽管如此,我正在寻找一种简单而可靠的方法来实例化几何在我的 3D 引擎中。
(作为我的意思的一个例子,我目前的所有东西都是由 3D 点组成的(实际上是这样),但是告诉引擎这些点组成是一项艰巨的任务,因此很难获得可靠的几何图形. 我需要一个更可靠的系统,而不是仅仅使用许多点。)
是的,讨论类型的问题——首先,只是一个警告,讨论类型的问题在 stackoverflow 上往往不受欢迎,但我还是会提出:
我想到的第一件事是半边网格数据结构——一种简单、功能强大、足以满足所有需求的结构——我目前需要的结构——几乎没有空间方面的多余数据。这将基本上涵盖您所有的网状结构需求。
您会在许多 3D 游戏引擎中找到的另一个解决方案是对象树系统(我不确定这是否是正确的名称),您可以在python panda3D 游戏引擎Blender 中找到它(有点,对搅拌机不太熟悉)等等。这个想法是有一个简单的 Object3D 类,它可以在其中的相对位置包含其他 Object3D 对象。这种嵌套层次结构非常适用于复杂系统,其中部分组合在一起形成其他事物的更复杂部分。这种嵌套层次结构也非常适合递归 O(log n) 碰撞算法和递归平截头体剔除(用于图形)。这也很容易编码——我在 11 年级时使用对象树编写了一个基本的 3D 引擎,假设我是
在任何引擎中,我们都需要某种方法来计算相交等,因此我们可以进行平截头体剔除、物理碰撞等等。我使用的技巧(非常有效,而且足够智能)是AABB 树——如果我们已经有对象树,我们只需让每个对象存储并计算它的 AABB,嘿,马上!AABB 树。
无论如何,你说,因为我有一些编写这样的代码的经验,所以我必须能够提供示例,对吧?是的:
public class Object3D {
public LinkedList<Object3D> children;
public AABB aabb; // the AABB of the object -- constructed
// by union of children's AABBs
public void doesIntersect(Object3D obj){
// intersection using AABB-AABB intersection
// sadly web resources are sorely lacking, so I shall handle this one below
}
}
关于 AAABB-AABB 碰撞(如果你需要知道) 我们有两个盒子。每个框都与轴对齐,每个框都有宽度、高度和深度。为了测试它们是否发生碰撞,我们在沿所有三个轴查看时查看它们是否重叠——毕竟,如果当我们沿一个轴查看时它们不重叠,它们就不可能发生碰撞。稍后一些花哨的数学,我们注意到:
"Box A and Box B collide" iff "Box A and B have overlapping x coordinates" and
"same for y coordinates" and "same for z coordinates" and
"same for any other dimensions of space you decide to implement".
事实证明,这对于编码和计算来说都是一项微不足道的检查,这就是为什么 AABB 可以为对象树提供良好的边界体积。
好吧,对于讨论,这个答案已经变得相当片面了。无论如何,评论会很可爱,我敢肯定我错过了一些有用的东西(verlet集成,光线追踪,但所有这些都很容易在如上所述的基础上)