0

请在这里忍受我 - 我最终会提出一个问题......

我正在构建一个 3D 太空游戏,目前正在添加由多个网格构建的空间站(轨道)。我似乎遇到的问题是不同的部分似乎是重叠的,好像它们没有正确地相互偏移。

我有一个超类,OrbitalSection,它是子类;每个子类都用不同数量的 OrbitalJunction 定义,每个 OrbitalJunction 都包含一个 Matrix3D 对象,该对象决定了路口的位置和方向。

在游戏初始化的过程中,初始化 Orbital 选择第一个 OrbitalSection 并选择将使用该部分的哪个 OrbitalJunction。为了确定这个 OrbitalJunction 的方向,我使用...

chosenJunction.matrix.append(chosenSection.matrix);

(OrbitalSection 和 OrbitalJunction 都有一个返回其内部 Matrix3D 对象的 'matrix' 方法)。我将上面返回的 Matrix3D 方向传递给一个新的、随机选择的 OrbitalSection 上的“connectToJunction”方法。

所以,最后,我的问题是:
OrbitalSection 类中的以下代码是否合乎逻辑?

public function connectToJunction(p_sourceOrientation:Matrix3D):void {
    // _junctions is an Array of OrbitalJunctions...
    var chosenJunction:OrbitalJunction = _junctions[Math.floor(Math.random() * _junctions.length)];
    var invertedMatrix:Matrix3D = new Matrix3D();
    invertedMatrix.copyFrom(chosenJunction.matrix);
    invertedMatrix.invert();
    // the following lines re-position the inverted, rotated matrix back to the junction's original position...
    invertedMatrix.position.x = chosenJunction.matrix.position.x;
    invertedMatrix.position.y = chosenJunction.matrix.position.y;
    invertedMatrix.position.z = chosenJunction.matrix.position.z;

    _offsetMatrix.copyFrom(invertedMatrix); // << this is this OrbitalSection's Matrix3D object that the 'matrix' method returns
    _offsetMatrix.append(p_sourceOrientation); // the 'external' orientation is appended to this object's _offsetMatrix because the passed parameter in the Matrix3D .append method is the left-hand-side Matrix3D
}

我的逻辑是,要让 2 个交叉点相互“插入”,它们必须在同一个方向上匹配;所以肯定其中一个必须倒置。

理想情况下,应该设置新的 OrbitalSection 的 _offsetMatrix(以及任何其他添加的 OrbitalSection),以便它描述相对于 Orbital 的 0、0、0 位置和 0、0、0 旋转的位置和旋转。

那么,以这种方式反转所选结的 _offsetMatrix 是否有意义?

而且,顺便说一句,我将每个 OrbitalJunction 标记为在选择时被“使用”;'used' junction 被排除在构建过程中可用的 junction 列表之外,因此“重叠”问题不仅仅是一个以上的 OrbitalSection 被添加到同一个 junction - 即使它在游戏中看起来有点像. 干杯。

4

1 回答 1

0

我已经弄清楚了问题所在。我需要“翻转”第一个 OrbitalSection 的 OrbitalJunction 的 Matrix3D(180 度)并将其转换为负坐标 - 这将重新定向它,以便另一个连接点可以“插入”并重新定位它,以便它的OrbitalJunction 内的位置偏移了正确的量。然后我需要 .inverse() 第二个 OrbitalJunction 的 Matrix3D 并将其应用于第二个 OrbitalSection 的 Matrix3D。这是必要的,为了使 OrbitalJunction 匹配到 0、0、0 旋转,它包含的 OrbitalSection 需要旋转,并在相反的方向上移动。以防万一这对任何想要相对于彼此定位 3D 对象的人有用......

于 2013-10-07T08:11:12.017 回答