個視頻來看一個小球碰撞邊界的運動效果。可以看到有一個小球在隨機運動,然后當碰到邊界它就會反彈出去,似乎可以用來做碰撞邊界的檢測。
想一下這個例子可不可以只用CSS來做?其實是可以的,但是這里它并不算是邊界檢測,又或者說它只能檢測到整個窗口的邊界,然后反彈。如果是有其它元素,想檢測和其它元素有沒有發生碰撞,用CSS就很難實現了。
先來看一下這個demo,現在非常簡單,就寫了一個div,然后給它一些基本的樣式,用來模擬這個小球。
接下來就要想一下,怎么樣可以讓這個小球動起來?無非就是給它添加一個動畫對吧?這個動畫應該控制哪些屬性發生變化,可以讓這個小球動起來呢?是不是控制這兩個屬性?
先來控制水平方向的運動,也就是left,因為初始狀態就是讓它從0開始。CSS上面設置的也是0,所以from可以省略不寫,只寫吐就行了。結束的狀態是讓小球運動到邊界。這里可以用一個計算的函數,水平方向用整個視口的寬度,再減去小球自身的寬度,再把這個動畫給它綁定到小球上面,這樣小球它就可以動起來了。
但是它只是往一個方向來動并沒有反彈的效果,要讓小球反彈的也很簡單,給它加一個alternate,當動畫執行到最后狀態的時候,再反過來執行就可以了。看一下,小球運動到邊界它就反彈了,但是現在只是水平方向的運動,還要加上垂直方向的運動。
垂直方向和水平方向原理是一樣的,給它復制一下,再改一下動畫的名稱,left改成top,視口的寬度就改成視口的高度,再把這個動畫綁定上去。這里名稱再改一下,看一下效果。現在確實水平和垂直方向同時在運動了,但是它只是往對角線運動,沒有一種隨機彈跳的效果。
怎么樣可以讓這個運動不要那么規律?不要只是往對角線來運動,看起來有一些隨機性。這里也很簡單,只要讓這兩個動畫完成的時間稍微錯開一點就可以了。
→比方水平方向的給它3.6秒,垂直方向就2.3秒,看一下最終的效果。現在的運動就不是只往對角線來運動了,看起來有一定的隨機性,然后運動到邊界就可以回彈過來。
這個視頻就到這里,感謝大家的收看。
<!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <title>彈球</title> <script src="https://code.jquery.com/jquery-3.3.1.js"></script> </head> <body> <canvas id="canvas" width="400" height="400"></canvas> <script> // 全局canvas let canvas = document.getElementById("canvas"); let context = canvas.getContext("2d"); // 彈球對象 class Ball{ x = 100; y = 40; xSpeed = -2; ySpeed = -2; constructor(){}; getX(){ return this.x; } getY(){ return this.y; } setX(x){ this.x = x; } setY(y){ this.y = y; } getXSpeed(){ return this.xSpeed; } setXSpeed(xSpeed){ this.xSpeed = xSpeed; } getYSpeed(){ return this.ySpeed; } setYSpeed(ySpeed){ this.ySpeed = ySpeed; } // 繪制小球的方法 draw = () => { context.beginPath(); context.arc(this.x, this.y, 10, 0, Math.PI * 2, false); context.strokeRect(0, 0, 400, 400); context.fill(); }; // 移動操作 move = () => { this.x = this.x + this.xSpeed; this.y = this.y + this.ySpeed; }; // 邊緣檢測,碰撞檢測 checkCanvas = (panel) => { // 左右 if(this.x < 5 || this.x > 400 - 5){ this.xSpeed = -this.xSpeed; } // 上方 if(this.y < 0){ this.ySpeed = -this.ySpeed; } // 下方 // 碰到擋板 if(this.y > 390 - 10){ if(this.x > panel.x && this.x < panel.xSize + panel.x){ this.ySpeed = -this.ySpeed; }else{ alert("游戲結束"); this.x = 100; this.y = 10; } } } } // 增加一個擋板對象 class Panel{ constructor(){}; // 左x x = 200; // 左y y = 390; // 長度 xSize = 50; // 寬度 ySize = 5; draw(){ context.fillRect(this.x, this.y, this.xSize, this.ySize); } } // 創建出一個小球對象 let ball = new Ball(); // 創建出擋板對象 let panel = new Panel(); // 每10秒為一幀 window.setInterval(() => { // 清空畫布 context.clearRect(0, 0, 400, 400); // 畫出小球 ball.draw(); // 畫出擋板 panel.draw(); // 移動 ball.move(); // 進行邊界判斷 ball.checkCanvas(panel); },10); // 控制擋板 $("body").keydown((event) => { if(event.keyCode == 37){ panel.x = panel.x - 5; // 移出邊界問題處理 if(panel.x < 0){ panel.x = 0; } } if(event.keyCode == 39){ panel.x = panel.x + 5; // 移出邊界處理 if(panel.x + panel.xSize > 400){ panel.x = 400 - panel.xSize; } } }) </script> </body> </html>
這就是倆對象,,一個依賴于另一個。。
碰撞檢測時實的坐標判斷,碰撞完成以后兩個速度分量為取反即可。
事件是左右事件。。移動即可。
需要時實刷新,即,幀的概念
爾夫球的設計環節會有樣品沖擊測試,以便了解產品在沖擊作用下的響應。
高爾夫球的球體一般會有2~5層,分別采用不同材料,利用球體結構的剛度分布,來影響球的操控性。根據網上搜到的試驗數據與材料參數,使用Abaqus對試驗中的3層球進行撞擊響應建模分析。球體按層切分,并賦予指定材料的截面屬性。
通過Abaqus/Explicit分析的高爾夫球沖擊過程中的應力以及速度云圖如下:
對于球體在球桿打擊作用下的響應(速度與旋轉速率),在設計環節也會進行大量的計算分析,通常會計算球桿不同表面特征(U型開槽、V型開槽)下的出球響應。
如下圖所示,設計部門在仿真前期會做一些基于試驗參數的對標工作,以矯正仿真分析時高應變率條件下的材料本構模型參數。
在參數修正的基礎上,再進行仿真計算,以更準確地對高爾夫球的動態響應進行預測,從而指導產品設計,縮短研發周期。對標后的仿真基本上可以做到和高速攝影同步。
現在再來談談,球面上的凹槽怎么回事。上面提到高爾夫球的出球響應中,有個變量是旋轉速率,原來,球在飛行的過程中,不同旋轉速率下,由于凹凸的氣動外形,導致球體產生氣動阻力、升力是完全不一樣的,這也就決定了高爾夫球的運動軌跡。
對于高速飛行的高爾夫球,凹凸的表面會導致湍流,影響球體受力,下面這個視頻是Youtube上ID為CFD Support的團隊通過OpenFOAM計算的不同旋轉速率條件下高爾夫球的升力和阻力系數。有沒有旋轉,差別還是挺顯著的,所以球桿的擊球面要開槽,這樣在出球時,球才會更容易轉起來。
https://v.qq.com/x/page/n0660gsrpd2.html
作者:鄧怡超,仿真秀科普作者。
聲明:原創文章,版權所有,禁止私自轉載,歡迎分享,轉載請聯系我。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。