请在这里忍受我 - 我最终会提出一个问题......
我正在构建一个 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 - 即使它在游戏中看起来有点像. 干杯。