Flo*_*olk 1 c# physics unity-game-engine
我想在Unity3D中模拟一艘船.我需要它能够做的就像真正的船只在水中碰到某些东西时会摇晃.我已经把船碰撞了,所有的轴都解锁了.然而,这意味着船将旋转,然后继续以奇怪的角度行驶(就像面向天空).
有没有办法让船试图恢复原来的旋转,没有捕捉到确切的值,而只是前后"摇摆",然后放慢速度,最终再次停止正确的旋转?
这是我尝试使用的代码:
void FixedUpdate ()
{
wobble();
}
void wobble()
{
if (this.transform.eulerAngles.x < 270)
{
this.rigidbody.AddTorque((float)19, (float)0, (float)0, ForceMode.Force);
}
else if (this.transform.eulerAngles.x > 270)
{
this.rigidbody.AddTorque((float)-19, (float)0, (float)0, ForceMode.Force);
}
else{}
if (this.transform.eulerAngles.z < 0)
{
this.rigidbody.AddTorque((float)19, (float)0, (float)0, ForceMode.Force);
}
else if (this.transform.eulerAngles.z > 0)
{
this.rigidbody.AddTorque((float)-19, (float)0, (float)0, ForceMode.Force);
}
else{}
}
Run Code Online (Sandbox Code Playgroud)
但是,现在当我的物体碰到某物时,它就会开始失控.有任何想法吗?
您可以使用补间.一个美妙的技术更改值是-顺利补两个值.在这种情况下,您可以从笨拙的弹跳角度到两个之间的补间坐姿旋转.有很好的插件可以像iTween一样使用,这很棒,但我会告诉你一些半假超级谷物代码,让你开始"旋转校正"的概念
让我们说我的船撞了一个漂亮的大浪,它指向我的船向上20度角.
我在X上的欧拉角是20,我可以通过增加以恒定速率减小值来将其返回到0.我只是在这里展示X,但你可以重复Z轴的过程.我会排除Y,因为你会在Y上使用你的船的方向而你不想搞砸你的船只航行.
Update()
float angleDelta;
// check if value not 0 and tease the rotation towards it using angleDelta
if(transform.rotation.X > 0 ){
angleDelta = -0.2f;
} elseif (transform.rotation.X < 0){
angleDelta = 0.2f;
}
transform.rotation.X += angleDelta;
}
Run Code Online (Sandbox Code Playgroud)
这个令人难以置信的简单实现完成了这项工作,但却拥有令人难以置信的"活泼"和"紧张"的美妙享受.所以我们想添加一些平滑处理,使它成为更加逼真的船.
我们通过在angleDelta中添加一个变量来实现这一点:
Vector3 previousAngle;
float accelerationBuffer = 0.3f;
float decelerationBuffer = 0.1f;
Update()
Vector3 angleDelta;
//assuming that x=0 is our resting rotation
if(previousAngle.X > transform.rotation.X && transform.rotation.X > 0){
//speed up rotation correction - like gravity acting on boat
angleDelta.X += (previousAngle.X - transform.rotation.X) * accelerationBuffer;
} elseif(previousAngle.X < transform.rotation.X && transform.rotation.X > 0
//angle returning to resting place: slow down the rotation due to water resistatnce
angleDelta.X -= (previousAngle.X - transform.rotation.X) * deccelerationBuffer;
}
//If boat pointing to sky - reduce X
if(transform.rotation.X > 0 ){
transform.rotation.X -= angleDelta.X * Time.deltaTime;
//If boat diving into ocean - increase X
} elseif (transform.rotation.X < 0){
transform.rotation.X += angleDelta.X * Time.deltaTime; //Must not forget to use deltaTime!
}
//record rotation for next update
previousAngle = transform.rotation;
}
Run Code Online (Sandbox Code Playgroud)
这是一个令人难以置信的粗略草案,但它涉及我正在尝试解释的理论 - 你需要相应地调整自己的代码,因为你没有包含任何你自己的代码(pastebin一个片段给我们,也许我们可以详细说明更多!)