Unity游戏开发的数学与物理 4 ( 在物体运动中加入重力 )

在物体运动中加入重力

实现注意:

  • 使用级数叠加算法
  • y += vy; //对位置上的加速度
  • vy += GR; //速度上的加速度
  • GR为重力加速度,在计算机中使用的加速度单位是特殊的dot/F^2 (像素/平方帧),而不是9.8 m/s^2 (米/平方秒)
  • 微分是一种操作,是一种求微分系数的操作, 而微分系数是指函数关于某个值的变化率,这个概念在游戏开发中经常被用来考察某个函数变化的速度; f(x)关于x的变化率,基本的微分公式
  • d/dx(x) = 1
  • d/dx(x^2) = 2x
  • d/dx(x^3) = 3x
  • d/dx(x^n) = nx^(n-1)
  • d/dx(sin x) = cos x
  • d/dx(cos x) = -sin x
  • 合成函数的微分,可以看做“对函数中又包含另一层函数的等式进行微分, 可以将其转化为对外层函数的微分乘以对内层函数的微分”
  • 级数,就是将一个数列的每一项加起来得到的结果
  • 积分与级数有相似的部分,从形式上来看是微分的逆运算
  • 使用积分制作的抛物运动程序
  • x = vx * t;
  • y = (0.5f * GR * t * t) + (vy * t) + 200.0f;

  • 以下代码使用积分制作抛物线

using UnityEngine;
using System.Collections;

//在物体运动中加入重力
public class ParabolicMotionTest : MonoBehaviour 
{
    //物体的X位置
    float posX = 0;

    //物体的Y位置
    float posY = 0;

    //物体在x方向上的速度
    float speedX = 0;

    //物体在y方向上的速度
    float speedY = -8;

    //屏幕的右上像素在世界空间的坐标
    Vector3 ScreenRightTopPos;

    //屏幕的左下像素在世界空间的坐标
    Vector3 ScreenLeftBottomPos;

    //box的半宽度
    float boxHalfWidth;

    //运行时间
    float runTime;

    //重力加速度
    const float GR = 0.4f;

    //物体出生位置
    Vector2 bornPos;

    void Start()
    {
        //将屏幕右上的像素转换为世界空间的坐标
        ScreenRightTopPos = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0));

        //将屏幕右下的像素转换为世界空间的坐标
        ScreenLeftBottomPos = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, 0));

        //box的半宽度,因为box是正方形
        boxHalfWidth = transform.localScale.x * 0.5f;

        //出生位置 左上角
        bornPos = new Vector2(ScreenLeftBottomPos.x + boxHalfWidth, ScreenRightTopPos.y - boxHalfWidth);

        //初始位置屏幕左上角
        transform.localPosition = new Vector3(bornPos.x, bornPos.y, 0);
    }

    void Update()
    {
        //检测,如果物体出了界面,让其重新到bornPos点
        if (posX - boxHalfWidth >= ScreenRightTopPos.x
            || posX + boxHalfWidth <= ScreenLeftBottomPos.x
            || posY - boxHalfWidth >= ScreenRightTopPos.y
            || posY + boxHalfWidth <= ScreenLeftBottomPos.y)
        {
            //屏幕左上角
            posX = bornPos.x;
            posY = bornPos.y;

            //运行时间归0
            runTime = 0;
        }

        //x方向每帧时间内的位移到的值
        posX = speedX * runTime;

        //y方向每帧时间内的位移到的值
        posY =(0.5f * GR * runTime * runTime) + (speedY * runTime) + bornPos.y;

        //时间的改变值
        runTime += Time.deltaTime;

        //设置该帧的位置
        transform.localPosition = new Vector3(posX, posY, 0);
    }
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。