unity兩點之間拋物線,完美金手指


學校享受的日子一去不復還了,嗚嗚。話說面試了幾個公司,真心沒准備好就上了,結果當然是小悲催。還好有容身之處,就算是搬磚,也有可能為自己蓋樓,吼吼。

好,下面我來分享一道有意思的面試題,說他有意思,是因為這個題目的意義很重要的,好了不賣官司了,先看看題目:

三維空間,Y軸朝上,重力加速度為大小為g, 已知A(x1, y1, z1), B(x2, y2, z2)是三維空間中的兩個點,現在從A點發射一個物體,希望該物體經過時間t之后,落在B點,請給出計算發射速度向量。

說到這,請把unity相關的API全部忘記吧,因為這道題是考察物理和幾何的,跟unity API,引擎無關。(話說我面試的公司雖然招unity,可連一句unity的知識都沒問啊!)

怎么做呢?在思考題目的解法之前,我先說說這個目的實用價值,你在做AI的時候絕對用得着。就算不寫AI,拿個簡單的例子,憤怒的小鳥中,可以實現“金手指”功能,給個時間,角度和力度都算出來了,

多神氣啊。再舉個例子,做動態過場動畫的時候,例如需要一發炮彈擊中某物體,如果你寫的炮彈准確度不高,那過場動畫不就完了(當然也有其他方案可以避免),我的意思

就是說,可以使用這個方案實現炮彈的精確打擊,而且一切又是那么自然,有重力,也有拋物線,多美好的軌跡啊!

好吧,我說這么多,就是提醒大家,如果在學習中遇到一些有意思的算法或者功能,可以結合到項目實際中去,這樣的才發揮他的價值。

嗯,是時候寫出答案了。偽代碼如下:

//發射初速度V在X,Y,Z軸的速度分量Vx,Vy,Vz,abs(float value)是絕對值函數

Vx =  abs (x2-x1)   /t;

Vy =abs (y1-y2)/t+(1/2f)gt;

Vz =  abs (y2-y1)    /t;

V =Vector3 (Vx,Vy,Vz);

V就是我們要求的結果。看上去這個式子沒什么大不了的,現在來看看把他怎么放到工程里面吧。

我們自己掌握的變量:時間T,坐標P1,坐標P2,有了這三個,一道完美的軌跡就出現了!

代碼如下:

using UnityEngine;
using System.Collections;

public class TestSpeed : MonoBehaviour {
    public float time=3;//代表從A點出發到B經過的時長
    public Transform pointA;//點A
    public Transform pointB;//點B
    public float g=-10;//重力加速度
    // Use this for initialization
    private Vector3 speed;//初速度向量
    private Vector3 Gravity;//重力向量
    void Start () {

        transform.position = pointA.position;//將物體置於A點
        //通過一個式子計算初速度
        speed = new Vector3((pointB.position.x - pointA.position.x)/time,
            (pointB.position.y-pointA.position.y)/time-0.5f*g*time, (pointB.position.z - pointA.position.z) / time);
        Gravity = Vector3.zero;//重力初始速度為0
    }
    private float dTime=0;
    // Update is called once per frame
    void FixedUpdate () {

        Gravity.y = g * (dTime += Time.fixedDeltaTime);//v=at
        //模擬位移
        transform.Translate(speed*Time.fixedDeltaTime);
        transform.Translate(Gravity * Time.fixedDeltaTime);
    }
}

點擊運行之前,先將A,B兩點賦值。然后運行,一個完美的曲線就此划下。

 本文鏈接:http://www.cnblogs.com/jqg-aliang/p/4806017.html,轉載請申明出處,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM