我有一个非常简单的飞机模型可以在x和y方向上移动,而海洋滚动使它看起来好像飞机正在飞行 . 每当飞机移动时,我都会调整它的滚动和俯仰 .
我在对象脚本中计算并维护位置,滚动和俯仰 . 每个更新步骤我都会将它们重新分配给对象的Unity属性 .
问题出现在我试图添加桶滚动效果的地方 . 这段代码工作正常:
transform.Translate(position - transform.position);
Vector3 rotChange = new Vector3 (-pitch, 0, -roll) -
transform.rotation.eulerAngles;
transform.Rotate (rotChange);
只要我将所有旋转保持在-30度之内 . 当飞机进行滚筒滚动时,它会使用以下内容更新每个步骤:
velocity = new Vector3 (barrelRollDirections.x * barrelRollXSpeed,
barrelRollDirections.y * barrelRollYSpeed, 0);
roll += barrelRollTurnSpeed * Time.deltaTime;
if (roll < -(fullRotation/2)) {
roll += fullRotation;
}
if (roll > (fullRotation/2)) {
roll -= fullRotation;
}
有趣的是,当我这样做时,如果平面没有沿x轴或y轴移动,旋转平面实际上是可以正常工作的 . 但如果它是,它会跳到整个地方,只有在滚动结束后才会重新出现在正确的最终位置 .
我尝试了很多方法来解决这个问题:
-
使用Quaternion.Euler将我想要的方向转换为四元数,并将其直接赋值给transform.rotate . 这并没有解决任何问题,它也会导致飞机在其运动范围内抖动和抖动 .
-
在四元数中保存平面的初始方向,然后,每个更新步骤,将初始旋转重新分配给平面,然后调用Transform.Rotate(new Vector3(-pitch,0,-roll)) . 我认为这可以解决我的问题,如果它是像万向节锁,从那时我只是,每一步,应用旋转小于180度 . 但没有骰子 .
1 回答
编辑:我找到了!在提出这个问题之后,我想我会在等待答案后继续研究不同的对象 . 在那里我发现transform.Translate函数根据它们的旋转在不同的方向上移动对象 . 当我改为简单地重新分配位置时,它工作正常 . 与往常一样,与其他人交谈的行为有助于解决问题 .