之前隔壁实验室做一个船舶项目时,需要实现unity内船体受攻击倾斜的功能,拜托我实现一下。试了好几种方法,最后用RotateAround方法实现(因为只是概念展示,不需要涉及水浮力船体重力等等因素,只是实现一定幅度一定角度的转动)。 代码如下:
Transform boat;
Vector3 boatY;
Vector3 rotationCenter;
Vector3 rotationAxis;
Vector3 collisionPosition;
float angleCos;
float x;
float y;
float z;
double cos;
void Start()
{
boat = this.GetComponent<Transform>();
rotationCenter = new Vector3(0f, -0.05f, 0f);
collisionPosition = new Vector3(-0.2f,0.15f,0.5f);
rotationAxis = getAxis();
angleCos = 0.985f;
}
Vector3 getAxis()
{
Vector3 axis = new Vector3();
axis.x = collisionPosition.z;
axis.y = 0;
axis.z = - collisionPosition.x;
return axis;
}
void Update()
{
rotateAround();
}
void rotateAround()
{
if (GetCos() > angleCos)
{
boat.RotateAround(rotationCenter, rotationAxis, 500 * Time.deltaTime*(float)( GetCos()- angleCos));
}
}
double GetCos()
{
boatY = transform.up;
x = boatY.x;
y = boatY.y;
z = boatY.z;
cos = Math.Abs(y) / (Math.Sqrt(x * x + y * y + z * z));
Debug.Log(cos);
return cos;
}
其实思路还是比较简单的,配合图片和代码很容易理解,要说明的是计算旋转轴的方式因为我的中心点就在(0,0,0),所以直接用绝对数值,如果你们的中心点不在这个位置请计算相对数值。
|