uwb-sample.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. //import { FBXLoader } from "./FBXLoader.js";
  2. //import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
  3. //import { MeshBasicMaterial, MeshStandardMaterial, Vector3 } from "three";
  4. import Vue from "vue";
  5. import fetchAndCombine from "../public/loader/loader";
  6. import { UWB } from "../public/plugin/uwb/index.js";
  7. import { FXAAShader } from "../public/shader/FAAXShader.js"
  8. import '../public/libs/tools.js'
  9. // 定义一个函数,接受元素ID和一个回调函数作为参数,用于处理点击事件
  10. function getsqlData(sdkInstance, uwbInstance) {
  11. let g_PosArrayResult = null;
  12. let textureLoader = new THREE.TextureLoader();
  13. let textureReady = textureLoader.load('../images/location_ready.png');
  14. let textureRunning = textureLoader.load('../images/location_running.png');
  15. let textureOffline = textureLoader.load('../images/location_offline.png');
  16. if (g_PosArrayResult == null) {
  17. var sqlstr = "SELECT * FROM dat_bench_extend order by bench_id asc";
  18. //sqlstr = sqlstr.format(two_seconds_ago, two_seconds_ago)
  19. console.log(sqlstr);
  20. let msg = {
  21. cmd: "query", // server端要进行判断的
  22. data: {
  23. name: "name", // 这个无所谓怎么写,有就行
  24. //sql: 'select * from his_location_tadiao_result_unity limit 300'
  25. sql: sqlstr,
  26. },
  27. };
  28. // 触发事件进行从服务器获取数据
  29. window.vm.$socket.emit("REPT", msg, (datas) => {
  30. g_PosArrayResult = datas.data;
  31. var now = new Date();
  32. var two_seconds_ago = new Date(now.getTime() - 2 * 1000).Format(
  33. "yyyy-MM-dd hh:mm:ss.S"
  34. );
  35. var one_second_ago = new Date(now.getTime() - 1 * 1000).Format(
  36. "yyyy-MM-dd hh:mm:ss.S"
  37. );
  38. let dracoLoader = new THREE.DRACOLoader();
  39. THREE.DRACOLoader.setDecoderPath("../gltf/");
  40. var fbxLoader1 = new THREE.GLTFLoader();
  41. fbxLoader1.setDRACOLoader(dracoLoader);
  42. fbxLoader1.load("../models/meshDraco.gltf", function (fbx) {
  43. let result = g_sqlResult;
  44. for (var item of result) {
  45. let x = item.x;
  46. let y = item.y;
  47. let z = item.z;
  48. let ang_x = 0.0;
  49. let ang_y = 0.0;
  50. let ang_z = 0.0;
  51. let benchType = item.bench_type
  52. if (item.use_fix_pos == 1) {
  53. x = JSON.parse(JSON.stringify(item.fix_pos_x));
  54. y = JSON.parse(JSON.stringify(item.fix_pos_y));
  55. z = JSON.parse(JSON.stringify(item.fix_pos_z));
  56. ang_x = JSON.parse(JSON.stringify(item.fix_angle_x));
  57. ang_y = JSON.parse(JSON.stringify(item.fix_angle_y));
  58. ang_z = JSON.parse(JSON.stringify(item.fix_angle_z));
  59. }
  60. else {
  61. }
  62. var distance = 10000.0;
  63. var xSubTmp = x;
  64. var ySubTmp = y;
  65. var zSubTmp = z;
  66. var ang_xSubTmp = ang_x;
  67. var ang_ySubTmp = ang_y;
  68. var ang_zSubTmp = ang_z;
  69. if (g_PosArrayResult) {
  70. var iCount = 0;
  71. for (var itemSub of g_PosArrayResult) {
  72. iCount++;
  73. var xSub = itemSub.x;
  74. var ySub = itemSub.y;
  75. var zSub = itemSub.z;
  76. var ang_xSub = 0.0;
  77. var ang_ySub = 0.0;
  78. var ang_zSub = 0.0;
  79. xSub = itemSub.fix_pos_x;
  80. ySub = itemSub.fix_pos_y;
  81. zSub = itemSub.fix_pos_z;
  82. ang_xSub = itemSub.fix_angle_x;
  83. ang_ySub = itemSub.fix_angle_y;
  84. ang_zSub = itemSub.fix_angle_z;
  85. var disTmp = Math.sqrt(Math.pow(x - xSub, 2) + Math.pow(y - ySub, 2) + Math.pow(z - zSub, 2))
  86. if (disTmp < distance) {
  87. distance = disTmp;
  88. xSubTmp = xSub;
  89. ySubTmp = ySub;
  90. zSubTmp = zSub;
  91. ang_xSubTmp = ang_xSub;
  92. ang_ySubTmp = ang_ySub;
  93. ang_zSubTmp = ang_zSub;
  94. }
  95. }
  96. }
  97. x = xSubTmp;
  98. y = ySubTmp;
  99. z = zSubTmp;
  100. ang_x = ang_xSubTmp;
  101. ang_y = ang_ySubTmp;
  102. ang_z = ang_zSubTmp;
  103. x = JSON.parse(JSON.stringify(xSubTmp));
  104. y = JSON.parse(JSON.stringify(ySubTmp));
  105. z = JSON.parse(JSON.stringify(zSubTmp));
  106. ang_x = JSON.parse(JSON.stringify(ang_xSubTmp));
  107. ang_y = JSON.parse(JSON.stringify(ang_ySubTmp));
  108. ang_z = JSON.parse(JSON.stringify(ang_zSubTmp));
  109. let card_id = item.card_id;
  110. let bench_id = item.bench_id;
  111. let show_remote_button = item.show_remote_button;
  112. if (benchType == 1) {
  113. console.log("控制台查看加载gltf文件返回的对象结构", fbx);
  114. var childMesh = childMesh = fbx.scene.children[0].children[0];
  115. let childMeshTmp = new THREE.Mesh(childMesh.geometry, childMesh.material)
  116. let scale = 5;
  117. childMeshTmp.scale.set(scale, scale, scale)
  118. //fbx.scene.children[0].scale.set(5, 5, 5)
  119. //fbx.scene.children[0].position.set(8.7, -1.6, 5.4)
  120. childMeshTmp.position.set(x, y, z)
  121. var Euler = new THREE.Euler(Math.PI * ang_x, Math.PI * ang_y, Math.PI * ang_z);
  122. //var Euler = new THREE.Euler( Math.PI*1.5, Math.PI*0, Math.PI*0);
  123. var quaternion = new THREE.Quaternion();
  124. childMeshTmp.quaternion.copy(quaternion.setFromEuler(Euler))
  125. var customData = {
  126. benchId: bench_id,
  127. benchFlag: true,
  128. bShowRemoteButton: show_remote_button == 1 ? true : false,
  129. };
  130. childMeshTmp.userData = customData;
  131. // 添加水滴
  132. let benchList = window.store ? window.store.getters['benchList/getBenchList'] : [];
  133. let currentBench = benchList.find(b => b.id == bench_id);
  134. let texture = null;
  135. if (currentBench) {
  136. switch(currentBench.status) {
  137. case "ready":
  138. texture = textureReady;
  139. break;
  140. case "running":
  141. texture = textureRunning;
  142. break;
  143. case "offline":
  144. texture = textOffline;
  145. break;
  146. }
  147. }
  148. // 创建精灵对象
  149. let spriteMaterial = new THREE.SpriteMaterial({
  150. map: texture,
  151. color: 0x4AB22E
  152. });
  153. let sprite = new THREE.Sprite(spriteMaterial);
  154. sprite.userData = customData;
  155. // sprite.scale.set(100, 100, 1);
  156. sprite.position.set(x, y + 10, z);
  157. sdkInstance.sceneRenderer.scene.add(childMeshTmp)
  158. sdkInstance.sceneRenderer.scene.add(sprite)
  159. }
  160. };
  161. })
  162. var fbxLoader2 = new THREE.GLTFLoader();
  163. fbxLoader2.setDRACOLoader(dracoLoader);
  164. fbxLoader2.load("../models/mesh2Draco.gltf", function (fbx) {
  165. let result = g_sqlResult;
  166. for (var item of result) {
  167. let x = item.x;
  168. let y = item.y;
  169. let z = item.z;
  170. let ang_x = 0.0;
  171. let ang_y = 0.0;
  172. let ang_z = 0.0;
  173. let benchType = item.bench_type
  174. if (item.use_fix_pos == 1) {
  175. x = JSON.parse(JSON.stringify(item.fix_pos_x));
  176. y = JSON.parse(JSON.stringify(item.fix_pos_y));
  177. z = JSON.parse(JSON.stringify(item.fix_pos_z));
  178. ang_x = JSON.parse(JSON.stringify(item.fix_angle_x));
  179. ang_y = JSON.parse(JSON.stringify(item.fix_angle_y));
  180. ang_z = JSON.parse(JSON.stringify(item.fix_angle_z));
  181. }
  182. else {
  183. }
  184. var distance = 10000.0;
  185. var xSubTmp = x;
  186. var ySubTmp = y;
  187. var zSubTmp = z;
  188. var ang_xSubTmp = ang_x;
  189. var ang_ySubTmp = ang_y;
  190. var ang_zSubTmp = ang_z;
  191. if (g_PosArrayResult) {
  192. var iCount = 0;
  193. for (var itemSub of g_PosArrayResult) {
  194. iCount++;
  195. var xSub = itemSub.x;
  196. var ySub = itemSub.y;
  197. var zSub = itemSub.z;
  198. var ang_xSub = 0.0;
  199. var ang_ySub = 0.0;
  200. var ang_zSub = 0.0;
  201. xSub = itemSub.fix_pos_x;
  202. ySub = itemSub.fix_pos_y;
  203. zSub = itemSub.fix_pos_z;
  204. ang_xSub = itemSub.fix_angle_x;
  205. ang_ySub = itemSub.fix_angle_y;
  206. ang_zSub = itemSub.fix_angle_z;
  207. var disTmp = Math.sqrt(Math.pow(x - xSub, 2) + Math.pow(y - ySub, 2) + Math.pow(z - zSub, 2))
  208. if (disTmp < distance) {
  209. distance = disTmp;
  210. xSubTmp = xSub;
  211. ySubTmp = ySub;
  212. zSubTmp = zSub;
  213. ang_xSubTmp = ang_xSub;
  214. ang_ySubTmp = ang_ySub;
  215. ang_zSubTmp = ang_zSub;
  216. }
  217. }
  218. }
  219. x = xSubTmp;
  220. y = ySubTmp;
  221. z = zSubTmp;
  222. ang_x = ang_xSubTmp;
  223. ang_y = ang_ySubTmp;
  224. ang_z = ang_zSubTmp;
  225. x = JSON.parse(JSON.stringify(xSubTmp));
  226. y = JSON.parse(JSON.stringify(ySubTmp));
  227. z = JSON.parse(JSON.stringify(zSubTmp));
  228. ang_x = JSON.parse(JSON.stringify(ang_xSubTmp));
  229. ang_y = JSON.parse(JSON.stringify(ang_ySubTmp));
  230. ang_z = JSON.parse(JSON.stringify(ang_zSubTmp));
  231. let card_id = item.card_id;
  232. let bench_id = item.bench_id;
  233. if (benchType == 2) {
  234. console.log("控制台查看加载gltf文件返回的对象结构", fbx);
  235. var childMesh = fbx.scene.children[0];
  236. let childMeshTmp = new THREE.Mesh(childMesh.geometry, childMesh.material)
  237. let scale = 0.05;
  238. childMeshTmp.scale.set(scale, scale, scale)
  239. //fbx.scene.children[0].scale.set(5, 5, 5)
  240. //fbx.scene.children[0].position.set(8.7, -1.6, 5.4)
  241. childMeshTmp.position.set(x, y, z)
  242. var Euler = new THREE.Euler(Math.PI * ang_x, Math.PI * ang_y, Math.PI * ang_z);
  243. //var Euler = new THREE.Euler( Math.PI*1.5, Math.PI*0, Math.PI*0);
  244. var quaternion = new THREE.Quaternion();
  245. childMeshTmp.quaternion.copy(quaternion.setFromEuler(Euler))
  246. var customData = {
  247. benchId: bench_id,
  248. benchFlag: true,
  249. };
  250. childMeshTmp.userData = customData;
  251. // 添加水滴
  252. // 加载图片纹理
  253. let benchList = window.store ? window.store.getters['benchList/getBenchList'] : [];
  254. let currentBench = benchList.find(b => b.id == bench_id);
  255. let texture = null;
  256. if (currentBench) {
  257. switch(currentBench.status) {
  258. case "ready":
  259. texture = textureReady;
  260. break;
  261. case "running":
  262. texture = textureRunning;
  263. break;
  264. case "offline":
  265. texture = textOffline;
  266. break;
  267. }
  268. }
  269. // 创建精灵对象
  270. let spriteMaterial = new THREE.SpriteMaterial({
  271. map: texture,
  272. color: 0x4AB22E
  273. });
  274. let sprite = new THREE.Sprite(spriteMaterial);
  275. // sprite.scale.set(100, 100, 1);
  276. sprite.userData = customData;
  277. sprite.position.set(x, y + 10, z);
  278. sdkInstance.sceneRenderer.scene.add(childMeshTmp)
  279. sdkInstance.sceneRenderer.scene.add(sprite)
  280. }
  281. };
  282. if (!sessionStorage.getItem('3dMode') || sessionStorage.getItem('3dMode') == 0) {
  283. setTimeout(() => {
  284. var benchPosList = [];
  285. for (var item of result) {
  286. var localPosition = new THREE.Vector3(item.fix_pos_x, item.fix_pos_y, item.fix_pos_z);
  287. var worldPosition = uwbInstance.convertLocalToWorld(localPosition);
  288. var pos = sdkInstance.getScreenPosition(worldPosition);
  289. benchPosList.push(
  290. {
  291. x: pos.x,
  292. y: pos.y,
  293. benchType: item.bench_type,
  294. benchId: item.bench_id
  295. }
  296. )
  297. }
  298. window.showBenchPos(benchPosList);
  299. }, 2000
  300. )
  301. }
  302. })
  303. });
  304. }
  305. }
  306. // uwb 插件初始化
  307. function uwbInit(originPointPose) {
  308. console.log("=====初始化uwb 实例=====");
  309. const uwbIns = new UWB({
  310. upAxis: "y-up",
  311. LR: "r",
  312. worldPose: originPointPose,
  313. });
  314. return uwbIns;
  315. }
  316. export function uwbMain(domId, modelWidth, modelHeight, finalMode, callback) {
  317. console.log("uwbMain enter");
  318. finalMode = finalMode || "floorplan";
  319. var radius = 0.3;
  320. var height = 0.5;
  321. var segments = 4;
  322. var color = 0x00ff00;
  323. let g_gltf_downloaded = false;
  324. let composer = null;
  325. let box = null;
  326. let sqlQueryInited = false;
  327. let g_fbx = null;
  328. let g_fbxLoader = null;
  329. let sdkInstance = null;
  330. window.renderHeight = modelHeight;
  331. window.renderWidth = modelWidth;
  332. var geometry = new THREE.ConeGeometry(radius, height, segments);
  333. var material1 = new THREE.MeshBasicMaterial({
  334. color: color,
  335. opacity: 0.2,
  336. transparent: true,
  337. });
  338. fetchAndCombine().then(([err, data]) => {
  339. if (err) {
  340. console.error(err);
  341. console.log("模型加载出错");
  342. } else {
  343. let HousePlay = HOUSEPLAY.HousePlay;
  344. let playerContainer = document.getElementById(domId)
  345. data.container = playerContainer;
  346. sdkInstance = new HousePlay(data);
  347. window.sdkInstance = sdkInstance;
  348. sdkInstance.start();
  349. let vrBgContainer = document.getElementById("vr-bg-container");
  350. vrBgContainer.style.width = modelWidth + 'px'
  351. vrBgContainer.style.height = modelHeight + 'px'
  352. vrBgContainer.style.backgroundColor = 'transparent'
  353. // sdkInstance.player.mode = finalMode;
  354. setTimeout(() => {
  355. window.sdkInstance.emit("endLoading", finalMode);
  356. window.sdkInstance.emit("modeChange", null, finalMode);
  357. if (!sessionStorage.getItem('3dMode') || sessionStorage.getItem('3dMode') == 0) {
  358. window.sdkInstance.changeMode(finalMode);
  359. setTimeout(() => {
  360. var container = document.getElementById("ordinary-map")
  361. container.style.opacity = 1;
  362. }, 500)
  363. }
  364. }, 3000)
  365. sdkInstance.on("endLoading", (mode) => {
  366. console.log(mode, '-----+++++-----')
  367. vrBgContainer.style.display = "none";
  368. // 本地坐标系原点位姿
  369. const originPointPose = {
  370. worldPosition: { x: 0, y: 0, z: 0 },
  371. worldQuaternion: {
  372. x: 0,
  373. y: 0,
  374. z: 0,
  375. w: 1,
  376. },
  377. };
  378. //初始化uwb插件
  379. let uwbInstance = uwbInit(originPointPose);
  380. if (g_gltf_downloaded == false) {
  381. let ambientLight = new THREE.AmbientLight(0xffffff); //设置环境光
  382. sdkInstance.sceneRenderer.scene.add(ambientLight); //将环境光添加到场景中
  383. let pointLight = new THREE.PointLight(0xffffff, 1, 0);
  384. pointLight.position.set(200, 200, 200); //设置点光源位置
  385. sdkInstance.sceneRenderer.scene.add(pointLight); //将点光源添加至场景
  386. g_gltf_downloaded = true;
  387. getsqlData(sdkInstance, uwbInstance);
  388. }
  389. let ambientLight = new THREE.AmbientLight(0xffffff); //设置环境光
  390. sdkInstance.sceneRenderer.scene.add(ambientLight); //将环境光添加到场景中
  391. let pointLight = new THREE.PointLight(0xffffff, 1, 0);
  392. pointLight.position.set(200, 200, 200); //设置点光源位置
  393. sdkInstance.sceneRenderer.scene.add(pointLight); //将点光源添加至场景
  394. setTimeout(
  395. function () {
  396. getsqlData(sdkInstance, uwbInstance)
  397. },
  398. 100
  399. );
  400. if (g_fbxLoader == null) {
  401. g_fbxLoader = new THREE.GLTFLoader();
  402. g_fbxLoader.load("../models/mesh2.gltf", function (fbx) {
  403. let ambientLight = new THREE.AmbientLight(0xffffff); //设置环境光
  404. sdkInstance.sceneRenderer.scene.add(ambientLight); //将环境光添加到场景中
  405. let pointLight = new THREE.PointLight(0xffffff, 1, 0);
  406. pointLight.position.set(200, 200, 200); //设置点光源位置
  407. sdkInstance.sceneRenderer.scene.add(pointLight); //将点光源添加至场景
  408. g_fbx = fbx;
  409. console.log("控制台查看加载gltf文件返回的对象结构", fbx);
  410. //fbx.scene.children[0].children[0].scale.set(5, 5, 5)
  411. //window.shader = new THREE.MeshStandardMaterial(fbx.scene.children[0].children[0].material);
  412. //window.shader1 = new THREE.MeshStandardMaterial(fbx.scene.children[0].children[0].material);
  413. setTimeout(
  414. function () {
  415. getsqlData(sdkInstance, uwbInstance)
  416. },
  417. 100
  418. );
  419. });
  420. if (false) {
  421. sqlQueryInited = true;
  422. var index = 0;
  423. setTimeout(
  424. function (card_id, x, y, z) {
  425. var timerId = setInterval(function () {
  426. //console.log(++index + "秒钟到了");
  427. getsqlData(sdkInstance, uwbInstance)
  428. }, 1000);
  429. },
  430. 500
  431. );
  432. }
  433. }
  434. // 创建物体add
  435. // 模型加载完成,进入模型页面,添加摆放的物体
  436. let canvas = document.getElementsByTagName('canvas')[0]
  437. canvas.style.borderRadius = "0px"
  438. canvas.onmousedown = (event) => {
  439. let mouse = new THREE.Vector2();
  440. let raycaster = new THREE.Raycaster();
  441. mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  442. mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
  443. raycaster.setFromCamera(mouse, sdkInstance.player.camera);
  444. let intersects = raycaster.intersectObjects(sdkInstance.sceneRenderer.scene.children);
  445. if (intersects && intersects.length > 0) {
  446. let bFirst = true;
  447. let bool = false;
  448. let bool1 = false;
  449. intersects.forEach(m => {
  450. if (m.object.geometry.type != "PlaneBufferGeometry") {
  451. if (m.object.userData.benchFlag == true) {
  452. if (!bool) {
  453. bool = true;
  454. //m.object.material = window.shader1;
  455. ////m.object.scale.set(10, 10, 10)
  456. //m.object.scale.set(5, 5, 5)
  457. //outlineObj(m.object)
  458. let player = document.getElementById(domId)
  459. // player.style.display = "none"
  460. if (box) {
  461. sdkInstance.sceneRenderer.scene.remove(box);
  462. }
  463. window.handleBenchClick(m.object.userData.benchId, m.object.userData.bShowRemoteButton)
  464. box = new THREE.BoxHelper(m.object, '#ff0000'); //object 模型
  465. sdkInstance.sceneRenderer.scene.add(box);
  466. //let ambientLight = new THREE.AmbientLight(0xffffff); //设置环境光
  467. //sdkInstance.sceneRenderer.scene.add(ambientLight); //将环境光添加到场景中
  468. //let pointLight = new THREE.PointLight(0xffffff, 1, 0);
  469. //pointLight.position.set(200, 200, 200); //设置点光源位置
  470. //sdkInstance.sceneRenderer.scene.add(pointLight); //将点光源添加至场景
  471. }
  472. //outlineObj(m.object)
  473. //m.object.material = FXAAShader
  474. }
  475. } else if (m.object.geometry.type == "PlaneBufferGeometry") {
  476. if (m.object.userData.benchFlag == true) {
  477. window.handleListClick(m.object.userData.benchId)
  478. }
  479. }
  480. })
  481. bool = false;
  482. bool1 = false;
  483. }
  484. }
  485. canvas.onmouseover = (event) => {
  486. let mouse = new THREE.Vector2();
  487. let raycaster = new THREE.Raycaster();
  488. mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  489. mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
  490. raycaster.setFromCamera(mouse, sdkInstance.player.camera);
  491. let intersects = raycaster.intersectObjects(sdkInstance.sceneRenderer.scene.children);
  492. if (intersects && intersects.length > 0) {
  493. let bFirst = true;
  494. let bool = false;
  495. let bool1 = false;
  496. intersects.forEach(m => {
  497. if (m.object.geometry.type == "PlaneBufferGeometry") {
  498. if (m.object.userData.benchFlag == true) {
  499. console.log('===== bench selected =====')
  500. // window.handleListClick(m.object.userData.benchId)
  501. }
  502. }
  503. })
  504. bool = false;
  505. bool1 = false;
  506. }
  507. }
  508. return;
  509. let outlinePass = null;
  510. function outlineObj(selectedObjects) {
  511. composer = new THREE.EffectComposer(sdkInstance.sceneRenderer.renderer); // 特效组件
  512. var renderPass = new THREE.RenderPass(sdkInstance.sceneRenderer.scene, sdkInstance.player.camera);
  513. composer.addPass(renderPass); // 特效渲染
  514. outlinePass = new THREE.OutlinePass(new THREE.Vector2(window.innerWidth, window.innerHeight), sdkInstance.sceneRenderer.scene, sdkInstance.player.camera);
  515. composer.addPass(outlinePass); // 加入高光特效
  516. outlinePass.pulsePeriod = 2; //数值越大,律动越慢
  517. outlinePass.visibleEdgeColor.set(0xff0000); // 高光颜色
  518. outlinePass.hiddenEdgeColor.set(0x000000);// 阴影颜色
  519. outlinePass.usePatternTexture = true; // 使用纹理覆盖?
  520. outlinePass.edgeStrength = 5; // 高光边缘强度
  521. outlinePass.edgeGlow = 1; // 边缘微光强度
  522. outlinePass.edgeThickness = 1; // 高光厚度
  523. var textureLoader = new THREE.TextureLoader();
  524. textureLoader.load('../models/matcap.png', function (texture) {
  525. outlinePass.patternTexture = texture;
  526. texture.wrapS = THREE.RepeatWrapping;
  527. texture.wrapT = THREE.RepeatWrapping;
  528. outlinePass.selectedObjects = selectedObjects; // 需要高光的obj
  529. if (composer != null) {
  530. animate();
  531. }
  532. })
  533. }
  534. function animate() {
  535. requestAnimationFrame(animate);
  536. if (composer != null) {
  537. composer.render();
  538. }
  539. }
  540. });
  541. }
  542. sdkInstance.on("modeChange", function (currentMode, newMode) {
  543. if (newMode === "transitioning") {
  544. return;
  545. }
  546. console.log(newMode, '@@@@@@@@@@@@@')
  547. });
  548. });
  549. }