此脚本功能用于飞船自动调整飞行姿态到水平状态。
应用条件:
1.飞船在行星引力范围内;
2.飞船需要驾驶舱和陀螺仪,并且陀螺仪摆放方向与驾驶舱平行;
如果启动编程方块时如果发现仰角和翻转反了,将代码中的"-1f"和"1f"的正负更换一下
public Program()
{
Runtime.UpdateFrequency = UpdateFrequency.Update1;
// 这样脚本就不需要定时器方块也能自动运行了。
}
IMyShipController cockpit=null;
public void Main(string argument, UpdateType updateSource)
{
//获取当前玩家所在驾驶舱
if(cockpit==null){
List<IMyShipController> cockpits=new List<IMyShipController>();
GridTerminalSystem.GetBlocksOfType<IMyShipController>(cockpits);
if(cockpits.Count<1)return;
cockpit=cockpits[0];
}
//星球重力方向
var naturalgravity= cockpit.GetNaturalGravity();
//转换为飞船旋转参数(坐标系转换)
MatrixD refLookAtMatrix = MatrixD.CreateLookAt(new Vector3D(), cockpit.WorldMatrix.Forward, cockpit.WorldMatrix.Up);
//驾驶舱的当前角度
Vector3D MeAngle = Vector3D.TransformNormal(naturalgravity, refLookAtMatrix);
Echo($"MeAngle:{MeAngle}");
Vector3 targetPYR=new Vector3(cockpit.RotationIndicator,cockpit.RollIndicator);
//角速度减速
targetPYR+=Vector3D.TransformNormal(cockpit.GetShipVelocities().AngularVelocity,refLookAtMatrix)*0.5;
//获取所有陀螺仪
List<IMyGyro> gyros=new List<IMyGyro>();
GridTerminalSystem.GetBlocksOfType<IMyGyro>(gyros,block=>block.Enabled);
if(gyros.Count<1)return;
foreach (var gyro in gyros)
{
gyro.GyroOverride=false;
//仰角姿态矫正
if(Math.Abs(MeAngle.Z)<0.1f){
gyro.SetValue<float>("Pitch",0);
}
else if(MeAngle.Z>0){
gyro.SetValue<float>("Pitch",-1f);
gyro.GyroOverride=true;
}else if(MeAngle.Z<0){
gyro.SetValue<float>("Pitch",1f);
gyro.GyroOverride=true;
}
//翻转姿态矫正
if(Math.Abs(MeAngle.X)<0.1f){
gyro.SetValue<float>("Roll",0);
}else if(MeAngle.X>0){
gyro.SetValue<float>("Roll",-1f);
gyro.GyroOverride=true;
}else if(MeAngle.X<0){
gyro.SetValue<float>("Roll",1f);
gyro.GyroOverride=true;
}
}
}