Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
個(gè)視頻來看一個(gè)小球碰撞邊界的運(yùn)動(dòng)效果。可以看到有一個(gè)小球在隨機(jī)運(yùn)動(dòng),然后當(dāng)碰到邊界它就會(huì)反彈出去,似乎可以用來做碰撞邊界的檢測(cè)。
想一下這個(gè)例子可不可以只用CSS來做?其實(shí)是可以的,但是這里它并不算是邊界檢測(cè),又或者說它只能檢測(cè)到整個(gè)窗口的邊界,然后反彈。如果是有其它元素,想檢測(cè)和其它元素有沒有發(fā)生碰撞,用CSS就很難實(shí)現(xiàn)了。
先來看一下這個(gè)demo,現(xiàn)在非常簡(jiǎn)單,就寫了一個(gè)div,然后給它一些基本的樣式,用來模擬這個(gè)小球。
接下來就要想一下,怎么樣可以讓這個(gè)小球動(dòng)起來?無非就是給它添加一個(gè)動(dòng)畫對(duì)吧?這個(gè)動(dòng)畫應(yīng)該控制哪些屬性發(fā)生變化,可以讓這個(gè)小球動(dòng)起來呢?是不是控制這兩個(gè)屬性?
先來控制水平方向的運(yùn)動(dòng),也就是left,因?yàn)槌跏紶顟B(tài)就是讓它從0開始。CSS上面設(shè)置的也是0,所以from可以省略不寫,只寫吐就行了。結(jié)束的狀態(tài)是讓小球運(yùn)動(dòng)到邊界。這里可以用一個(gè)計(jì)算的函數(shù),水平方向用整個(gè)視口的寬度,再減去小球自身的寬度,再把這個(gè)動(dòng)畫給它綁定到小球上面,這樣小球它就可以動(dòng)起來了。
但是它只是往一個(gè)方向來動(dòng)并沒有反彈的效果,要讓小球反彈的也很簡(jiǎn)單,給它加一個(gè)alternate,當(dāng)動(dòng)畫執(zhí)行到最后狀態(tài)的時(shí)候,再反過來執(zhí)行就可以了??匆幌拢∏蜻\(yùn)動(dòng)到邊界它就反彈了,但是現(xiàn)在只是水平方向的運(yùn)動(dòng),還要加上垂直方向的運(yùn)動(dòng)。
垂直方向和水平方向原理是一樣的,給它復(fù)制一下,再改一下動(dòng)畫的名稱,left改成top,視口的寬度就改成視口的高度,再把這個(gè)動(dòng)畫綁定上去。這里名稱再改一下,看一下效果?,F(xiàn)在確實(shí)水平和垂直方向同時(shí)在運(yùn)動(dòng)了,但是它只是往對(duì)角線運(yùn)動(dòng),沒有一種隨機(jī)彈跳的效果。
怎么樣可以讓這個(gè)運(yùn)動(dòng)不要那么規(guī)律?不要只是往對(duì)角線來運(yùn)動(dòng),看起來有一些隨機(jī)性。這里也很簡(jiǎn)單,只要讓這兩個(gè)動(dòng)畫完成的時(shí)間稍微錯(cuò)開一點(diǎn)就可以了。
→比方水平方向的給它3.6秒,垂直方向就2.3秒,看一下最終的效果?,F(xiàn)在的運(yùn)動(dòng)就不是只往對(duì)角線來運(yùn)動(dòng)了,看起來有一定的隨機(jī)性,然后運(yùn)動(dòng)到邊界就可以回彈過來。
這個(gè)視頻就到這里,感謝大家的收看。
<!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"); // 彈球?qū)ο? 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(); }; // 移動(dòng)操作 move = () => { this.x = this.x + this.xSpeed; this.y = this.y + this.ySpeed; }; // 邊緣檢測(cè),碰撞檢測(cè) 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("游戲結(jié)束"); this.x = 100; this.y = 10; } } } } // 增加一個(gè)擋板對(duì)象 class Panel{ constructor(){}; // 左x x = 200; // 左y y = 390; // 長(zhǎng)度 xSize = 50; // 寬度 ySize = 5; draw(){ context.fillRect(this.x, this.y, this.xSize, this.ySize); } } // 創(chuàng)建出一個(gè)小球?qū)ο? let ball = new Ball(); // 創(chuàng)建出擋板對(duì)象 let panel = new Panel(); // 每10秒為一幀 window.setInterval(() => { // 清空畫布 context.clearRect(0, 0, 400, 400); // 畫出小球 ball.draw(); // 畫出擋板 panel.draw(); // 移動(dòng) ball.move(); // 進(jìn)行邊界判斷 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>
這就是倆對(duì)象,,一個(gè)依賴于另一個(gè)。。
碰撞檢測(cè)時(shí)實(shí)的坐標(biāo)判斷,碰撞完成以后兩個(gè)速度分量為取反即可。
事件是左右事件。。移動(dòng)即可。
需要時(shí)實(shí)刷新,即,幀的概念
爾夫球的設(shè)計(jì)環(huán)節(jié)會(huì)有樣品沖擊測(cè)試,以便了解產(chǎn)品在沖擊作用下的響應(yīng)。
高爾夫球的球體一般會(huì)有2~5層,分別采用不同材料,利用球體結(jié)構(gòu)的剛度分布,來影響球的操控性。根據(jù)網(wǎng)上搜到的試驗(yàn)數(shù)據(jù)與材料參數(shù),使用Abaqus對(duì)試驗(yàn)中的3層球進(jìn)行撞擊響應(yīng)建模分析。球體按層切分,并賦予指定材料的截面屬性。
通過Abaqus/Explicit分析的高爾夫球沖擊過程中的應(yīng)力以及速度云圖如下:
對(duì)于球體在球桿打擊作用下的響應(yīng)(速度與旋轉(zhuǎn)速率),在設(shè)計(jì)環(huán)節(jié)也會(huì)進(jìn)行大量的計(jì)算分析,通常會(huì)計(jì)算球桿不同表面特征(U型開槽、V型開槽)下的出球響應(yīng)。
如下圖所示,設(shè)計(jì)部門在仿真前期會(huì)做一些基于試驗(yàn)參數(shù)的對(duì)標(biāo)工作,以矯正仿真分析時(shí)高應(yīng)變率條件下的材料本構(gòu)模型參數(shù)。
在參數(shù)修正的基礎(chǔ)上,再進(jìn)行仿真計(jì)算,以更準(zhǔn)確地對(duì)高爾夫球的動(dòng)態(tài)響應(yīng)進(jìn)行預(yù)測(cè),從而指導(dǎo)產(chǎn)品設(shè)計(jì),縮短研發(fā)周期。對(duì)標(biāo)后的仿真基本上可以做到和高速攝影同步。
現(xiàn)在再來談?wù)?,球面上的凹槽怎么回事。上面提到高爾夫球的出球響?yīng)中,有個(gè)變量是旋轉(zhuǎn)速率,原來,球在飛行的過程中,不同旋轉(zhuǎn)速率下,由于凹凸的氣動(dòng)外形,導(dǎo)致球體產(chǎn)生氣動(dòng)阻力、升力是完全不一樣的,這也就決定了高爾夫球的運(yùn)動(dòng)軌跡。
對(duì)于高速飛行的高爾夫球,凹凸的表面會(huì)導(dǎo)致湍流,影響球體受力,下面這個(gè)視頻是Youtube上ID為CFD Support的團(tuán)隊(duì)通過OpenFOAM計(jì)算的不同旋轉(zhuǎn)速率條件下高爾夫球的升力和阻力系數(shù)。有沒有旋轉(zhuǎn),差別還是挺顯著的,所以球桿的擊球面要開槽,這樣在出球時(shí),球才會(huì)更容易轉(zhuǎn)起來。
https://v.qq.com/x/page/n0660gsrpd2.html
作者:鄧怡超,仿真秀科普作者。
聲明:原創(chuàng)文章,版權(quán)所有,禁止私自轉(zhuǎn)載,歡迎分享,轉(zhuǎn)載請(qǐng)聯(lián)系我。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。