我应该如何格式化3D引擎的几何实例化过程?

时间:2012-10-27 14:38:59

标签: java 3d geometry instantiation

我目前正在研究java中的3D引擎,并遇到了一些问题。例如,以可靠,简单的方式创建3D(或2D或1D)几何的可靠方法。当然,没有真正的,直截了当的答案,但我主要期待这是一个讨论类型的帖子..但是,尽管如此,我正在寻找一种简单但可靠的实例化几何的方法在我的3D引擎中。

(作为一个例子,我的意思是,我目前所有东西都由3D点组成(实际上是这样),但告诉引擎这些点构成的是一项艰巨的任务,这使得它很难获得可靠的几何体。我需要一个更可靠的系统,而不仅仅是使用许多点。)

1 个答案:

答案 0 :(得分:1)

Yay讨论型问题 - 首先,只是一个警告,讨论类型的问题在stackoverflow上往往不受欢迎,但我仍然会参与其中:

我想到的第一件事就是Half-edge Mesh Datastructure - 一个简单而强大的东西 - 我所需要的 - 迄今为止的结构 - 几乎没有太空多余的数据。这将基本涵盖您的所有网格结构需求。

你会在许多3D游戏引擎中找到的另一个解决方案是对象树系统(我不确定这是否是正确的名称),你将在python panda3D game engine中找到它,搅拌机(有点,不熟悉搅拌机),依此类推。我们的想法是拥有一个简单的Object3D类,它可以在其中的相对位置包含其他Object3D对象。这种嵌套层次结构非常适用于复杂系统,其中部件组合在一起形成其他事物的更复杂部分。这种嵌套层次结构非常适合递归O(log n)碰撞算法和递归平截头体剔除(用于图形)。这也非常容易编码 - 我在11年级时使用对象树编写了一个基本的3D引擎,让我们说我当时不是MENSA的成员。

在任何引擎中,我们都需要一些方法来计算交叉点等,所以我们可以做截锥体剔除,物理碰撞等等。我使用的技巧(非常有效,而且足够智能)是AABB tree - 如果我们已经有了对象树,我们只需让每个对象存储和放置。计算它的AABB,嘿presto! 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整合,光线跟踪,但所有这些都很容易在基础上如上所述)