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插件,完美解决问题

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

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

相关推荐
传奇开心果编程2 小时前
【xilem0.4基础语法学与练】第13课:Xilem 0.4 最简短代码体现“一切皆设计图“
学习·rust·前端框架
李少兄3 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
shmily麻瓜小菜鸡6 小时前
JS/TS 易踩坑知识点 — 模块化与工程化类
开发语言·javascript·ecmascript
默_笙8 小时前
🍕 AI 的嘴巴装了水管(上):从"等它说完"到"边说边听"的流式输出指南
前端·javascript
暖焰核心8 小时前
继承全解——继承、默认成员函数、切片、隐藏与虚继承
java·前端·javascript
艾伦野鸽ggg9 小时前
前端异步请求的状态竞争(请求竞态)问题
前端·javascript·axios
是立不是利9 小时前
前端交互基石:深入剖析JavaScript三级联动背后的设计哲学
开发语言·前端·javascript
老刘的望远镜9 小时前
AgentScope Java 从零(03):Agent 的记性默认全开,我在第 50 轮翻了车
java·开发语言·javascript
软件黑马王子10 小时前
20.Resources资源加载:基本实现
开发语言·前端框架·c#
前端精髓10 小时前
React 更新 state 中的对象
javascript·react.js·ecmascript