基于WebGL架构的3D可视化平台—实现汽车行走路线演示

简介:  小车行走路线演示New VS Old刚接触ThingJS的时候,写的一个小车开进小区的演示,今天又看了教程中有movePath这个方法就重新写了一遍,其中也遇到了一些问题,尤其突出的问题就是小车过弯的尴尬表现。

 

 

小车行走路线演示New VS Old

刚接触ThingJS的时候,写的一个小车开进小区的演示,今天又看了教程中有movePath这个方法就重新写了一遍,其中也遇到了一些问题,尤其突出的问题就是小车过弯的尴尬表现。

先给大家看看Old版本,Old版演示地址。
在这里插入图片描述


再看看New版本,AE86过弯不再笨拙顺畅无比,New版演示地址。
在这里插入图片描述

第二张效果图上可以看到由点连起来的路线,我的AE86也是严格按照路线行进的,相比于Old版本过弯的时候舒畅多了。Old版本是用setTimout(),rotateY(),moveTo()方法设置了几个点跑出来的。New版本放弃了这种办法,这种过弯实在让人看着不舒服,也不符合现实世界(排除醉酒驾驶司机)。下面就说一下New版本。

第一步,进入ThingJS在线开发,将场景地址替换成我们今天要用的,也可以自己去搭一个场景,campusBuilder下载地址

/**
 * 说明:创建App,url为场景地址(可选)
 */
var app = new THING.App({
	//场景地址
    url: 'http://www.thingjs.com/./uploads/wechat/oLX7p05lsWJZUIxnIWsNXAzJ40X8/scene/2018-10-30-17-20-23'     
});

  第二步,在模型库里挑选一个你喜欢的车,种类丰富任你选择。

app.create({ 
   type: 'Car', 
   name: 'Car01',
   angle: 90, // 旋转 
   //这里我选了一台黑车,没找到AE86
   url: 'http://model.3dmomoda.cn/models/c6ed424627234a298c1921950eb8534c/0/gltf/', 
   //位置
   position: [-32, 0, 26.2],
   complete: function () {
       console.log('Black Car !');
   }
});

  

第三步,创建小车的行进路线和演示按钮。

app.on('load', function () {

    // 创建blackCar行进路线
    var points = [];
    for (var x = -32, y = 0, z = 26.2 ; x <= 28; x += 4) {
        points.push([x, y, z]);
    }
    var radius = 1.75;
    for (var degree = 0, y = 0; degree <= 180; degree += 20) {
        var x = Math.sin(degree * 2 * Math.PI / 360) * radius + 28.5;
        var z = Math.cos(degree * 2 * Math.PI / 360) * radius + 24.45;
        points.push([x, y, z]);
    }
    for (var x = 27.5, y = 0, z = 22.7 ; x >= -6; x -= 4) {
        points.push([x, y, z]);
    }
    for (var degree = 0, y = 0; degree >= -90; degree -= 20) {
        var x = Math.sin(degree * 2 * Math.PI / 360) * radius -5.5;
        var z = Math.cos(degree * 2 * Math.PI / 360) * radius + 20.95;
        points.push([x, y, z]);
    }
    for (var x = -7.2, y = 0, z = 20.25 ; z >= 6; z -= 2) {
        points.push([x, y, z]);
    }

    //创建轨迹线
    line = app.create({
        type: 'Line',
        color: 0xFFFF00, // 轨迹线颜色
        dotSize: 2, // 轨迹点的大小
        points: points,
    })
    
     THING.widget.Button('车辆路线', play);
});

  最后一步,让小车动起来创建play()方法。

function play() {
    var car = app.query('Car01')[0];
    car.movePath({
        'path': line.points, // 轨迹路线
        'time': 10000, // 移动时间
        'orientToPath': true, 
    });
    app.camera.lookAt(car);
    
    // app.camera.followObject({
    //     object:car,
    // });
}

  做到这里小车已经可以动起来了,但是这个视角并不好,下面介绍一下摄像机中的followObject(params)。
API地址

创建一个Car类继承THING.BaseObject,将物体类型转换成Car类型

//创建Car类
class Car extends THING.BaseObject{
    constructor(app) {
        super(app);
    }
}
THING.Utils.addCastType('Car', /Car/);  
THING.factory.registerClass('Car', Car);

  

//加到play()
app.camera.followObject({
        object:car,
    });

  下图是加了摄像机跟随物体的效果
跟随物体
短短80行代码,其中我也遇到了不少问题划重点的就是app.camera.followObject()中object的类型问题,还有就是模型库里有一些车的模型比较奇怪,比如下图。
在这里插入图片描述
以下是完整代码

//加载场景代码
var app = new THING.App({ 
    // 场景地址
    "url": "http://www.thingjs.com/./uploads/wechat/oLX7p05lsWJZUIxnIWsNXAzJ40X8/scene/2018-10-30-17-20-23",
    //背景设置
    
});

// 创建Car
app.create({ 
   type: 'Car', 
   name: 'Car01',
   angle: 90, // 旋转 
   url: 'http://model.3dmomoda.cn/models/c6ed424627234a298c1921950eb8534c/0/gltf/', 
   //位置
   position: [-32, 0, 26.2],
   complete: function () {
       console.log('Black Car !');
   }
});
//创建Car类
class Car extends THING.BaseObject{
    constructor(app) {
        super(app);
    }
}
THING.Utils.addCastType('Car', /Car/);  
THING.factory.registerClass('Car', Car);

person.on('load',function())

app.on('load', function () {

    // 创建blackCar行进路线
    var points = [];
    for (var x = -32, y = 0, z = 26.2 ; x <= 28; x += 4) {
        points.push([x, y, z]);
    }
    var radius = 1.75;
    for (var degree = 0, y = 0; degree <= 180; degree += 20) {
        var x = Math.sin(degree * 2 * Math.PI / 360) * radius + 28.5;
        var z = Math.cos(degree * 2 * Math.PI / 360) * radius + 24.45;
        points.push([x, y, z]);
    }
    for (var x = 27.5, y = 0, z = 22.7 ; x >= -6; x -= 4) {
        points.push([x, y, z]);
    }
    for (var degree = 0, y = 0; degree >= -90; degree -= 20) {
        var x = Math.sin(degree * 2 * Math.PI / 360) * radius -5.5;
        var z = Math.cos(degree * 2 * Math.PI / 360) * radius + 20.95;
        points.push([x, y, z]);
    }
    for (var x = -7.2, y = 0, z = 20.25 ; z >= 6; z -= 2) {
        points.push([x, y, z]);
    }

    //创建轨迹线
    line = app.create({
        type: 'Line',
        color: 0xFFFF00, // 轨迹线颜色
        dotSize: 2, // 轨迹点的大小
        points: points,
    })
    
     THING.widget.Button('车辆路线', play);
});

function play() {
    var car = app.query('Car01')[0];
    car.movePath({
        'path': line.points, // 轨迹路线
        'time': 10000, // 移动时间
        'orientToPath': true, 
    });
    //app.camera.lookAt(car);
    
    app.camera.followObject({
        object:car,
    });
}

  

---------------------
作者:extends Thread
来源:CSDN
原文:https://blog.csdn.net/nioooom/article/details/84069266
版权声明:本文为博主原创文章,转载请附上博文链接!

 

目录
相关文章
|
6月前
|
运维 Cloud Native 测试技术
极氪汽车云原生架构落地实践
随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。
|
3月前
|
人工智能 监控 数据可视化
企业级LLMOps落地指南:蜂巢架构×可视化编排实战
本文将基础的单应用扩展成多应用,并实现工作流组件,包括:多应用模块设计、工作流模块设计、LangGraph实现图应用、前端Vue-Flow组件使用、工作流转LLM工具设计思路、关联工作流登技巧。
209 3
企业级LLMOps落地指南:蜂巢架构×可视化编排实战
|
3月前
|
Ubuntu 编译器 C语言
在Ubuntu22.04平台上交叉编译针对Rv1126架构的GCC13.2.0编译器的步骤。
遵循上述步骤,您应该能够在Ubuntu 22.04平台上成功交叉编译适用于RISC-V架构RV1126的GCC 13.2.0编译器,允许您为目标硬件构建应用程序和操作系统组件。
159 10
|
3月前
|
运维 监控 Java
初创代购选单体,千万级平台用微服务:一张表看懂架构选型红线
在跨境电商代购系统年交易额超3.2万亿元的背景下,本文对比微服务与单体架构的技术原理、适用场景及实战案例,结合性能、运维、成本等维度,为企业提供架构选型指南,助力实现高效扩展与稳定运营。
|
9月前
|
Java Linux C语言
《docker基础篇:2.Docker安装》包括前提说明、Docker的基本组成、Docker平台架构图解(架构版)、安装步骤、阿里云镜像加速、永远的HelloWorld、底层原理
《docker基础篇:2.Docker安装》包括前提说明、Docker的基本组成、Docker平台架构图解(架构版)、安装步骤、阿里云镜像加速、永远的HelloWorld、底层原理
766 90
|
6月前
|
SQL 人工智能 前端开发
JeecgBoot 低代码平台 v3.7.4 发布,后台架构大升级
JeecgBoot 是一款基于 SpringBoot2.x/3.x 和 SpringCloud Alibaba 的企业级 AI 低代码平台,采用前后端分离架构(Ant Design & Vue3),支持 Mybatis-plus 和 Shiro。它集成了强大的代码生成器,可一键生成前后端代码,无需手动编写,大幅减少重复工作。平台支持 DeepSeek、ChatGPT 和 Ollama 等主流大模型,提供 AI 对话
377 9
|
8月前
|
SQL 消息中间件 Kafka
Flink+Paimon+Hologres,面向未来的一体化实时湖仓平台架构设计
本文介绍了阿里云实时数仓Hologres负责人姜伟华在Flink Forward Asia 2024上的分享,涵盖实时数仓的发展历程、从实时数仓到实时湖仓的演进,以及总结。文章通过三代实时数仓架构的演变,详细解析了Lambda架构、Kafka实时数仓分层+OLAP、Hologres实时数仓分层复用等方案,并探讨了未来从实时数仓到实时湖仓的演进方向。最后,结合实际案例和Demo展示了Hologres + Flink + Paimon在实时湖仓中的应用,帮助用户根据业务需求选择合适的方案。
1210 20
Flink+Paimon+Hologres,面向未来的一体化实时湖仓平台架构设计
|
7月前
|
SQL 消息中间件 Serverless
​Flink+Paimon+Hologres,面向未来的一体化实时湖仓平台架构设计
​Flink+Paimon+Hologres,面向未来的一体化实时湖仓平台架构设计
181 4
|
8月前
|
存储 SQL 监控
转转平台IM系统架构设计与实践(二):详细设计与实现
以转转IM架构为起点,介绍IM相关组件以及组件间的关系;以IM登陆和发消息的数据流转为跑道,介绍IM静态数据结构、登陆和发消息时的动态数据变化;以IM常见问题为风景,介绍保证IM实时性、可靠性、一致性的一般方案;以高可用、高并发为终点,介绍保证IM系统稳定及性能的小技巧。
133 6
|
9月前
|
存储 消息中间件 小程序
转转平台IM系统架构设计与实践(一):整体架构设计
本文描述了转转IM为整个平台提供的支撑能力,给出了系统的整体架构设计,分析了系统架构的特性。
222 10

热门文章

最新文章