麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

填补空缺!一个开箱即用的 CesiumJS 角色控制器开源了

做三维 GIS 的同学对 CesiumJS 应该都不陌生,数字孪生、智慧城市、实景三维这类项目里它几乎是浏览器端的标配。不过Cesium 本质是个三维地球引擎,不是游戏引擎,一旦项目想做那种"第一/第三人称走进场景里逛一圈"的效果会非常麻烦。Unreal、Unity 这些游戏引擎自带一整套角色控制器,而到了浏览器端的 Cesium,这块基本是空白,需要自己从零去拼物理、碰撞、相机、动画。

最近有人给小编投稿了一个开源库 cesium-player-controller,开箱即用,有这方面需求的可以看看。

PS:下面的内容来自 @航 的投稿

项目简介

cesium-player-controller 是一个基于 CesiumJS 的玩家控制器,MIT 协议开源,已经发布到 npm。它的底层物理基于 Rapier3d,简单说,就是把游戏引擎里那套成熟的"角色控制器"搬进了 Cesium 的 3D Tiles 场景,让你在地球级别的三维场景里也能像玩游戏一样操控一个角色。

官网(GitHub):https://github.com/hh-hang/cesium-player-controller

在线示例:https://hh-hang.github.io/cesium-player-controller/index.html

主要能力

要在 Cesium 里做出第一人称的感觉,难点是碰撞、相机、动画这几块得一件件自己拼。这个项目有意思的地方在于,作者把游戏引擎里那套相对成熟的玩法往 Web 端进行了迁移。地形、glTF 乃至动态物体都能接,第一、第三人称随意切,相机还会自己绕开墙体,不用再手写一堆避障逻辑。支持走跑跳飞这些动作,大场景可按 F 起飞俯瞰。手机端支持虚拟摇杆,键位能改,位置和落地这类回调也留了API。小编觉得它未必每一项都做到极致,但把这条路上常见的能力尽量收进了一个能直接用的包里,对做园区漫游、倾斜摄影巡检这类开发来说,做到省时省力。

安装与上手

安装很简单,把库和 Rapier 一起装上:

npm install cesium-player-controller @dimforge/rapier3d-compat

下面是一份完整的示例:

import {
    Cartesian3,
    Cesium3DTileset,
    Viewer,
    Math as CMath,
    Cartographic,
} from "cesium";
import "cesium/Build/Cesium/Widgets/widgets.css";
import { playerController } from "cesium-player-controller";

// 搭建 CesiumJS 环境
const viewer = new Viewer("cesiumContainer", {
    timeline: false,
    animation: false,
});

// 加载 3D Tiles 场景
const tileset = await Cesium3DTileset.fromUrl("./tileset.json");
viewer.scene.primitives.add(tileset);
await viewer.flyTo(tileset);

// 设置人物出生点
const center = tileset.boundingSphere.center;
const carto = Cartographic.fromCartesian(center);
const initPos = Cartesian3.fromDegrees(
    CMath.toDegrees(carto.longitude),
    CMath.toDegrees(carto.latitude),
    carto.height + 20,
);

// playerController 核心用法
const player = new playerController();

// 人物控制初始化
await player.init({
    viewer,   // Cesium Viewer 实例
    initPos,  // 人物初始坐标,ECEF
    playerModelConfig: {
        url: "./glb/person.glb",   // 模型路径(GLB/GLTF)
        scale: 0.01,               // 模型缩放
        idleAnim: "idle",          // 静止动画名
        walkAnim: "walk",          // 行走动画名
        runAnim: "run",            // 跑步动画名
        jumpAnim: "jump",          // 跳跃动画名;或传 ["起跳", "循环", "落地"] 分三段播放
    },
    // 静态碰撞源
    staticCollider: {
        type: "gltf",
        url: "./glb/agi-hq.glb",
        position: center,
    },
});

// 每帧调用
let last = performance.now();
viewer.scene.preUpdate.addEventListener(() => {
    const now = performance.now();
    const delta = (now - last) / 1000;
    last = now;
    player.update(delta);
});

更细的参数(物理、相机、键位、移动端按钮等)都有默认值,需要时再按字段表逐项调即可,可以参考项目文档进行调整。

配套工具

有一个细节值得一提:由于 CesiumJS 无法通过 CPU 直接拿到 3D Tiles 的顶点坐标,给倾斜摄影、实景三维这类 3D Tiles 场景做碰撞体并不方便。作者为此还配了个工具 collider-forge,专门用来制作碰撞体,跟控制器搭配使用,把这条工作流补全了。

总结

在 CesiumJS 里实现一个完整的角色控制,过去一直是个费力的活儿——物理、碰撞、相机避障、动画状态机,每一块自己写都不轻松,拼在一起更是不小的工程。cesium-player-controller 把这些能力打包成了一个开箱即用的库,常见需求基本一站式覆盖。对于正在做数字孪生、智慧城市漫游、三维场景交互或者实景三维展示的团队来说,它能省下相当一部分从零造轮子的时间。目前项目还处在 0.1.x 的早期阶段,迭代比较活跃,有这个需求的小伙伴可以看下。

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子
没有下文

留言板(小编看到第一时间回复)