openDriveMixin.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871
  1. import * as THREE from "three";
  2. import {
  3. OrbitControls
  4. } from "three/examples/jsm/controls/OrbitControls";
  5. import {
  6. RGBELoader
  7. } from "three/examples/jsm/loaders/RGBELoader";
  8. import {
  9. Reflector
  10. } from "three/examples/jsm/objects/Reflector";
  11. import {
  12. GLTFLoader
  13. } from "three/examples/jsm/loaders/GLTFLoader";
  14. import {
  15. DRACOLoader
  16. } from "three/examples/jsm/loaders/DRACOLoader";
  17. import {
  18. Line2
  19. } from "three/examples/jsm/lines/Line2";
  20. // import gsap from "gsap";
  21. // import * as CANNON from "cannon-es";
  22. import * as echarts from "echarts";
  23. export let openDriveMixin = {
  24. data() {
  25. return {
  26. ModuleOpenDrive: null,
  27. OpenDriveMap: null,
  28. INTERSECTED_LANE_ID: 0xffffffff,
  29. INTERSECTED_ROADMARK_ID: 0xffffffff,
  30. refline_material: null,
  31. lane_outlines_material: null,
  32. roadmark_outlines_material: null,
  33. disposable_objs: [],
  34. id_material: null,
  35. xyz_material: null,
  36. st_material: null,
  37. roadmarks_material: null,
  38. road_objects_material: null,
  39. road_network_material: null,
  40. lane_picking_scene: null,
  41. roadmark_picking_scene: null,
  42. xyz_scene: null,
  43. st_scene: null,
  44. lane_picking_texture: null,
  45. roadmark_picking_texture: null,
  46. xyz_texture: null,
  47. st_texture: null,
  48. controls: null,
  49. ground_grid: null,
  50. road_network_mesh: null,
  51. roadmarks_mesh: null,
  52. road_objects_mesh: null,
  53. refline_lines: null,
  54. lane_outline_lines: null,
  55. roadmark_outline_lines: null,
  56. COLORS: {
  57. road: 1.0,
  58. roadmark: 1.0,
  59. road_object: 0.9,
  60. lane_outline: 0x444444,
  61. roadmark_outline: 0xffffff,
  62. ref_line: 0x444444,
  63. background: 0x444444,
  64. lane_highlight: 0xff3030,
  65. roadmark_highlight: 0x2F4F4F,
  66. },
  67. renderer: null,
  68. scene: null,
  69. camera: null,
  70. light: null,
  71. lights: [
  72. -295.65, 117.04, -408.97, -114.11, -272.34, -220.81, 250.93, 194.26,
  73. 338.92, 65.23, -3.58, -16.76,
  74. ],
  75. startAndEndPoints: [],
  76. mappingLineId: new Map()
  77. }
  78. },
  79. created() {
  80. },
  81. mounted() {
  82. this.init();
  83. // this.loadMap("/map/mine4.xodr");
  84. },
  85. methods: {
  86. drawPoint(point) {
  87. let arr = this.startAndEndPoints;
  88. if (arr.length != 0) {
  89. for (let elem of arr) {
  90. if (elem.point.type == point.type) {
  91. let index = arr.indexOf(elem);
  92. if (index !== -1) {
  93. arr = [...arr.slice(0, index), ...arr.slice(index + 1)];
  94. }
  95. this.scene.remove(elem.target);
  96. }
  97. }
  98. }
  99. const group = new THREE.Group();
  100. let cricle = new THREE.CircleBufferGeometry(5, 200);
  101. let metrial = new THREE.MeshBasicMaterial({
  102. color: 0xff0000
  103. })
  104. let mesh = new THREE.Mesh(cricle, metrial);
  105. group.add(mesh);
  106. let texture = new THREE.CanvasTexture(this.getTextCanvas(point.name));
  107. let material = new THREE.SpriteMaterial({
  108. map: texture
  109. });
  110. let sprite = new THREE.Sprite(material);
  111. sprite.position.set(0, 0, 2);
  112. group.add(sprite);
  113. group.position.set(point.x - this.OpenDriveMap.x_offs, point.y - this.OpenDriveMap.y_offs, 0.015)
  114. this.scene.add(group);
  115. this.startAndEndPoints.push({
  116. target: group,
  117. point: point
  118. });
  119. },
  120. clearPoint() {
  121. if (this.startAndEndPoints.length != 0) {
  122. for (let elem of this.startAndEndPoints) {
  123. this.scene.remove(elem.target);
  124. }
  125. }
  126. },
  127. clearMappingId() {
  128. this.mappingLineId = new Map();
  129. },
  130. loadMap(url) {
  131. libOpenDrive().then((Module) => {
  132. this.ModuleOpenDrive = Module;
  133. fetch(url).then(
  134. (file_data) => {
  135. file_data.text().then((file_text) => {
  136. //加载数据文件
  137. this.loadFile(file_text, false);
  138. });
  139. }
  140. );
  141. });
  142. },
  143. reloadOdrMap() {
  144. if (this.OpenDriveMap) this.OpenDriveMap.delete();
  145. this.OpenDriveMap = new this.ModuleOpenDrive.OpenDriveMap(
  146. "./data.xodr",
  147. PARAMS.lateralProfile,
  148. PARAMS.laneHeight,
  149. true
  150. );
  151. this.loadOdrMap(true, false);
  152. },
  153. reloadNewMap(url) {
  154. this.clearPoint();
  155. this.clearMappingId();
  156. fetch(url, {}).then(response => response.blob()).then(blob => {
  157. const file = new File([blob], "map.xodr", {
  158. type: "text/plain",
  159. });
  160. this.onFileSelect(file);
  161. })
  162. },
  163. onFileSelect(file) {
  164. let file_reader = new FileReader();
  165. file_reader.onload = () => {
  166. this.loadFile(file_reader.result, true);
  167. };
  168. file_reader.readAsText(file);
  169. },
  170. loadFile(file_text, clear_map) {
  171. //清除文件系统中保存的文件节点
  172. if (clear_map) this.ModuleOpenDrive["FS_unlink"]("./data.xodr");
  173. //将文件数据转为节点保存到文件系统本地指定的文件目录,支持读写
  174. this.ModuleOpenDrive["FS_createDataFile"](
  175. ".",
  176. "data.xodr",
  177. file_text,
  178. true,
  179. true
  180. );
  181. //OpenDriveMap不为null,则已经打开过,需要删除地图重新尝试打开
  182. if (this.OpenDriveMap) this.OpenDriveMap.delete();
  183. //打开驱动地图
  184. this.OpenDriveMap = new this.ModuleOpenDrive.OpenDriveMap(
  185. "./data.xodr",
  186. PARAMS.lateralProfile,
  187. PARAMS.laneHeight,
  188. true
  189. );
  190. //this.drawPoint();
  191. this.loadOdrMap(clear_map);
  192. },
  193. loadOdrMap(clear_map = true, fit_view = true) {
  194. if (clear_map) {
  195. this.road_network_mesh.userData.odr_road_network_mesh.delete();
  196. this.scene.remove(
  197. this.road_network_mesh,
  198. this.roadmarks_mesh,
  199. this.road_objects_mesh,
  200. this.refline_lines,
  201. this.lane_outline_lines,
  202. this.roadmark_outline_lines,
  203. this.ground_grid
  204. );
  205. this.lane_picking_scene.remove(...this.lane_picking_scene.children);
  206. this.roadmark_picking_scene.remove(...this.roadmark_picking_scene.children);
  207. this.xyz_scene.remove(...this.xyz_scene.children);
  208. this.st_scene.remove(...this.st_scene.children);
  209. for (let obj of this.disposable_objs) obj.dispose();
  210. }
  211. //web浏览器内置api,精度微秒级,performance.now是浏览器(Web API)提供的方法,不同浏览器获取到的精度不同。Date.now是Javascript内置方法,差异主要在于浏览器遵循的ECMAScript规范。
  212. const t0 = performance.now();
  213. //是否清除地图
  214. /**
  215. * 道路中间s方向的线
  216. */
  217. //获取参考线矩形几何体
  218. const reflines_geom = new THREE.BufferGeometry();
  219. //获取驱动中参考线数据信息
  220. const odr_refline_segments = this.OpenDriveMap.get_refline_segments(
  221. parseFloat(PARAMS.resolution)
  222. );
  223. //设置参考线坐标点
  224. reflines_geom.setAttribute(
  225. "position",
  226. new THREE.Float32BufferAttribute(
  227. this.getStdVecEntries(odr_refline_segments.vertices).flat(),
  228. 3
  229. )
  230. );
  231. //设置参考线坐标点索引
  232. reflines_geom.setIndex(
  233. this.getStdVecEntries(odr_refline_segments.indices, true)
  234. );
  235. //创建参考线物体
  236. let refline_lines = new THREE.LineSegments(reflines_geom, this.refline_material);
  237. this.refline_lines = refline_lines;
  238. refline_lines.renderOrder = 10;
  239. //设置是否可见
  240. refline_lines.visible = PARAMS.ref_line;
  241. refline_lines.matrixAutoUpdate = false;
  242. this.disposable_objs.push(reflines_geom);
  243. //将参考线加入场景中
  244. this.scene.add(refline_lines);
  245. /*
  246. *道路面
  247. */
  248. //根据细节级别获取道路网格物体PARAMS.resolution 默认0.3中等级别
  249. const odr_road_network_mesh = this.OpenDriveMap.get_mesh(
  250. parseFloat(PARAMS.resolution)
  251. );
  252. //获取所有路段的车道(车道id为 -2, -1, 0, 1, 2)
  253. const odr_lanes_mesh = odr_road_network_mesh.lanes_mesh;
  254. //收集映射
  255. for (const [vert_start_idx, lineId] of this.getStdMapEntries(odr_lanes_mesh.lane_start_indices)) {
  256. const road_id = odr_lanes_mesh.get_road_id(vert_start_idx);
  257. this.mappingLineId.set(road_id + ":" + lineId, vert_start_idx);
  258. }
  259. //获取所有路段车道点集构建道路物体
  260. const road_network_geom = this.get_geometry(odr_lanes_mesh);
  261. //设置道路颜色
  262. road_network_geom.attributes.color.array.fill(this.COLORS.road);
  263. //获取所有路段的车道的起始位置索引
  264. //将索引作为车道开始和结束信息
  265. for (const [vert_start_idx, _] of this.getStdMapEntries(odr_lanes_mesh.lane_start_indices)) {
  266. const vert_idx_interval = odr_lanes_mesh.get_idx_interval_lane(vert_start_idx);
  267. const vert_count = vert_idx_interval[1] - vert_idx_interval[0];
  268. const vert_start_idx_encoded = this.encodeUInt32(vert_start_idx);
  269. const attr_arr = new Float32Array(vert_count * 4);
  270. for (let i = 0; i < vert_count; i++)
  271. attr_arr.set(
  272. vert_start_idx_encoded,
  273. i * 4
  274. );
  275. road_network_geom.attributes.id.array.set(
  276. attr_arr,
  277. vert_idx_interval[0] * 4
  278. );
  279. }
  280. this.disposable_objs.push(road_network_geom);
  281. let road_network_mesh = new THREE.Mesh(
  282. road_network_geom,
  283. this.road_network_material
  284. );
  285. road_network_mesh.renderOrder = 0;
  286. road_network_mesh.userData = {
  287. odr_road_network_mesh
  288. };
  289. road_network_mesh.matrixAutoUpdate = false;
  290. road_network_mesh.visible = !(PARAMS.view_mode == "Outlines");
  291. this.scene.add(road_network_mesh);
  292. this.road_network_mesh = road_network_mesh;
  293. /**
  294. * 选中被选中的车道进行离屏渲染
  295. */
  296. const lane_picking_mesh = new THREE.Mesh(road_network_geom, this.id_material);
  297. lane_picking_mesh.matrixAutoUpdate = false;
  298. this.lane_picking_scene.add(lane_picking_mesh);
  299. /* xyz coords road network mesh */
  300. let xyz_mesh = new THREE.Mesh(road_network_geom, this.xyz_material);
  301. xyz_mesh.matrixAutoUpdate = false;
  302. this.xyz_scene.add(xyz_mesh);
  303. /* st coords road network mesh */
  304. const st_mesh = new THREE.Mesh(road_network_geom, this.st_material);
  305. st_mesh.matrixAutoUpdate = false;
  306. this.st_scene.add(st_mesh);
  307. /**
  308. * 车道线宽度区域填充,由于车道线有宽度,宽度区域颜色填充
  309. */
  310. const odr_roadmarks_mesh = odr_road_network_mesh.roadmarks_mesh;
  311. const roadmarks_geom = this.get_geometry(odr_roadmarks_mesh);
  312. roadmarks_geom.attributes.color.array.fill(this.COLORS.roadmark);
  313. for (const [vert_start_idx, _] of this.getStdMapEntries(odr_roadmarks_mesh
  314. .roadmark_type_start_indices)) {
  315. const vert_idx_interval =
  316. odr_roadmarks_mesh.get_idx_interval_roadmark(vert_start_idx);
  317. const vert_count = vert_idx_interval[1] - vert_idx_interval[0];
  318. const vert_start_idx_encoded = this.encodeUInt32(vert_start_idx);
  319. const attr_arr = new Float32Array(vert_count * 4);
  320. for (let i = 0; i < vert_count; i++)
  321. attr_arr.set(
  322. vert_start_idx_encoded, //数组
  323. i * 4 //偏移量,每次偏移step:数组大小
  324. );
  325. roadmarks_geom.attributes.id.array.set(
  326. attr_arr,
  327. vert_idx_interval[0] * 4
  328. );
  329. }
  330. this.disposable_objs.push(roadmarks_geom);
  331. /* roadmarks mesh */
  332. let roadmarks_mesh = new THREE.Mesh(roadmarks_geom, this.roadmarks_material);
  333. this.roadmarks_mesh = roadmarks_mesh;
  334. roadmarks_mesh.matrixAutoUpdate = false;
  335. roadmarks_mesh.visible = !(PARAMS.view_mode == "Outlines") && PARAMS.roadmarks;
  336. this.scene.add(roadmarks_mesh);
  337. //离屏渲染车道线宽度区域
  338. const roadmark_picking_mesh = new THREE.Mesh(roadmarks_geom, this.id_material);
  339. roadmark_picking_mesh.matrixAutoUpdate = false;
  340. this.roadmark_picking_scene.add(roadmark_picking_mesh);
  341. /* road objects geometry */
  342. const odr_road_objects_mesh = odr_road_network_mesh.road_objects_mesh;
  343. const road_objects_geom = this.get_geometry(odr_road_objects_mesh);
  344. road_objects_geom.attributes.color.array.fill(this.COLORS.road_object);
  345. for (const [vert_start_idx, _] of this.getStdMapEntries(
  346. odr_road_objects_mesh.road_object_start_indices
  347. )) {
  348. const vert_idx_interval =
  349. odr_roadmarks_mesh.get_idx_interval_roadmark(vert_start_idx);
  350. const vert_count = vert_idx_interval[1] - vert_idx_interval[0];
  351. const vert_start_idx_encoded = this.encodeUInt32(vert_start_idx);
  352. const attr_arr = new Float32Array(vert_count * 4);
  353. for (let i = 0; i < vert_count; i++)
  354. attr_arr.set(vert_start_idx_encoded, i * 4);
  355. roadmarks_geom.attributes.id.array.set(
  356. attr_arr,
  357. vert_idx_interval[0] * 4
  358. );
  359. }
  360. this.disposable_objs.push(road_objects_geom);
  361. /* road objects mesh */
  362. let road_objects_mesh = new THREE.Mesh(
  363. road_objects_geom,
  364. this.road_objects_material
  365. );
  366. this.road_objects_mesh = road_objects_mesh;
  367. road_objects_mesh.matrixAutoUpdate = false;
  368. this.scene.add(road_objects_mesh);
  369. /**
  370. * 车道轮廓线
  371. * 道路轮廓线包含车道线,由于每条车道线有宽度,车道轮廓线即为车道线的中心线
  372. * id为0的车道轮廓线和参考线s重合
  373. */
  374. const lane_outlines_geom = new THREE.BufferGeometry();
  375. lane_outlines_geom.setAttribute(
  376. "position",
  377. road_network_geom.attributes.position
  378. );
  379. lane_outlines_geom.setIndex(
  380. this.getStdVecEntries(odr_lanes_mesh.get_lane_outline_indices(), true)
  381. );
  382. let lane_outline_lines = new THREE.LineSegments(
  383. lane_outlines_geom,
  384. this.lane_outlines_material
  385. );
  386. this.lane_outline_lines = lane_outline_lines;
  387. lane_outline_lines.renderOrder = 9;
  388. this.disposable_objs.push(lane_outlines_geom);
  389. this.scene.add(lane_outline_lines);
  390. /**
  391. * 道路轮廓线
  392. */
  393. const roadmark_outlines_geom = new THREE.BufferGeometry();
  394. roadmark_outlines_geom.setAttribute(
  395. "position",
  396. roadmarks_geom.attributes.position
  397. );
  398. roadmark_outlines_geom.setIndex(
  399. this.getStdVecEntries(
  400. odr_roadmarks_mesh.get_roadmark_outline_indices(),
  401. true
  402. )
  403. );
  404. let roadmark_outline_lines = new THREE.LineSegments(
  405. roadmark_outlines_geom,
  406. this.roadmark_outlines_material
  407. );
  408. this.roadmark_outline_lines = roadmark_outline_lines;
  409. roadmark_outline_lines.renderOrder = 8;
  410. roadmark_outline_lines.matrixAutoUpdate = false;
  411. this.disposable_objs.push(roadmark_outlines_geom);
  412. roadmark_outline_lines.visible = PARAMS.roadmarks;
  413. this.scene.add(roadmark_outline_lines);
  414. /* fit view and camera */
  415. const bbox_reflines = new THREE.Box3().setFromObject(refline_lines);
  416. const max_diag_dist = bbox_reflines.min.distanceTo(bbox_reflines.max);
  417. this.camera.far = max_diag_dist * 1.5;
  418. //controls.autoRotate = fit_view;
  419. this.camera.position.set(0, 0, max_diag_dist/3);
  420. // if (fit_view) {
  421. // this.camera.position.set(0, 0, 50);
  422. // // fitViewToBbox(bbox_reflines);
  423. // //fitViewToBbox(bbox_reflines);
  424. // }
  425. /**
  426. * 网格
  427. */
  428. let bbox_center_pt = new THREE.Vector3();
  429. bbox_reflines.getCenter(bbox_center_pt);
  430. let ground_grid = new THREE.GridHelper(
  431. max_diag_dist * 6,
  432. max_diag_dist / 10,
  433. 0x2f4f4f,
  434. 0x2f4f4f
  435. );
  436. // console.log(THREE.InfiniteGridHelper)
  437. // let ground_grid = THREE.InfiniteGridHelper(10, 10, new THREE.Color(0x2f4f4f), 500);
  438. this.ground_grid = ground_grid;
  439. ground_grid.geometry.rotateX(Math.PI / 2);
  440. ground_grid.position.set(
  441. bbox_center_pt.x,
  442. bbox_center_pt.y,
  443. bbox_reflines.min.z - 0.1
  444. );
  445. this.disposable_objs.push(ground_grid.geometry);
  446. this.scene.add(ground_grid);
  447. // const rgbeLoader = new RGBELoader();
  448. // rgbeLoader.loadAsync("hdr/index8.hdr").then((loader) => {
  449. // loader.needsUpdate = true;
  450. // loader.mapping = THREE.EquirectangularRefractionMapping;
  451. // loader.encoding = THREE.RGBEEncoding; //设置编码属性的值
  452. // loader.mapping = THREE.EquirectangularRefractionMapping;
  453. // loader.minFilter = THREE.NearestFilter; //当一个纹素覆盖小于一个像素时,贴图将如何采样
  454. // loader.magFilter = THREE.NearestFilter; //当一个纹素覆盖大于一个像素时,贴图将如何采样
  455. // loader.flipY = true; //翻转图像的Y轴以匹配WebGL纹理坐标空间
  456. // // this.scene.background = new THREE.Color(0x2F4F4F);
  457. // const sphereGeometry = new THREE.SphereBufferGeometry(max_diag_dist, 100, 100);
  458. // const sphereMetrial = new THREE.MeshBasicMaterial({
  459. // color: 0xffffff,
  460. // map: loader,
  461. // });
  462. // const sphereMesh = new THREE.Mesh(sphereGeometry, sphereMetrial);
  463. // sphereMesh.geometry.scale(1, 1, -1);
  464. // sphereMesh.rotation.x = Math.PI / 2;
  465. // this.scene.add(sphereMesh);
  466. // });
  467. // this.scene.environment = new THREE.Color(0x2F4F4F);
  468. /**
  469. * 灯光
  470. */
  471. this.light.position.set(
  472. bbox_reflines.min.x,
  473. bbox_reflines.min.y,
  474. bbox_reflines.max.z + max_diag_dist
  475. );
  476. this.light.target.position.set(
  477. bbox_center_pt.x,
  478. bbox_center_pt.y,
  479. bbox_center_pt.z
  480. );
  481. this.light.position.needsUpdate = true;
  482. this.light.target.position.needsUpdate = true;
  483. this.light.target.updateMatrixWorld();
  484. // const t1 = performance.now();
  485. // console.log(
  486. // "Heap size: " + this.ModuleOpenDrive.HEAP8.length / 1024 / 1024 + " mb"
  487. // );
  488. //删除数据冗余,避免造成内存泄漏
  489. odr_roadmarks_mesh.delete();
  490. odr_lanes_mesh.delete();
  491. this.animate();
  492. },
  493. initThreeJs() {
  494. // THREE.vertexColors = true;
  495. //创建渲染器
  496. this.renderer = new THREE.WebGLRenderer({
  497. antialias: true, //抗锯齿,防失真
  498. sortObjects: false, //定义渲染器是否应对对象进行排序
  499. //对数深度缓冲区,防止模型闪烁
  500. logarithmicdepthbuffer: true,
  501. });
  502. //开启投影阴影
  503. this.renderer.shadowMap.enabled = true;
  504. //设置渲染器渲染区域
  505. this.renderer.setSize(window.innerWidth, window.innerHeight);
  506. //渲染
  507. document.getElementById("ThreeJS").appendChild(this.renderer.domElement);
  508. //创建场景
  509. this.scene = new THREE.Scene();
  510. //创建透视相机
  511. this.camera = new THREE.PerspectiveCamera(
  512. 100,
  513. window.innerWidth / window.innerHeight,
  514. 0.1,
  515. 100000
  516. );
  517. //让Z轴朝上+
  518. this.camera.up.set(0, 0, 1);
  519. //创建控制器
  520. this.controls = new OrbitControls(this.camera, this.renderer.domElement);
  521. //const controls = new THREE.OrbControls(camera, renderer.domElement);
  522. // this.controls.addEventListener("start", () => {
  523. // /**
  524. // * 拖动开始停止开启聚集光和停止旋转
  525. // */
  526. // spotlight_paused = true; //聚集光暂停
  527. // //controls.autoRotate = false; //是否旋转
  528. // });
  529. // this.controls.addEventListener("end", () => {
  530. // //拖动结束聚集光关闭并且开启旋转
  531. // spotlight_paused = false; //聚集光开始
  532. // //将其设为true,以自动围绕目标旋转。请注意,如果它被启用,你必须在你的动画循环里调用
  533. // // controls.autoRotate = true;//开启旋转
  534. // });
  535. // controls.autoRotate = true; //开启旋转
  536. //创建平行光
  537. this.light;
  538. for (let index = 0; index < this.lights.length / 2; index++) {
  539. this.light = new THREE.DirectionalLight(0xffffff, 0.6);
  540. this.light.position.set(this.lights[2 * index], this.lights[2 * index + 1], 5);
  541. this.scene.add(this.light);
  542. //平行光方向指向原点(0,0,0)
  543. this.scene.add(this.light.target);
  544. }
  545. window.addEventListener("resize", this.onWindowResize, false);
  546. },
  547. initOffscreen() {
  548. //选择车道线场景
  549. this.lane_picking_scene = new THREE.Scene();
  550. //车道线场景背景颜色
  551. this.lane_picking_scene.background = new THREE.Color(0xffffff);
  552. //路标场景
  553. this.roadmark_picking_scene = new THREE.Scene();
  554. //路标场景背景颜色
  555. this.roadmark_picking_scene.background = new THREE.Color(0xffffff);
  556. //坐标场景
  557. this.xyz_scene = new THREE.Scene();
  558. //坐标场景背景颜色
  559. this.xyz_scene.background = new THREE.Color(0xffffff);
  560. this.st_scene = new THREE.Scene();
  561. this.st_scene.background = new THREE.Color(0xffffff);
  562. //创建渲染器
  563. this.lane_picking_texture = new THREE.WebGLRenderTarget(1, 1, {
  564. type: THREE.FloatType,
  565. });
  566. this.roadmark_picking_texture = new THREE.WebGLRenderTarget(1, 1, {
  567. type: THREE.FloatType,
  568. });
  569. this.xyz_texture = new THREE.WebGLRenderTarget(1, 1, {
  570. type: THREE.FloatType,
  571. });
  572. this.st_texture = new THREE.WebGLRenderTarget(1, 1, {
  573. type: THREE.FloatType,
  574. });
  575. },
  576. initMaterial() {
  577. //获取顶点着色器
  578. const idVertexShader =
  579. document.getElementById("idVertexShader").textContent;
  580. const idFragmentShader =
  581. document.getElementById("idFragmentShader").textContent;
  582. const xyzVertexShader =
  583. document.getElementById("xyzVertexShader").textContent;
  584. const xyzFragmentShader =
  585. document.getElementById("xyzFragmentShader").textContent;
  586. const stVertexShader =
  587. document.getElementById("stVertexShader").textContent;
  588. const stFragmentShader =
  589. document.getElementById("stFragmentShader").textContent;
  590. //设置车道中轴线颜色
  591. this.refline_material = new THREE.LineBasicMaterial({
  592. color: this.COLORS.ref_line,
  593. //color: 0x0000ff,
  594. });
  595. //道路线
  596. this.lane_outlines_material = new THREE.LineBasicMaterial({
  597. color: this.COLORS.lane_outline,
  598. });
  599. //外侧线
  600. this.roadmark_outlines_material = new THREE.LineBasicMaterial({
  601. color: this.COLORS.roadmark_outline,
  602. });
  603. this.id_material = new THREE.ShaderMaterial({
  604. vertexShader: idVertexShader,
  605. fragmentShader: idFragmentShader,
  606. });
  607. this.xyz_material = new THREE.ShaderMaterial({
  608. vertexShader: xyzVertexShader,
  609. fragmentShader: xyzFragmentShader,
  610. });
  611. this.st_material = new THREE.ShaderMaterial({
  612. vertexShader: stVertexShader,
  613. fragmentShader: stFragmentShader,
  614. });
  615. this.roadmarks_material = new THREE.MeshBasicMaterial({
  616. vertexColors: true,
  617. });
  618. this.road_objects_material = new THREE.MeshBasicMaterial({
  619. vertexColors: true,
  620. side: THREE.DoubleSide,
  621. wireframe: true,
  622. });
  623. this.road_network_material = new THREE.MeshPhongMaterial({
  624. vertexColors: THREE.VertexColors,
  625. wireframe: PARAMS.wireframe, //显示现况
  626. shininess: 20.0,
  627. transparent: true,
  628. opacity: 0.4,
  629. });
  630. },
  631. animate() {
  632. //控制电脑帧频,防止刷屏过快导致的页面刷3D数据刷新过快 控制每秒30次
  633. setTimeout(() => {
  634. window.requestAnimationFrame(this.animate);
  635. }, 1000 / 30);
  636. this.controls.update();
  637. this.camera.setViewOffset(
  638. this.renderer.domElement.width, //画布的宽度
  639. this.renderer.domElement.height, //画布的高度
  640. (this.renderer.domElement.width / 2) | 0, //画布坐标系中,相机的x坐标位置
  641. (this.renderer.domElement.height / 2) | 0, //画布坐标系中,相机的y坐标位置
  642. 1, //副相机的宽度
  643. 1 //副相机的高度
  644. );
  645. //离屏渲染
  646. this.renderer.setRenderTarget(this.lane_picking_texture);
  647. this.renderer.render(this.lane_picking_scene, this.camera);
  648. this.renderer.setRenderTarget(this.roadmark_picking_texture);
  649. this.renderer.render(this.roadmark_picking_scene, this.camera);
  650. this.renderer.setRenderTarget(this.xyz_texture);
  651. this.renderer.render(this.xyz_scene, this.camera);
  652. this.renderer.setRenderTarget(this.st_texture);
  653. this.renderer.render(this.st_scene, this.camera);
  654. const lane_id_pixel_buffer = new Float32Array(4);
  655. this.renderer.readRenderTargetPixels(
  656. this.lane_picking_texture,
  657. 0,
  658. 0,
  659. 1,
  660. 1,
  661. this.lane_id_pixel_buffer
  662. );
  663. const roadmark_id_pixel_buffer = new Float32Array(4);
  664. this.renderer.readRenderTargetPixels(
  665. this.roadmark_picking_texture,
  666. 0,
  667. 0,
  668. 1,
  669. 1,
  670. this.roadmark_id_pixel_buffer
  671. );
  672. const xyz_pixel_buffer = new Float32Array(4);
  673. this.renderer.readRenderTargetPixels(
  674. this.xyz_texture,
  675. 0,
  676. 0,
  677. 1,
  678. 1,
  679. this.xyz_pixel_buffer
  680. );
  681. xyz_pixel_buffer[0] += this.OpenDriveMap.x_offs;
  682. xyz_pixel_buffer[1] += this.OpenDriveMap.y_offs;
  683. const st_pixel_buffer = new Float32Array(4);
  684. this.renderer.readRenderTargetPixels(
  685. this.st_texture,
  686. 0,
  687. 0,
  688. 1,
  689. 1,
  690. this.st_pixel_buffer
  691. );
  692. this.camera.clearViewOffset();
  693. this.renderer.setRenderTarget(null);
  694. if (this.isValid(lane_id_pixel_buffer) && false) {
  695. const decoded_lane_id = this.decodeUInt32(lane_id_pixel_buffer);
  696. const odr_lanes_mesh =
  697. this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
  698. if (this.INTERSECTED_LANE_ID != decoded_lane_id) {
  699. if (this.INTERSECTED_LANE_ID != 0xffffffff) {
  700. this.road_network_mesh.geometry.attributes.color.array.fill(
  701. this.COLORS.road
  702. );
  703. }
  704. this.INTERSECTED_LANE_ID = decoded_lane_id;
  705. const lane_vert_idx_interval =
  706. odr_lanes_mesh.get_idx_interval_lane(this.INTERSECTED_LANE_ID);
  707. const vert_count =
  708. lane_vert_idx_interval[1] - lane_vert_idx_interval[0];
  709. this.applyVertexColors(
  710. this.road_network_mesh.geometry.attributes.color,
  711. new THREE.Color(this.COLORS.lane_highlight),
  712. lane_vert_idx_interval[0],
  713. vert_count
  714. );
  715. this.road_network_mesh.geometry.attributes.color.needsUpdate = true;
  716. }
  717. odr_lanes_mesh.delete();
  718. } else {
  719. if (this.INTERSECTED_LANE_ID != 0xffffffff) {
  720. const odr_lanes_mesh =
  721. this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
  722. const lane_vert_idx_interval =
  723. odr_lanes_mesh.get_idx_interval_lane(this.INTERSECTED_LANE_ID);
  724. this.road_network_mesh.geometry.attributes.color.array.fill(this.COLORS.road);
  725. this.road_network_mesh.geometry.attributes.color.needsUpdate = true;
  726. odr_lanes_mesh.delete();
  727. this.INTERSECTED_LANE_ID = 0xffffffff;
  728. }
  729. }
  730. if (this.isValid(roadmark_id_pixel_buffer)) {
  731. //获取
  732. const decoded_roadmark_id = this.decodeUInt32(roadmark_id_pixel_buffer);
  733. const odr_roadmarks_mesh =
  734. this.road_network_mesh.userData.odr_road_network_mesh.roadmarks_mesh;
  735. if (this.INTERSECTED_ROADMARK_ID != decoded_roadmark_id) {
  736. if (this.INTERSECTED_ROADMARK_ID != 0xffffffff) {
  737. const prev_roadmark_vert_idx_interval =
  738. odr_roadmarks_mesh.get_idx_interval_roadmark(
  739. this.INTERSECTED_ROADMARK_ID
  740. );
  741. this.roadmarks_mesh.geometry.attributes.color.array.fill(
  742. this.COLORS.roadmark,
  743. prev_roadmark_vert_idx_interval[0] * 3,
  744. prev_roadmark_vert_idx_interval[1] * 3
  745. );
  746. }
  747. this.INTERSECTED_ROADMARK_ID = decoded_roadmark_id;
  748. const roadmark_vert_idx_interval =
  749. odr_roadmarks_mesh.get_idx_interval_roadmark(
  750. this.INTERSECTED_ROADMARK_ID
  751. );
  752. const vert_count =
  753. roadmark_vert_idx_interval[1] - roadmark_vert_idx_interval[0];
  754. this.applyVertexColors(
  755. this.roadmarks_mesh.geometry.attributes.color,
  756. new THREE.Color(this.COLORS.roadmark_highlight),
  757. roadmark_vert_idx_interval[0],
  758. vert_count
  759. );
  760. this.roadmarks_mesh.geometry.attributes.color.needsUpdate = true;
  761. }
  762. odr_roadmarks_mesh.delete();
  763. } else {
  764. if (this.INTERSECTED_ROADMARK_ID != 0xffffffff) {
  765. const odr_roadmarks_mesh =
  766. this.road_network_mesh.userData.odr_road_network_mesh.roadmarks_mesh;
  767. const roadmark_vert_idx_interval =
  768. odr_roadmarks_mesh.get_idx_interval_lane(this.INTERSECTED_ROADMARK_ID);
  769. this.roadmarks_mesh.geometry.attributes.color.array.fill(
  770. this.COLORS.roadmark,
  771. roadmark_vert_idx_interval[0] * 3,
  772. roadmark_vert_idx_interval[1] * 3
  773. );
  774. this.roadmarks_mesh.geometry.attributes.color.needsUpdate = true;
  775. this.INTERSECTED_ROADMARK_ID = 0xffffffff;
  776. odr_roadmarks_mesh.delete();
  777. }
  778. }
  779. if (this.INTERSECTED_LANE_ID != 0xffffffff) {
  780. const odr_lanes_mesh =
  781. this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
  782. const road_id = odr_lanes_mesh.get_road_id(this.INTERSECTED_LANE_ID);
  783. const lanesec_s0 = odr_lanes_mesh.get_lanesec_s0(this.INTERSECTED_LANE_ID);
  784. const lane_id = odr_lanes_mesh.get_lane_id(this.INTERSECTED_LANE_ID);
  785. const lane_type = this.OpenDriveMap.roads
  786. .get(road_id)
  787. .s_to_lanesection.get(lanesec_s0)
  788. .id_to_lane.get(lane_id).type;
  789. odr_lanes_mesh.delete();
  790. }
  791. this.renderer.render(this.scene, this.camera);
  792. },
  793. fillColorLine(roadId, lineId) {
  794. lineId = this.mappingLineId.get(roadId + ":" + lineId);
  795. const odr_lanes_mesh = this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
  796. const lane_vert_idx_interval = odr_lanes_mesh.get_idx_interval_lane(lineId);
  797. const vert_count = (lane_vert_idx_interval[1] - lane_vert_idx_interval[0]);
  798. this.applyVertexColors(this.road_network_mesh.geometry.attributes.color, new THREE.Color(this.COLORS
  799. .lane_highlight),
  800. lane_vert_idx_interval[0], vert_count);
  801. this.road_network_mesh.geometry.attributes.color.needsUpdate = true;
  802. odr_lanes_mesh.delete();
  803. },
  804. clearColorLine(roadId, lineId) {
  805. lineId = this.mappingLineId.get(roadId + ":" + lineId);
  806. const odr_lanes_mesh = this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
  807. const lane_vert_idx_interval = odr_lanes_mesh.get_idx_interval_lane(lineId);
  808. const vert_count = (lane_vert_idx_interval[1] - lane_vert_idx_interval[0]);
  809. this.road_network_mesh.geometry.attributes.color.array.fill(
  810. this.COLORS.road
  811. );
  812. this.road_network_mesh.geometry.attributes.color.needsUpdate = true;
  813. odr_lanes_mesh.delete();
  814. },
  815. onWindowResize() {
  816. this.camera.aspect = window.innerWidth / window.innerHeight;
  817. this.camera.updateProjectionMatrix();
  818. this.renderer.setSize(window.innerWidth, window.innerHeight);
  819. this.renderer.setPixelRatio(window.devicePixelRatio);
  820. },
  821. init(){
  822. this.initThreeJs();
  823. this.initOffscreen();
  824. this.initMaterial();
  825. }
  826. }
  827. }