我的网格物体翻转的旋转角度小于math.pi

时间:2019-03-20 12:07:51

标签: three.js rotation mesh

我回来了,因为我遇到了Unity上不熟悉的几何问题。 对于f-zero风格的游戏,我有一个对撞机盒(屏幕捕获为白色),它是我的射线广播的起点,并与车辆的运动联系在一起。 在所示的代码中,这是this.collider。我通过传统的applymatrix控制其旋转,没有问题。

然后,最重要的是,我在this.meshes中具有了车辆的渲染主体。它继承了对撞机盒的旋转,但在其垂直轴上获得了一些额外的旋转,从而在硬转弯时提供了视觉上的滑动动力。 它与对撞机是分开的,以保持运动(和射线投射)的向量前进不受额外旋转的影响。这纯粹是视觉上的。

我的问题是:实现它的最佳方法是什么?

我尝试了不同的方法,但是,基本上,如果我复制对撞机的位置和旋转,就没问题了。一旦尝试添加一些额外的旋转= this.driftRotation,当rotation.y值小于-math.pi时,我的身体就会翻转。我可以通过增加Math.PI来调整旋转值(就像在Unity中一样),但是在这里不起作用。 找不到适用于applyMatrix的干净解决方案,也没有关于“垂直旋转翻转网格”的很多google答案...尽管我很确定,这种情况很普遍。

某些代码:

this.meshes.position.set(
        this.collider.position.x,
        this.collider.position.y,
        this.collider.position.z);
    this.meshes.rotation.x = this.collider.rotation.x;
    this.meshes.rotation.y = this.collider.rotation.y + this.driftRotation; 
    this.meshes.rotation.z = this.collider.rotation.z;

附上更明确的图片:

enter image description here

谢谢

1 个答案:

答案 0 :(得分:0)

Marquizzo,这正是关键所在:第3个像素紧随第2个像素,因此我仍在向右转,但旋转突然翻转(同样,当rotation.y达到-PI时)。 无论如何,我通过不尝试直接更改rotation.y值,而是使用矩阵来修复它。只是需要时间来了解做什么。

对于那些可能会遇到类似铅的人,这是我的临时解决方案,直到我发现性能更高的东西为止:

    this.meshes.matrix.identity();  
    if (Math.abs(driftAmount) > 0)
    {
        this.driftAxis.copy(this.driftDirection);
        this.driftValue = js.Utils.lerp(this.driftValue, Math.sign(driftAmount) * 0.4, 0.05);
        this.meshes.matrix.makeRotationAxis(this.driftAxis, this.driftValue);
    }
    else if (Math.abs(this.driftValue) > 0)
    {
        this.driftAxis.copy(this.driftDirection);
        this.driftValue = js.Utils.lerp(this.driftValue, 0, 0.1);
        if (Math.abs(this.driftValue) < 0.001)
        {
            this.driftValue = 0;    
        }
        this.meshes.matrix.makeRotationAxis(this.driftAxis, this.driftValue);
    }
    this.meshes.applyMatrix(this.collider.matrix);

我必须沿着driftDrection添加一个driftAxis,这是我的垂直旋转轴。 对于参考。我认为这个主题与我所遇到的问题+/-有关: https://github.com/mrdoob/three.js/issues/1460

现在,我还有另一个问题,如何向this.meshes在另一个轴(正向轴)上添加另一个旋转以获得滚动效果,因为如果我仅在此代码中添加另一个makeRotationAxis,它将跳过第一个。但这听起来似乎不那么容易,必须存在相当于CombineMatrix的东西……