在绕目标运行时控制船舶旋转
Controlling Ship Rotation as it Orbits a Target
我试图让我的飞船实体要么看向它们移动的方向,要么看向它们环绕的目标。在这一点上,我对任何一个结果都很满意。不幸的是,尽管我对如何实现这一目标进行了所有 Google 研究,但我似乎对基础数学还不够了解。
这是我目前在 RotateSystem 中的内容
public void Execute(ref Translation shipPosition, ref Ship ship, ref Rotation rotation)
{
ship.Theta += .0075f;
float3 delta = new float3(
ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Cos(ship.Phi),
ship.Radius * Mathf.Cos(ship.Theta),
ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Sin(ship.Phi));
rotation.Value = Quaternion.Slerp(rotation.Value,
Quaternion.LookRotation(ship.OrbitTarget + delta-shipPosition.Value),0.5f);
shipPosition.Value = ship.OrbitTarget + delta;
}
这样做的结果是,船只有 1/2 的时间面向其轨道目标,而另一半的时间则背对轨道目标。
如果没有第二个参数,Quaternion.LookRotation
假设您希望本地 up
尽可能接近 Vector3.up
。相反,使用从轨道体到轨道体的方向:
public void Execute(ref Translation shipPosition, ref Ship ship, ref Rotation rotation)
{
ship.Theta += .0075f;
float3 delta = new float3(
ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Cos(ship.Phi),
ship.Radius * Mathf.Cos(ship.Theta),
ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Sin(ship.Phi));
Vector3 previousPos = shipPosition.Value;
shipPosition.Value = ship.OrbitTarget + delta;
rotation.Value = Quaternion.Slerp(rotation.Value, Quaternion.LookRotation(
shipPosition.Value - previousPos,
ship.OrbitTarget - shipPosition.Value), 0.5f);
}
我试图让我的飞船实体要么看向它们移动的方向,要么看向它们环绕的目标。在这一点上,我对任何一个结果都很满意。不幸的是,尽管我对如何实现这一目标进行了所有 Google 研究,但我似乎对基础数学还不够了解。
这是我目前在 RotateSystem 中的内容
public void Execute(ref Translation shipPosition, ref Ship ship, ref Rotation rotation)
{
ship.Theta += .0075f;
float3 delta = new float3(
ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Cos(ship.Phi),
ship.Radius * Mathf.Cos(ship.Theta),
ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Sin(ship.Phi));
rotation.Value = Quaternion.Slerp(rotation.Value,
Quaternion.LookRotation(ship.OrbitTarget + delta-shipPosition.Value),0.5f);
shipPosition.Value = ship.OrbitTarget + delta;
}
这样做的结果是,船只有 1/2 的时间面向其轨道目标,而另一半的时间则背对轨道目标。
如果没有第二个参数,Quaternion.LookRotation
假设您希望本地 up
尽可能接近 Vector3.up
。相反,使用从轨道体到轨道体的方向:
public void Execute(ref Translation shipPosition, ref Ship ship, ref Rotation rotation)
{
ship.Theta += .0075f;
float3 delta = new float3(
ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Cos(ship.Phi),
ship.Radius * Mathf.Cos(ship.Theta),
ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Sin(ship.Phi));
Vector3 previousPos = shipPosition.Value;
shipPosition.Value = ship.OrbitTarget + delta;
rotation.Value = Quaternion.Slerp(rotation.Value, Quaternion.LookRotation(
shipPosition.Value - previousPos,
ship.OrbitTarget - shipPosition.Value), 0.5f);
}