<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      three.js實現相機碰撞,相機不穿墻壁、物體

      大家好,本文實現了相機碰撞檢測,使相機不穿墻壁、物體,并給出了思路和代碼,感謝大家~

      關鍵詞:數字孿生、three.js、Web3D、WebGL、相機碰撞、游戲相機

      我正在承接Web3D數字孿生項目,具體介紹可看承接各種Web3D業務

      實現前:
      image

      移動第三人稱相機時,相機可能會穿入到物體、墻壁中,影響視野

      現在進行下面的改進:

      • 只要相機和人物之間有物體,就平滑拉進
      • 如果沒有物體,則恢復默認的距離
      • 如果在拉進時,人物往相機反方向移動,則可以移動到默認的距離而保持相機不動;再遠相機就會跟隨了

      實現后效果如下:
      image

      實現原理

      大概的實現原理如下:

      從人物往相機發送射線,與場景進行相交檢測;
      如果最近相交點小于默認距離,則說明相機被遮擋,將相機沿著相機到人物的方向平滑移動

      代碼:

      import { Raycaster, Scene, Vector3 } from "three"
      
      type cameraVelocity = Vector3
      
      export let handleCameraCollision = (raycaster: Raycaster, scene: Scene, defaultDistance: number, playerWorldPosition: Vector3, cameraCurrentWorldPosition: Vector3): cameraVelocity => {
          let playerToCameraDirection = cameraCurrentWorldPosition.clone().sub(playerWorldPosition).normalize()
      
          raycaster.set(playerWorldPosition, playerToCameraDirection)
      
      
          let intersects = raycaster.intersectObject(scene, true)
      
          let cameraToPlayerDistance = cameraCurrentWorldPosition.clone().distanceTo(playerWorldPosition)
      
          //實現“如果沒有物體,則恢復默認的距離”和“如果在拉進時,人物往相機反方向移動,則可以移動到默認的距離而保持相機不動;再遠相機就會跟隨了”
          if (cameraToPlayerDistance < defaultDistance
              && (
                  intersects.length == 0
                  || intersects[0].distance > cameraToPlayerDistance
              )
          ) {
              let speed
              if (intersects.length == 0 || intersects[0].distance > defaultDistance) {
                  speed = defaultDistance / cameraToPlayerDistance
              }
              else {
                  speed = intersects[0].distance / cameraToPlayerDistance
      
                  if (intersects[0].distance + speed > cameraToPlayerDistance) {
                      speed = 0
                  }
              }
      
      
              return playerToCameraDirection.clone().multiplyScalar(speed)
          }
      
          if (intersects.length == 0 || intersects[0].distance >= cameraToPlayerDistance) {
              return new Vector3(0, 0, 0)
          }
      
          let cameraToPlayerDirection = playerWorldPosition.clone().sub(cameraCurrentWorldPosition).normalize()
          let speed = cameraToPlayerDistance / intersects[0].distance
      
          return cameraToPlayerDirection.multiplyScalar(speed)
      }
      
      
      ...
      
      camera.position.add(handleCameraCollision(...))
      

      參考資料

      【C#】【Unity】第三人稱攝像機跟隨人物移動時碰撞到墻壁等,攝像機不穿越墻壁

      [UE4]第三人稱探索類游戲的鏡頭控制思路與經驗分享

      第三人稱視角游戲的鏡頭全自動控制方案

      Raycaster Collision Detection

      posted @ 2024-04-25 15:53  楊元超  閱讀(824)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久精品国产99久久美女| 三河市| 欧美日本在线一区二区三区| 成全我在线观看免费第二季| 一区二区三区精品偷拍| 天堂在线中文| 亚洲国产一区二区精品专| 亚洲人午夜射精精品日韩| 亚洲国产成熟视频在线多多 | 亚洲成人四虎在线播放| 2021亚洲国产精品无码| 国产精品爽黄69天堂a| 美女人妻激情乱人伦| 亚洲国产女性内射第一区| 成人白浆一区二区三区在线观看| 长子县| 女人喷水高潮时的视频网站| 高清自拍亚洲精品二区| 财经| 亚洲精品岛国片在线观看| 午夜男女爽爽影院免费视频下载| 国产欧美日韩另类在线专区| 少妇撒尿一区二区在线视频| 国内精品自线在拍| 精品欧洲av无码一区二区| 国产午夜精品福利免费不| 亚洲18禁一区二区三区| 亚洲第一成人网站| 粉嫩一区二区三区精品视频| 国产成人一区二区三区免费| 天天躁日日摸久久久精品| 国产精一品亚洲二区在线播放| 久爱www人成免费网站| 精品乱码一区二区三四区视频| 日韩免费码中文在线观看| 在线涩涩免费观看国产精品| 五月天激情国产综合婷婷婷| 九九热在线视频精品免费| 天天爽夜夜爱| 超清无码一区二区三区| 天天爽夜夜爱|