飞行器仿真软件开发——unity3d实现简单的飞行器旋转及变轨操作

上周由于中秋节放假,人比较懒散,只是在和同学一起完成了关于飞行器旋转及变轨操作后,便早早地溜回了宿舍,趁着今天下午没课,把上周完成的算法大概介绍一下。

在开始写飞行器旋转算法之前,我参考了《unity制作简单的太阳系》一文
https://blog.csdn.net/hcud024/article/details/51360068
因为首先我们要做到飞行器正常地旋转即可,这里我们只需要用到transform.RotateAround(origin.position, axis, speed * Time.deltaTime)方法即可,其中括号里的三个参数,分别代表着:绕点位置、旋转角度、旋转速度,只需要一个函数即可做到飞行器旋转。

飞行器旋转轨迹
然后关于显现飞行器旋转轨迹,我们只需要在unity中设置好 Trail Renderer 组件即可,设置的方法点击 Add Component,输入组件即可。

飞行器的旋转比较简单,然后关于变轨操作,这里一开始,我也没弄懂思路,一味的用transform.Translate(x,y,z)方法在一帧内实现在固定距离的移动,最后可以做到突然变轨,但这显然并不是飞行器合理的变轨现象,在同学的帮助指导下,才明白了作为所谓的程序员思想,即我们不能简单地考虑一个动作的执行,而要把整个操作过程交给计算机进行重复判断执行过程,一下将展示代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotation : MonoBehaviour {
    public Transform origin;         //卫星旋转点
    public float speed = 5;         //卫星旋转速度
    public float ry, rz;
    public float distance = 10;        //卫星初始高度
    public float SetDitance = 300;      //变轨后高度
    public float disSpeed = 2;         //变轨速度
    // Use this for initialization
    void Start () {

    }
    
    //变轨函数
	public void OrbitalTransfer(float dispeed){
        transform.Translate(dispeed * Time.deltaTime, 0, 0);  
    }
    
	// Update is called once per frame
	void Update () {
        Vector3 axis = new Vector3(0, ry, rz);
        this.transform.RotateAround(origin.position, axis, speed * Time.deltaTime);
        if (distance < SetDitance)
        {
            distance = distance + disSpeed;
            OrbitalTransfer(disSpeed);
         //   speed = speed - 0.001f;              //卫星变轨后,速度减慢
            

        }else if(distance > SetDitance)
        {
            distance = distance - disSpeed;
            OrbitalTransfer(-disSpeed);
         //   speed = speed + 0.001f;
            
        }

    }
}

在这里我们主要用到了两个判断,即distance和SetDitance,分别代表着飞行器的目前距离以及变轨距离,我们只需要在每一帧内,让系统判断飞行器此时是否目前距离小于变轨距离,则要进行变轨操作,如果大于,则要返回,从而保证飞行器在每一帧内做到自行判断,而不是仅在一帧内的运动。

代码中的两个注释是目前还没有解决的问题,即如何实现飞行器变轨后,速度减慢的问题,因为按照正常逻辑,变轨后的飞行器由于万有引力,速度是要变慢的(高中物理,别问为什么),而变慢是个持续的过程,即在变轨的过程中会持续变慢,目前还没有想出比较好的解决方法(求大牛指导)。以下是效果图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/YuanKY214/article/details/82853600