Babylon.js学习之路《添加自定义摇杆控制相机》

文章目录


前言

在 Babylon.js 中,经常需要使用摇杆 来控制相机的移动。

比如移动端,类似王者荣耀控制英雄移动的摇杆。

经过对比,我发现一种非常简洁、高效的实现方式。


实现方法

1、定义挂载DOM、摇杆样式

首先,定义摇杆的DOM挂载节点,以及摇杆的样式

这里直接使用Html、css实现,比较简单

定义摇杆的DOM挂载节点

javascript 复制代码
<div id="joystick-container"></div>

定义摇杆样式

css 复制代码
:deep(#joystick-container) {
    width: 100%;
    div {
        width: 100%;
        .front {
            opacity: 0.8 !important;
            background-image: url("../../assets/images/step.png") !important;
            background-size: cover !important;
            user-select: none !important;
        }
        .back {
            opacity: 0.8 !important;
            background: none !important;
            background-image: url("../../assets/images/rocker.png") !important;
            background-size: cover !important;
            user-select: none !important;
        }
    }
}

2、引入插件"nipplejs"

使用nipplejs插件

javascript 复制代码
import nipplejs from 'nipplejs'
import { onJoystickMove } from './index'

let lastpx
let lastpy
let xAddPos
let yAddPos
let touch_isDown = false
let translateTransform;

export const initNipplejs = (width) => {
  const joystickContainer = document.getElementById("joystick-container");
  const option = {
      zone: joystickContainer,
      mode: "static", // 静态模式,摇杆固定在屏幕上
      position: { top: "90%", left: "50%" }, // 摇杆的初始位置
      follow: false,
      size: width / 2
  }
  // 初始化虚拟摇杆
  const joystick = nipplejs.create(option);
  joystick.on("start", function (evt, data) {
      touch_isDown = true
      lastpx = data.position.x;
      lastpy = data.position.y;
      // 摇杆移动事件,可以加入其他逻辑代码
      onJoystickMove()
    })
    .on("move", function (evt, data) {
      // direction有不存在的情况
      if (data.direction && touch_isDown) {
        xAddPos = Math.round(lastpx - data.position.x)
        yAddPos = Math.round(lastpy - data.position.y)
      }
    })
    .on("end", function (evt, data) {
      touch_isDown = false
      xAddPos = 0
      yAddPos = 0
    });
    window.scene.registerBeforeRender(function() {
      if (!xAddPos || !yAddPos) return
      //移动速度调整
      window.camera.target.x += yAddPos * -1;
      window.camera.target.z += xAddPos * -1;
    })
    return joystick
}

在场景渲染完成后,添加摇杆

javascript 复制代码
// baseWidth为摇杆尺寸,我这里以参数传递
scene.onAfterRenderObservable.addOnce(() => {
   rockerControl = initNipplejs(baseWidth);
})

总结

之所以使用这个插件,是因为我之前手写的摇杆有些问题:

当鼠标超出摇杆范围时,相机移动的方向就固定在鼠标移动出摇杆范围之前的方向了。

也就是当我向右操控摇杆,鼠标滑出摇杆范围时,再向其他拖动,相机依然向右移动。

遇到这个问题后,我发现要加的代码很多,不如直接使用nipplejs插件,完美解决问题

对你有帮助的话,还请不要吝啬收藏

这也是我写作的动力【抱拳】

相关推荐
张元清1 小时前
React useResizeObserver Hook:追踪元素尺寸变化(2026)
javascript·react.js
瑞瑞小同学4 小时前
处理echarts x轴内容过多,重叠问题
前端·javascript·echarts
像我这样帅的人丶你还4 小时前
MCP + npm:给五年前的老系统接上AI
前端·javascript·agent
hoLzwEge6 小时前
前端环境变量配置指南:.env 文件详解
前端·前端框架
猫头_6 小时前
AI 流式传输工程指南:有了 EventSource 为何还要 Fetch?
javascript·http·llm
良木林7 小时前
滑动窗口 - LeetCode hot 100
javascript·算法·leetcode·双指针·滑动窗口
不简说9 小时前
# JS 代码技巧 vol.7 — 20 个浏览器 API 实战,自带 API 能干的事别自己封装
前端·javascript·面试
Hilaku9 小时前
为什么 Cloudflare 能做到毫秒级冷启动,而其它云厂商却不行?
前端·javascript·程序员
名字还没想好☜9 小时前
React useLayoutEffect vs useEffect:页面闪一下的元凶与正确修法
前端·javascript·react.js·react·hooks
2301_794461579 小时前
JavaScript 基础知识点详解
前端·javascript·html