【问题标题】:Turning objects so they reset their y-rotation in Three.js转动物体,使它们在 Three.js 中重置它们的 y 旋转
【发布时间】:2016-12-12 04:10:23
【问题描述】:

使用 three.js,我正在创建一个游戏,其中的汽车会根据它们的 y 旋转向特定方向移动。一个例子是 90 度。我使用object.translateZ() 将它们向前移动,但我遇到了问题。

我正在使用 physijs 来模拟汽车。相互碰撞的汽车可能会改变它们的 y 旋转(因为碰撞),我想找到一种方法让汽车慢慢地改变它们的旋转回到原来的旋转,就像他们正在转向回到路上一样。没有这个,我的城市很混乱。

这是我已经在使用的代码(这只是其中的一部分):

var targetRotation = 90
var rotation = car.mesh.rotation.y * 180 / Math.PI //to convert to degrees

我想找到一种方法来慢慢改变汽车的旋转,使其与目标旋转相同。

感谢任何帮助! (但某种功能会很完美)

【问题讨论】:

    标签: javascript three.js rotation physijs


    【解决方案1】:

    我以前在其他系统(2D,而不是 Three.js)中做过类似的事情,基本上你想做的就是逐渐增加角度,直到你达到 足够接近目标角度。通常这意味着浮点数小于您增加的转动速度(因此您不会“超出”该值)。

    增量的大小取决于您希望它们转动的速度。

    您还想根据您是接近 360 度还是 0 度来检查是增加角度还是减少角度(顺时针还是逆时针)更好。这可以防止汽车转向“长距离”。您可以通过查看差异是否大于/小于 180 来发现这一点。

    我们可以使用模运算符来获得-360/360之间的“真实”角度。

    var currentAngle = car.mesh.rotation.y * 180 / Math.PI; //car's angle in degrees
    var targetAngle = 90; //preferred angle *this time* ;)
    var turningSpeed = 1; //one degree per update (wayyy to high for real stuff, usually)
    currentAngle = currentAngle % 360; //get the 0-360 remainder
    if ( Math.abs(targetAngle - currentAngle) >= turningSpeed) {
      var addto = 0
      if (targetAngle - currentAngle < 0) {
        addto = 360
      }
      if ( targetAngle - currentAngle + addto <= 180 ) { 
        currentAngle += turningSpeed;  
      }
      else {
         currentAngle -= turningSpeed;
      }
    }
    else { currentAngle = targetAngle; } //we're close enough to just set it
    car.mesh.rotation.y = ( currentAngle * Math.PI ) / 180; // back to radians!
    

    【讨论】:

    • 我刚刚注意到一个小故障,如果当前角度为 0,目标角度为 90,它会下降到 -90,有什么办法可以解决这个问题?
    • 是的,我只是在思考数学问题,发现转弯时出现了一些错误;我现在正在绘制范围以检查公式。给我一分钟...
    • 我建议了一个我认为可行的编辑,因为当currentAngle 大于targetAngle 时,您的公式无法处理。
    • 它没有正确倒车。我查看了电子表格中的值以找出我的错误,可以通过更多的数学和 if 检查来完成,或者只是增加值。我接受了您的修改以反映更改。
    • 非常感谢您的工作!我建议进行另一个编辑以检查角度是否为负数或大于 360。
    猜你喜欢
    • 2013-07-28
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多