遊戲中掉落效果的實現

2021-07-09 18:37:25 字數 3344 閱讀 6844

1. 計算運動引數

運動特徵: 豎直方向受到重力作用,水平方向有空氣阻力作用

第一種情況: 起拋點位置和掉落點位置處於同一水平面中。已知開始拋起的點位置和掉落目標位置,由此可以求出兩點之間的距離 distance;

運動軌跡如下所示:

①根據rand 函式產生出[0,1]之間的數值,作為運動總的時間。並且heigt 也可以根據則會個隨機值擴大些,作為運動的高度

t = seed()

height = 16 * seed() * seed();

②根據 sv/2 * t/2 = heght, 可以求出 sv

sv = 4*height / 4

③ 根據 sv = g * (t/2)  . 求出

g= 2*sv /t;

④ 假設,水平方向,受到空氣阻力的作用,速度會減少,減少到 0.75 sh, 則根據水平方向速度距離關係,可以推導

(sh + 0.75 sh)/2 * t = distance       =>     sh = (8/7) * distance /  t 

進一步,可以知道水平方向的減速度

hg = 0.25* sh / t

這樣,就可以實時計算出運動的位置了

vector3 tdist = dirdistance * (initspeedh * t - 0.5f * hvelocity * t * t);

tdist.y += initspeedv * t- gvelocity * t * t * 0.5f;

第二種情況:起跑點和掉落點不是處於同一水平面中

這個時候,需要把紅色部分給加上來,才是完整的運動軌跡。即確定紅色那部分運動時間,以及水平方向運動距離

① 第一種情況中的①②③ ,因為計算都是用的運動的前半部分,都是一樣的。根據y 的差值結合計算出來變數,可以知道花費的時間

tadd= math::pow(2 * △y / g,  0.5f);

② 整個運動時間,也要加上剛才計算出來的時間

t = t + tadd;

③ 同樣

假設,水平方向,受到空氣阻力的作用,速度會減少,減少到 0.75 sh, 則根據水平方向速度距離關係,可以推導

(sh + 0.75 sh)/2 * (t+tadd) = distance       =>     sh = (8/7) * distance /  (t+tadd) 

進一步,可以知道水平方向的減速度

hg = 0.25* sh /(t+tadd) 

這樣,就可以實時計算出運動的位置了

vector3 tdist = dirdistance * (initspeedh * t - 0.5f * hvelocity * t * t);

tdist.y += initspeedv * t- gvelocity * t * t * 0.5f;

第三種情況 如下所示,掉落到坑里去了;此時,同樣需要計算出那部分運動的時間,tmus, 並減去這部分時間,來計算水平方向的減速度

原始碼如下:

bool goodsfalleffect::calcdata(vector3 & startpos,vector3 & endpos)

mcontext.dirdistance = endpos - startpos;

float length = mcontext.dirdistance.length();

mcontext.dirdistance.normalize();

float cx = length;

float cy = 0;

float seed = rnd();

float height =10*seed *seed;//*math::pow(seed,0.5f);;

float t= seed; // second units

float n = 2 * height; //得到解

if (cx > 0)

else

else

}} else

vector3 tdist = mcontext.dirdistance *(mcontext.initspeedh * t *0.5f - 0.5f * mcontext.hvelocity * 0.5f * t * 0.5f * t);

mcontext.rotateaxis= vector3(height * mcontext.dirdistance.z - tdist.z * mcontext.dirdistance.y, tdist.z * mcontext.dirdistance.x - tdist.x * mcontext.dirdistance. z, tdist.x * mcontext.dirdistance.y - height *mcontext.dirdistance. x);

return true;

}

2. 旋轉運動引數計算好了,需要控制物品的的旋轉,模擬自然物品拋起來的自轉。此時採用四元數的旋轉,關鍵在於旋轉軸的選擇。

這裡我們選擇拋物線所在平面的法向量作為旋轉軸。 取拋物線上兩個點向量做叉乘,此處選擇最高點和水平點;

vector3 tdist = dirdistance *(initspeedh * t *0.5f - 0.5f * hvelocity * 0.5f * t * 0.5f * t);

rotateaxis= vector3(height * dirdistance.z - tdist.z * dirdistance.y, tdist.z * dirdistance.x - tdist.x * dirdistance. z, tdist.x * dirdistance.y - height *dirdistance. x);

...node->rotate(mcontext.rotateaxis,mangle);

3. 大小變化控制拋起過程中物品的逐漸變大,下降過程中的逐漸減小

配置檔案中配置物品拋起來剛開始的minsize,最高點的maxsize, 如果上公升中,即運動時間runtime < t/2   ; 既可以

if(mruntime < maxhighttime)
同樣的下降過程中也是可以類似的處理。

最後貼幾張圖。。

遊戲中的光影效果

好久沒有更新過博克了,春節的最後一天更新一下,寫一下關於遊戲中關於光影效果的方法,以及我的實現.關於遊戲中的光照,就目前來看大致兩種方式,一種是unreal的與渲染光照貼圖 shadowmap,另一種則是crysis的完全實時光影。效果上都不錯,下面來簡單分析一下。在討論之前先要明確一點,遊戲中的光...

遊戲中的遮擋透明效果實現

很多時候我們玩一些鎖視角遊戲都能遇到一些障礙物遮擋視野的問題。但是很多時候他們被我們自然而然地忽略掉了。但是沒有這個功能,鎖視角遊戲將會體驗很差。所以很多時候我們需要將擋視角的物體透明化。不過本文並不是基於shader的正常實現方式,所以僅僅是參考。public gameobject player ...

遊戲中的定時重新整理實現方式

情景1 現在有乙個道具商店,共有10個道具可購買。玩家可使用某道具或鑽石重新整理道具商店中的道具,或者系統會每隔2小時贈送一次重新整理次數。問題1 如何實現間隔2小時實時重新整理?from datetime import datetime defcal count timestamp now dt ...