學校享受的日子一去不復還了,嗚嗚。話說面試了幾個公司,真心沒准備好就上了,結果當然是小悲催。還好有容身之處,就算是搬磚,也有可能為自己蓋樓,吼吼。
好,下面我來分享一道有意思的面試題,說他有意思,是因為這個題目的意義很重要的,好了不賣官司了,先看看題目:
三維空間,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,轉載請申明出處,謝謝!
