Matrix3D偏移未正确添加

时间:2013-09-30 09:18:27

标签: actionscript-3 matrix 3d stage3d

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

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

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

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

chosenJunction.matrix.append(chosenSection.matrix);

(OrbitalSection和OrbitalJunction都有一个'矩阵'方法,返回其内部Matrix3D对象)。我将上面返回的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
}

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

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

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

顺便说一下,我将每个OrbitalJunction标记为选中时使用的'使用'; 'used'交汇点被排除在构建过程中可用联结的列表中,因此“重叠”问题并不仅仅是将多个OrbitalSection添加到同一个交叉点 - 即使它在游戏中看起来略微如此。欢呼声。

1 个答案:

答案 0 :(得分:0)

我已经找到了问题所在。我需要'翻转'第一个OrbitalSection的轨道连接的Matrix3D(180度)并将其转换为负坐标 - 这将重新定位它,以便另一个交叉点可以“插入”它并重新定位它以便它位于轨道交界处的位置被正确的数量抵消。 然后我需要.inverse()第二个OrbitalJunction的Matrix3D并将其应用到第二个OrbitalSection的Matrix3D。这是必要的,因为OrbitalJunction最多匹配0,0,0转,其包含的OrbitalSection需要旋转,并向相反的方向移动。 以防这对任何想要相对于彼此定位3D对象的人有用......