1

我认为这很简单:

 Vector3 point = Vector3.Transform(originalPoint, worldMatrix);

但显然不是......这使得这一点的数字飙升至数千。

基本上,我想做的是创建一个碰撞系统,这个系统中的每两个点都是一条线,所以基本上我想碰撞线。我希望线条能够基于世界矩阵进行缩放、旋转和平移(以便碰撞线与对象的缩放、旋转和平移保持一致)。

我已经尝试了几个小时,但我似乎无法弄清楚。我也尝试过乘以 View Matrix,虽然这最接近我想要的,但它似乎在两组数字之间切换!如果它保持在一组就完美了,我不知道为什么它一直在变化......

请问有什么帮助吗?:(

编辑:补充一点,我不断更新更新调用中的点。但我不知道这是否会改变任何事情,无论哪种方式,点=原始点。

Steve H:一条线有两点,所以:

originalPoint[0] = new Vector3(-42.5f, 0f, 0f);
originalPoint[1] = new Vector3(42.5f, 0f, 0f);
point[0] = Vector3.Transform(originalPoint[0], worldMatrix);
point[1] = Vector3.Transform(originalPoint[1], worldMatrix);`

起初,point[0] & [1]等于originalPoint[0] & [1]。但是,当我移动我的播放器时,哪怕只是几个像素......

point[0] = (-5782.5f, 0f, 0f)
point[1] = (-5697.5, 0f, 0f)

玩家的位置是-56.0f

worldMatrix的做法是:

_world = Matrix.Identity // ISROT
       * Matrix.CreateScale(_scale) // This object's scale
       * Matrix.CreateFromQuaternion(_rotation) // It's rotation
       * Matrix.CreateTranslation(_offset) // The offset from the centre
       * Matrix.CreateFromQuaternion(_orbitRotation) // It's orbit around an object
       * _orbitObjectWorld // The object to base this world from
       * Matrix.CreateTranslation(_position); // This object's position

对象在图形中正确显示。它们完全可以缩放、旋转、平移。它们也遵循轨道的比例、旋转和平移,但我还没有对轨道进行太多测试。

我希望这是足够的细节......

编辑:经过进一步研究,原点也正在改变......:| 我不明白为什么会这样。它们与新点完全相同...

4

1 回答 1

0

我发现了我的问题... -_-

因此,在创建线点之后,我会在最后执行此操作:

originalLines = collisionLines;

collisionLines&originalLines都是Vector3[]数组。

我想只要使一个相等,就好像它们完全相同,而改变一个会改变另一个……那是我不知道的。

所以我做了这个功能:

void CreateOriginalPoints()
{
    _originalPoints = new Vector3[_collisionPoints.Length];

    for (int i = 0; i < _collisionPoints.Length; i++)
        _originalPoints[i] = _collisionPoints[i];
}

这完全解决了问题。现在我完全明白为什么这个问题会首先发生。

非常感谢 Donnie 和 Steve H。我知道你们两个没有回答我的问题,但这让我更深入地探索,直到找到答案。

于 2012-12-09T16:41:07.033 回答