整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          純CSS也可以實現邊界碰撞檢測?#css

          個視頻來看一個小球碰撞邊界的運動效果。可以看到有一個小球在隨機運動,然后當碰到邊界它就會反彈出去,似乎可以用來做碰撞邊界的檢測。

          想一下這個例子可不可以只用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

          作者:鄧怡超,仿真秀科普作者。

          聲明:原創文章,版權所有,禁止私自轉載,歡迎分享,轉載請聯系我。


          主站蜘蛛池模板: 日本一区二区免费看| 麻豆精品久久久一区二区| 亚洲国产精品成人一区| 韩日午夜在线资源一区二区| 老鸭窝毛片一区二区三区 | 日本高清无卡码一区二区久久| 国产精品视频一区国模私拍| 美女AV一区二区三区| 亚洲韩国精品无码一区二区三区| 人妻无码一区二区三区AV| 爆乳无码AV一区二区三区| 一区二区三区免费视频观看| 色妞色视频一区二区三区四区| 无码人妻精品一区二区三区不卡| 在线免费视频一区二区| 亚洲中文字幕无码一区二区三区| 国产韩国精品一区二区三区久久| 国产无吗一区二区三区在线欢| 中文字幕av无码一区二区三区电影| 国产乱码一区二区三区四| 日韩经典精品无码一区| 在线观看亚洲一区二区| 乱中年女人伦av一区二区| 久久久久人妻精品一区| 精品一区二区三区在线视频观看| 色婷婷综合久久久久中文一区二区| 国产一区二区三区不卡在线看| 国产精品高清一区二区三区| 国产在线精品一区二区在线看| 久久精品一区二区三区资源网| 国产肥熟女视频一区二区三区| 国产精品毛片一区二区三区 | 国产在线观看一区二区三区| 日韩一区二区在线观看视频| 一区二区国产精品| 爆乳无码AV一区二区三区| 精品一区二区三区在线成人| 国产精品第一区第27页| 精品国产一区二区三区香蕉事| 亚洲成在人天堂一区二区| 久久无码精品一区二区三区|