mapbox结合threeJS载入3d模型,并实现点击事件

https://www.jianshu.com/p/ae8f9b338f80 地址参考代码如下:

<!DOCTYPE html>
<html>
<head><title>Mapbox THREE.js raycaster test</title><meta charset='utf-8'><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"><link rel='stylesheet' href='css/mapbox-gl.css' /><style>body { margin: 0; padding: 0; }html, body, #map { height: 100%; }</style>
</head><body>
<script src='js/three.min.js'></script><div id='map'></div>
<script src='js/mapbox-gl.js'></script>
<script>const blankStyle = {version: 8,name: 'BlankMap',sources: {},layers: [{id: 'background',type: 'background',paint: {// 'background-color': '#08294A' /* 背景颜色 */'background-color': 'rgba(255, 255, 255, 0)' /* 背景颜色-透明 */}}]};// This codepen attempts to use THREE.js's raycaster with a Mapbox custom layer. If I've done things correctly,
// hovering over the cube should turn it red. It seems though that the intersection is never detected.
// See: https://github.com/mapbox/mapbox-gl-js/issues/10595mapboxgl.accessToken = 'pk.eyJ1IjoibmFnaXgiLCJhIjoiY2treGZoNzY5MHE1OTJ4bzQ5NmYyY2twNiJ9.ZX7a6VWavDoOMbDoRR7IOg';
var map = new mapboxgl.Map({container: 'map',zoom: 14,center: [139.7670, 35.6814],pitch: 30,style: blankStyle
});const mouse = new THREE.Vector4(-1000, -1000, 1, 1);// parameters to ensure the model is georeferenced correctly on the map
var modelOrigin = [139.7670, 35.6814];
var modelAltitude = 150;var modelAsMercatorCoordinate = mapboxgl.MercatorCoordinate.fromLngLat(modelOrigin,modelAltitude
);// transformation parameters to position, rotate and scale the 3D model onto the map
var modelTransform = {translateX: modelAsMercatorCoordinate.x,translateY: modelAsMercatorCoordinate.y,translateZ: modelAsMercatorCoordinate.z,/* Since our 3D model is in real world meters, a scale transform needs to be* applied since the CustomLayerInterface expects units in MercatorCoordinates.*/scale: modelAsMercatorCoordinate.meterInMercatorCoordinateUnits()
};// configuration of the custom layer for a 3D model per the CustomLayerInterface
var customLayer = {id: '3d-model',type: 'custom',renderingMode: '3d',onAdd: function(map, gl) {this.camera = new THREE.PerspectiveCamera();this.scene = new THREE.Scene();var cube = new THREE.Mesh(new THREE.BoxGeometry( 300, 300, 300 ),new THREE.MeshNormalMaterial());this.scene.add(cube)let cube1 = cube.clone();cube1.material = new THREE.MeshNormalMaterial();cube1.translateX(1000);this.scene.add(cube1)this.map = map;// use the Mapbox GL JS map canvas for three.jsthis.renderer = new THREE.WebGLRenderer({canvas: map.getCanvas(),context: gl,antialias: true});this.renderer.autoClear = false;this.raycaster = new THREE.Raycaster();},render: function(gl, matrix) {var m = new THREE.Matrix4().fromArray(matrix);var l = new THREE.Matrix4().makeTranslation(modelTransform.translateX,modelTransform.translateY,modelTransform.translateZ).scale(new THREE.Vector3(modelTransform.scale,-modelTransform.scale,modelTransform.scale));this.camera.projectionMatrix = m.clone().multiply(l);this.camera.matrixWorldInverse = new THREE.Matrix4();this.renderer.resetState();const freeCamera = this.map.getFreeCameraOptions();let cameraPosition = new THREE.Vector4(freeCamera.position.x, freeCamera.position.y, freeCamera.position.z, 1);cameraPosition.applyMatrix4(l.invert());let direction = mouse.clone().applyMatrix4(this.camera.projectionMatrix.clone().invert());direction.divideScalar(direction.w);this.raycaster.set(cameraPosition, direction.sub(cameraPosition).normalize());const intersects = this.raycaster.intersectObjects( this.scene.children );console.log('Intersection count:', intersects.length)for ( let i = 0; i < intersects.length; i ++ ) {intersects[ i ].object.material.wireframe = true;}this.renderer.render(this.scene, this.camera);for ( let i = 0; i < intersects.length; i ++ ) {intersects[ i ].object.material.wireframe = false;}}
};map.on('load', function() {map.addLayer(customLayer);map.on('mousemove', function (event) {mouse.x = ( event.point.x / window.innerWidth ) * 2 - 1;mouse.y = - ( event.point.y / window.innerHeight ) * 2 + 1;map.triggerRepaint();});
});</script>
</body>
</html>

上面代码运行后如果出现 Uncaught TypeError: this.renderer.resetState is not a function 或 Uncaught TypeError: l.invert is not a function相关问题,是引用的three.min.js版本不对,换下three.min.js版本解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/30397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react-virtualized可视化区域渲染的使用

介绍 github地址&#xff1a;https://github.com/bvaughn/react-virtualized 实例网址&#xff1a;react-virtualized如果体积太大&#xff0c;可以参考用react-window。 使用 安装&#xff1a; yarn add react-virtualized。在项目入口文件index.js中导入样式文件&#xff…

Positive Technologies:有针对性的攻击占非洲所有攻击的 68%

网络犯罪分子最常攻击的是非洲的金融公司和电信公司 Positive Technologies 分析了 2022–2023 年非洲遇到的各种网络安全威胁&#xff0c;并在圣彼得堡举行的第二届俄罗斯—非洲峰会上介绍了研究结果。根据我们的专家的介绍&#xff0c;非洲金融部门受到的网络攻击最多&#…

集合工具类 Collections:提升集合操作效率

文章目录 多元素添加&#xff1a;addAll 方法随机置换&#xff1a;shuffle 方法自定义对象排序&#xff1a;sort 方法总结 在Java的集合框架中&#xff0c;Collections 是一个包含了许多操作集合的静态方法的工具类。通过使用 Collections 类提供的方法&#xff0c;我们能够更加…

FineReport 使用汇总(不定期更新)

1&#xff0c;下载地址 免费下载FineReport - FineReport报表官网 这里注意 2&#xff0c;后台统计 sql 还是需要自己写 就会有数据 而直接查询表&#xff0c; 没有数据 不过&#xff0c;可能是我不会用。还需要再研究。

redis和mysql中的数据以哪个为准,并且会不会存在一致性的问题

为了解决数据一致性的问题&#xff0c;可以采取以下策略&#xff1a; 读写双写&#xff1a;在更新MySQL数据时&#xff0c;同时更新Redis中的数据&#xff0c;确保数据的一致性。 数据过期策略&#xff1a;设置Redis中缓存数据的过期时间&#xff0c;确保缓存数据不会过期太久…

事务,不只ACID | 京东物流技术团队

1. 什么是事务&#xff1f; 应用在运行时可能会发生数据库、硬件的故障&#xff0c;应用与数据库的网络连接断开或多个客户端端并发修改数据导致预期之外的数据覆盖问题&#xff0c;为了提高应用的可靠性和数据的一致性&#xff0c;事务应运而生。 从概念上讲&#xff0c;事务…

JQuery——事件处理

在 jQuery 中&#xff0c;事件处理允许您在元素上绑定特定的行为&#xff0c;以响应用户的交互动作&#xff0c;如点击、悬停、键盘输入等。以下是一些常见的 jQuery 事件处理的示例&#xff1a; 1. 点击事件&#xff1a; click 事件在元素被点击时触发。 <!DOCTYPE html…

用C语言高效地打印杨辉三角

假设杨辉三角的通项公式为a(n)&#xff0c;则打印形式如下&#xff1a; 然而我们知道&#xff0c;它应该是这样的&#xff1a; 三角形两边的值都为1&#xff0c;且每个元素的值都为该元素正上方和其正上方前面的元素的值之和。 为了实现这个代码&#xff0c;我们需要知道每行首…

[ K8S ] yaml文件讲解

目录 查看 api 资源版本标签写一个yaml文件demo创建资源对象查看创建的pod资源创建service服务对外提供访问并测试//创建资源对象查看创建的service写yaml太累怎么办&#xff1f; Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#xff1a;主要用于 api 接口之间消…

修改Jenkins存储目录

注意&#xff1a;在Jenkins运行时是不能更改的. 请先将Jenkins停止运行。 1、windows环境下更改JENKINS的主目录 Windows环境中&#xff0c;Jenkins主目录默认在C:Documents and SettingsAAA.jenkins 。可以通过设置环境变量来修改&#xff0c;例如&#xff1a; JENKINS_HOME…

最新SQLMap进阶技术

点击星标&#xff0c;即时接收最新推文 本文选自《web安全攻防渗透测试实战指南&#xff08;第2版&#xff09;》 五折购买链接&#xff1a;u.jd.com/3ibjeF6 SQLMap进阶&#xff1a;参数讲解 &#xff08;1&#xff09;--level 5&#xff1a;探测等级。 参数“--level 5”指需…

数据库签名的那些事儿

写在前面&#xff0c;关于签名的应用场景 除了我们后端经常使用的接口签名来校验数据这些常见的场景&#xff0c;对于数据安全性要求比较严格的业务来说&#xff0c;大部分落库的核心数据 也都需要签名&#xff0c;为啥? 因为怕数据库的数据被篡改数据或者被攻击了&#xff0c…

Mysql 数据库备份

Mysql数据库导出命令&#xff1a; mysqldump -uroot -p123456 -h localhost -P3306 tyzk_cg --hex-blob>> D:/data/tyzk_cg_dev.20230809.sql 2>&1 &文件内容&#xff1a;脚本里没有创建数据库&#xff0c;则在执行source命令之前必须执行 use 数据库 命令 …

Mac终端前总会出现 (base) 字样解决

Mac安装了anaconda之后&#xff0c;终端前总会出现 (base) 字样&#xff0c;显示如下&#xff1a; (base) tinghoudeiMac ~ 具体原因是 安装了anaconda后&#xff0c;每次启动终端都会启动anaconda的base环境。 解决办法 设置anaconda 不自启base环境就好了&#xff1a; 禁用…

vue2.7如何使用vue-i18n

版本&#xff1a; vue&#xff1a;2.7.0 vue-i18n&#xff1a;8.28.2 一、下载 npm i vue-i18n8.28.2二、新建 新建一个文件&#xff0c;例如&#xff1a;lang&#xff0c;项目结构如下&#xff1a; index.js&#xff1a; import Vue from vue import VueI18n from vue-i18n…

c++ 中const 的使用

const 意味着变量无法被改变 修饰常量 const int a 3;修饰指针( 就近原则&#xff09; const int* a &b; *a 3; error int* const a1 &b; a1 &b1; error 修饰类的成员 修饰类变量时&#xff0c;只能通过构造函数 using namespace std;class A{ public:A(…

Go Windows下开发环境配置(图文)

Go Windows下开发环境配置 下载 安装 点击下载的安装包进行安装。安装路径可以选择到自己的目录。 环境变量配置 GOROOT&#xff1a;&#xff08;指定到安装目录下&#xff09; GOPATH&#xff1a;&#xff08;是工作空间&#xff09; path&#xff1a;在安装时已经添加了…

go-admin 使用开发

在项目中使用redis 作为数据缓存&#xff1a;首先引入该包 “github.com/go-redis/redis/v8” client : redis.NewClient(&redis.Options{Addr: config.QueueConfig.Redis.Addr, // Redis 服务器地址Password: config.QueueConfig.Redis.Password, // Redis 密码&…

UNIX 系统概要

UNIX 家族UNIX 家谱家族后起之秀 LinuxUNIX vs LinuxUNIX/Linux 应用领域 UNIX 操作系统诞生与发展UNIX 操作系统概要内核常驻模块shell虚拟计算机特性 其他操作系统 LinuxRichard StallmanGNU 项目FSF 组织GPL 协议Linus Torvalds UNIX 家族 有人说&#xff0c;这个世界上只有…

java中list对象拷贝至新的list对象并保持两个对象独立的方法

在Java中&#xff0c;如果你想拷贝一个List对象到一个新的List对象&#xff0c;并且修改原来的List不影响新的List中的内容&#xff0c;有几种方法可以实现&#xff1a;使用构造函数&#xff1a; 可以使用List的构造函数&#xff0c;传递原始List作为参数来创建一个新的List对象…