转动物体,使其在 Three.js 中重置其 y 轴旋转
Turning objects so they reset their y-rotation in Three.js
我正在使用 three.js 创建一个游戏,其中的汽车会根据其 y 轴旋转向特定方向移动。一个例子是 90 度。我使用 object.translateZ()
来推动它们前进,但我 运行 遇到了问题。
我正在使用 physijs 来模拟汽车。 运行 相互碰撞的汽车可能会改变它们的 y 旋转(因为碰撞),我想找到一种方法让汽车慢慢地将它们的旋转改变回原来的旋转,就像它们正在转向重新开始一样马路。没有这个我的城市很乱
这是我已经在使用的代码(这只是其中的一部分):
var targetRotation = 90
var rotation = car.mesh.rotation.y * 180 / Math.PI //to convert to degrees
我想找到一种方法来慢慢改变汽车的旋转,使其与目标旋转相同。
感谢任何帮助! (但某种功能会很完美)
我以前在其他系统(2D,不是 Three.js)中做过类似的事情,基本上你想要做的就是逐渐增加角度,直到达到足够接近的程度 到目标角度。通常这意味着浮点数小于你增加的旋转速度(所以你没有 "overshoot" 这个值)。
增量的大小取决于您希望它们转动的速度。
你还想检查是增加角度还是减小角度更好(你是顺时针还是逆时针转)取决于你是接近 360 度还是 0 度。这可以防止汽车转向 "long way" 大约。您可以通过查看差异是否 greater/less 与 180.
来找出这一点
我们可以使用取模运算符得到 -360/360 之间的 "real" 角度。
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!
我正在使用 three.js 创建一个游戏,其中的汽车会根据其 y 轴旋转向特定方向移动。一个例子是 90 度。我使用 object.translateZ()
来推动它们前进,但我 运行 遇到了问题。
我正在使用 physijs 来模拟汽车。 运行 相互碰撞的汽车可能会改变它们的 y 旋转(因为碰撞),我想找到一种方法让汽车慢慢地将它们的旋转改变回原来的旋转,就像它们正在转向重新开始一样马路。没有这个我的城市很乱
这是我已经在使用的代码(这只是其中的一部分):
var targetRotation = 90
var rotation = car.mesh.rotation.y * 180 / Math.PI //to convert to degrees
我想找到一种方法来慢慢改变汽车的旋转,使其与目标旋转相同。
感谢任何帮助! (但某种功能会很完美)
我以前在其他系统(2D,不是 Three.js)中做过类似的事情,基本上你想要做的就是逐渐增加角度,直到达到足够接近的程度 到目标角度。通常这意味着浮点数小于你增加的旋转速度(所以你没有 "overshoot" 这个值)。
增量的大小取决于您希望它们转动的速度。
你还想检查是增加角度还是减小角度更好(你是顺时针还是逆时针转)取决于你是接近 360 度还是 0 度。这可以防止汽车转向 "long way" 大约。您可以通过查看差异是否 greater/less 与 180.
来找出这一点我们可以使用取模运算符得到 -360/360 之间的 "real" 角度。
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!