矩阵 3D 偏移量未正确添加



请耐心等待 - 我最终会回答一个问题......

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

我有一个超类,轨道部分,它是子类的;每个子类都使用不同数量的轨道交汇点定义,每个交汇点包含一个确定交汇点位置和方向的 Matrix3D 对象。

在游戏初始化过程中,初始化轨道选择第一个轨道部分,并选择使用该部分的轨道交汇点。为了确定这个轨道结的方向,我正在使用...

chosenJunction.matrix.append(chosenSection.matrix);

(OrbitalSection 和 OrbitalJunction 都有一个返回其内部 Matrix3D 对象的"矩阵"方法(。我将上面返回的 Matrix3D 方向传递到一个新的、随机选择的轨道截面上的"connectToJunction"方法中。

所以,最后,这是我的问题:
轨道剖面类中的以下代码是否合乎逻辑?

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
}

我的逻辑是,要使两个结点相互"插入",它们必须朝同一方向匹配;所以肯定其中一个必须倒置。

理想情况下,应设置新轨道截面的_offsetMatrix(以及任何其他添加的轨道截面(,以便描述相对于轨道的 0、0、0 位置和 0, 0, 0 旋转的位置和旋转。

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

而且,顺便说一下,我在选择时将每个轨道结标记为"使用";"使用过的"交汇点被排除在构建过程中的可用交汇点列表中,因此"重叠"问题不仅仅是将多个 OrbitalSection 添加到同一个交汇点 - 即使这在游戏中看起来有点像。干杯。

我已经解决了问题所在。我需要"翻转"第一个轨道交汇点的 Matrix3D(180 度(并将其转换为负坐标 - 这既会重新定向它,以便另一个结可以"插入"它并重新定位它,以便它在轨道结内的位置偏移正确的量。然后我需要 .inverse(( 第二个 OrbitalJunction 的 Matrix3D,并将其应用于第二个 OrbitalSection 的 Matrix3D。这是必要的,为了使轨道结匹配到0,0,0旋转,其包含的轨道截面需要旋转,并沿相反方向移动。以防万一这对于想要相对于彼此定位 3D 对象的任何人来说都很有用......

最新更新