test1.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <div id="loading">正在加载模型中...</div>
  9. <!-- 添加呈现的video标签或img标签,并设置必要的css来控制其大小 -->
  10. <video id="EngineContent" autoplay muted style="width: 1900px;height:1080px;">浏览器不支持</video>
  11. <div>
  12. <button id="moveToHome" onclick="updateCamera(this)">移动到主视图</button>
  13. <!-- <button id="moveTo" onclick="updateCamera(this)">移动到指定相机参数</button>
  14. <button id="moveToCode" onclick="updateCamera(this)">移动到某个树节点(code)</button>
  15. <button id="moveToItem" onclick="updateCamera(this)">移动到某个树节点(item)</button>
  16. <button id="moveToPos" onclick="updateCamera(this)">移动到某个位置</button -->
  17. <!-- <button id="moveToAabbWithFace" onclick="updateCamera(this)">移动到包围盒某个面</button> -->
  18. <button id="moveToAabbWithDistance" onclick="updateCamera(this)">移动到包围盒某个面(Distance)</button>
  19. <!-- <button id="moveToAabbWithMatrix" onclick="updateCamera(this)">移动到包围盒某个面(Matrix)</button> -->
  20. </div>
  21. <div>
  22. <input type="text" id="color.value" value="0xA0522Dff" />
  23. <button id="itemColor" onclick="updateModel(this)">修改颜色</button>
  24. <button id="itemColorClean" onclick="updateModel(this)">颜色还原</button>
  25. <button id="selectItem" onclick="updateModel(this)">选中模型</button>
  26. <button id="selectAndMove" onclick="selectAndMove(this)">选中并移动到</button>
  27. </div>
  28. <div>
  29. <label>着色器(全局) </label><br />
  30. <select id="context.shaderIndex" onchange="onchangeSetting(this, 'int')"
  31. oninput="onchangeSetting(this, 'int')">
  32. <option value="0">未设置</option>
  33. <option value="1">物理光照-单灯</option>
  34. <option value="2">物理光照-双灯</option>
  35. <option value="3">物理光照-三灯</option>
  36. <option value="4" selected>颜色</option>
  37. </select>
  38. <div>
  39. <label>环境光补偿</label><br />
  40. <input type="range" id="ambientIndenty" min="0.00" max="1.00" step="0.01" value="0.5"
  41. onchange="onchangeSetting(this, 'float')"
  42. oninput="onchangeSetting(this, 'float')" /><span id="ambientIndentyValue"></span>
  43. </div>
  44. <div>
  45. <label>光线强度</label><br />
  46. <input type="range" id="diffuseIntensity" min="0.00" max="1.00" step="0.01" value="0.5"
  47. onchange="onchangeSetting(this, 'float')"
  48. oninput="onchangeSetting(this, 'float')" /><span id="diffuseIntensityValue"></span>
  49. </div>
  50. <div>
  51. <label>高光强度</label><br />
  52. <input type="range" id="specularIntensity" min="0.00" max="1.50" step="0.01" value="0.75"
  53. onchange="onchangeSetting(this, 'float')"
  54. oninput="onchangeSetting(this, 'float')" /><span id="specularIntensityValue"></span>
  55. </div>
  56. <div>
  57. <label>探照灯强度</label><br />
  58. <input type="range" id="searchLightIntensity" min="0.00" max="1.00" step="0.01" value="0.5"
  59. onchange="onchangeSetting(this, 'float')"
  60. oninput="onchangeSetting(this, 'float')" /><span id="searchLightIntensityValue"></span>
  61. </div>
  62. </div>
  63. <div>
  64. <label>点选背景虚化</label>
  65. <input type="range" id="color.pickup.bkAlpha" value="0.2" min="0" max="1" step="0.01"
  66. onchange="updateSettings(this, 'float')" oninput="updateSettings(this, 'float')">
  67. <span id="color.pickup.bkAlphaValue"></span>
  68. </div>
  69. <div>
  70. <label>viewCube </label>
  71. <input type="checkbox" id="viewcube.visible" onchange="onchangeSetting(this, 'bool')" checked="checked" />
  72. </div>
  73. <div>
  74. <label>显示帧率 </label>
  75. <input type="checkbox" id="sysinfo.visible" onchange="onchangeSetting(this, 'bool')" checked="checked" />
  76. </div>
  77. <div><label for="eventType">事件类型:</label><span id="eventType"></span></div>
  78. <div><label for="worldPos">世界坐标:</label><span id="worldPos"></span></div>
  79. <div><label for="screenPos">屏幕坐标:</label><span id="screenPos"></span></div>
  80. <div><label for="targetItem">目标节点:</label><span id="targetItem"></span></div>
  81. <div><label for="targetName">目标名称:</label><span id="targetName"></span></div>
  82. <div><label for="targetCode">目标位号:</label><span id="targetCode"></span></div>
  83. <div><label for="targetModel">目标模型:</label><span id="targetModel"></span></div>
  84. <div><label for="targetModel">当前相机参数:</label><span id="currentParam" onclick="console.log(player.Native.Camera.currentParam())">获取</span></div>
  85. <!-- <img id="EngineContent"></img> -->
  86. <!-- 引入qwebchannel.js、Player.js、PlayerUtils.js -->
  87. <script src="qwebchannel.js"></script>
  88. <script src="Player.js"></script>
  89. <script src="PlayerUtils.js"></script>
  90. <script>
  91. var sam0023;
  92. var modelsMap={}
  93. //1.创建RemotePlayer对象
  94. var player = new RemotePlayer({
  95. video: document.getElementById("EngineContent"), //绑定视频标签或图片标签
  96. signalServer: "ws://192.168.101.66:17008", //云渲染服务器,发布时需要改为实际地址
  97. engineId: "" + Date.now(), // 引擎会话id,如果已存在则连接,没有则创建,会话在断开连接后超时自动关闭
  98. rtcIni: 'rtc.ini', // 可指定webrtc配置文件,默认为rtc.ini,相对目录为集群节点的enginePath目录
  99. autoResize: true, // 引擎是否跟跟随标签尺寸
  100. limtMoveCPS: 10, // 限制每秒鼠标移动的消息个数
  101. userTimeout: 1000 * 60 * 60 * 3, // 用户操作超时设置,毫秒
  102. exitTimeout: 1000 * 30, // 用户超时后多久断开会话
  103. maxTimeout: 1000, // 会话超时时间,允许掉线后引擎保存多久,在该时间内可重新连接到会话,否则会创建新的会话
  104. debug: false // 是否启用调试,开启后调用Native接口时会使用console.log进行记录
  105. });
  106. //2.[可选]监听连接成功消息
  107. player.on("Connected", () => {
  108. console.log("Has connected to engine")
  109. });
  110. //3.[可选]监听连接失败消息
  111. player.on("Disconnected", (e) => {
  112. console.log("Disconnected from engine", e);
  113. //4.[推荐]尝试重新连接
  114. player.reconnect();
  115. });
  116. //5. [推荐] 响应UserTimeOut消息,引擎接收用户鼠标触屏事件超时发出通知
  117. player.on("UserTimeOut", () => {
  118. console.info(`用户长时间没有操作三维视图,会话即将退出,可调用player.resetTimer()取消退出`);
  119. });
  120. //6.监听远程过程调用加载完成消息
  121. player.on("NativeLoad", async (Native) => {
  122. var cf="data://models/CF.pr";
  123. var t2File = "data://models/T2.pr";
  124. var SamplerFile = "data://models/sampler.pr";
  125. // var errStr = await PlayerUtils.call(Native.NodeProxy.openProject, "data://pprj/test/test.pprj");
  126. // 加载工程模型
  127. var errStr = await PlayerUtils.call(Native.Model.loadModel, "cf", cf);
  128. //小经编机列表
  129. var machineList=[
  130. {"text":"","xy":[]},
  131. ];
  132. var cnt = 1
  133. var top=0;
  134. for(var i=1;i<=6;i++){ //6排
  135. if (i==2||i==4||i==6){
  136. top += 13 //过道
  137. }else{
  138. top += 8 //小过道
  139. }
  140. var left=0;
  141. for (var i2 = 1; i2 <= 11; i2++) { //每排11组,每组2台
  142. left += 5 //每组间过道间隔宽度
  143. if(i==1 && i2==7){
  144. left = left+3
  145. continue //第一排的入口,不摆放机器
  146. }
  147. //每组2台
  148. let name="t"+cnt;
  149. await PlayerUtils.call(Native.Model.loadModel, name, t2File);
  150. let temp=await player.Native.Model.getInfo(name);
  151. modelsMap[temp.nodePtr] = name
  152. player.Native.NodeProxy.setNodePosition(temp.nodePtr, [left,top,0]);
  153. if(i==1||i==3||i==5) player.Native.NodeProxy.setNodeRotation(temp.nodePtr, [0,0,180]); //第一排机器方向
  154. var srcPosition = await player.Native.NodeProxy.getNodePosition(temp.nodePtr);
  155. //console.log("posio",srcPosition)
  156. // 创建标记
  157. var options = {"text":(cnt)+"#机器","visible":true,"maxLod":110,"minLod":0.1,"textColor":parseInt("0x62cafdff")};
  158. options.pos = [srcPosition[0]-1,srcPosition[1]-2,srcPosition[2]];
  159. var markPtr = await player.Native.GisMarker.create(options);
  160. player.Native.GisMarker.update(markPtr, options);
  161. cnt++
  162. left = left+3 //同组两两机器间隔
  163. name="t"+cnt;
  164. await PlayerUtils.call(Native.Model.loadModel, name, t2File);
  165. temp=await player.Native.Model.getInfo(name);
  166. modelsMap[temp.nodePtr] = name
  167. player.Native.NodeProxy.setNodePosition(temp.nodePtr, [left,top,0]);
  168. if(i==1||i==3||i==5) player.Native.NodeProxy.setNodeRotation(temp.nodePtr, [0,0,180]); //第一排机器方向
  169. var srcPosition = await player.Native.NodeProxy.getNodePosition(temp.nodePtr);
  170. //console.log("posio",srcPosition)
  171. // 创建标记
  172. var options = {"text":(cnt)+"#机器","visible":true,"maxLod":110,"minLod":0.1,"textColor":parseInt("0x62cafdff")};
  173. options.pos = [srcPosition[0]-1,srcPosition[1]-2,srcPosition[2]];
  174. var markPtr = await player.Native.GisMarker.create(options);
  175. player.Native.GisMarker.update(markPtr, options);
  176. cnt++
  177. }
  178. }
  179. document.getElementById("loading").remove(true)
  180. // var xxxx = await PlayerUtils.call(Native.Model.loadModel, "t2", t2File);
  181. // var t2=await player.Native.Model.getInfo("t2");
  182. // console.error("t2======",t2)
  183. // // // player.Native.NodeProxy.setNodePosition(t2,)
  184. // var srcPosition = await player.Native.NodeProxy.getNodePosition(t2.nodePtr);
  185. // console.error("posio",srcPosition)
  186. // player.Native.NodeProxy.setNodePosition(t2.nodePtr, [10,0,0]);
  187. // 调整视角
  188. //player.Native.Camera.goHome(1);
  189. player.Native.Camera.moveTo([45.23259656137503, -33.901171144513334, 28.26770063277006], [45.76455018242784, 27.05467622332595, 6.080741774994106], [0.0029846509218903667, 0.34200712024661856, 0.9396926207859086], 1.1);
  190. //player.Native.Camera.moveToItem(lastPtr,1);
  191. // // 选择Pickup工具
  192. player.Native.Tools.setCurrentTool("system.Pickup");
  193. //不显示提示框
  194. player.Native.Settings.set("tips.enabled", "bool", false);
  195. // //点选高亮显示
  196. player.Native.Settings.set("pickUp.highlight", "bool", false);
  197. //点选包围盒
  198. player.Native.Settings.set("show.select.box", "bool", true);
  199. player.Native.Settings.set("skybox.select", "string", "blue");
  200. //点选背景虚化
  201. player.Native.Settings.set("color.pickup.bkAlpha", "float", 0.8);
  202. // 选中展示节点
  203. // sam0023 = await player.Native.ModelTree.findItemByName("CYLINDER 3 of EQUIPMENT /C1101", 0, true, 3);
  204. player.Native.Settings.set('ambientIndenty', 'float', 0.39);//初始化环境光补偿
  205. player.Native.Settings.set('diffuseIntensity', 'float', 0.8);//初始化光线强度
  206. player.Native.Settings.set('specularIntensity', 'float', 0.64);//初始化高光强度
  207. player.Native.Settings.set('searchLightIntensity', 'float', 0.5);//初始化探照灯强度
  208. // 点击事件一般仅用于浏览工具,在点选工具下无效
  209. Native.Tools.setCurrentTool("system.Browse");
  210. Native.ModelTree.EventBrowseLClick.connect((event) => {
  211. updateInfo("左键点击", event)
  212. });
  213. Native.ModelTree.EventBrowseRClick.connect((event) => {
  214. updateInfo("右键点击", event)
  215. });
  216. })
  217. async function updateSettings(object, type) {
  218. console.log(object)
  219. if (object.id) {
  220. if (type == "bool") {
  221. player.Native.Settings.set(object.id, type, object.checked);
  222. } else if (type == "red") {
  223. //参数前3个为RGB值,最后一个为透明度?,有点问题,好像不是正常的RGB?
  224. const xx = document.getElementById("color.value");
  225. player.Native.Settings.set(object.id, "string", xx.value);
  226. } else {
  227. player.Native.Settings.set(object.id, type, object.value);
  228. }
  229. // 更新span值
  230. if (type == "float") {
  231. var showValueStr = object.id + "Value";
  232. if (document.getElementById(showValueStr))
  233. document.getElementById(showValueStr).innerText = object.value;
  234. }
  235. }
  236. }
  237. //修改模型
  238. async function updateModel(object) {
  239. // sam0023 = await player.Native.ModelTree.getSelectedItem();
  240. sam0023 = await player.Native.ModelTree.getItemBySelfId(2433);
  241. console.log("0023", sam0023);
  242. if (object.id === "selectItem") {
  243. // if (object.checked) {
  244. player.Native.ModelTree.setSelectItem(sam0023.item);
  245. // } else {
  246. // player.Native.ModelTree.setSelectItem(0);
  247. // }
  248. } else if (object.id == "itemColor") {
  249. console.log("瓦特?", JSON.stringify(sam0023))
  250. // if (object.checked) {
  251. const xx = document.getElementById("color.value");
  252. player.Native.ModelTree.setItemColor(sam0023.item, parseInt(xx.value));
  253. // } else {
  254. // player.Native.ModelTree.restoreItemColor(sam0023.item);
  255. // }
  256. } else if (object.id == "itemColorClean") {
  257. player.Native.ModelTree.restoreItemColor(sam0023.item);
  258. } else if (object.id == "itemVisible") {
  259. player.Native.ModelTree.setItemVisible(sam0023.item, object.checked);
  260. }
  261. }
  262. var eventType = document.getElementById("eventType");
  263. var worldPos = document.getElementById("worldPos");
  264. var screenPos = document.getElementById("screenPos");
  265. var targetItem = document.getElementById("targetItem");
  266. var targetName = document.getElementById("targetName");
  267. var targetCode = document.getElementById("targetCode");
  268. var targetModel = document.getElementById("targetModel");
  269. var targetParent = document.getElementById("targetParent");
  270. function updateInfo(name, event) {
  271. //console.log(name, event);
  272. /*
  273. eventType.innerText = name;
  274. worldPos.innerText = JSON.stringify(event.pos);
  275. screenPos.innerText = JSON.stringify(event.screen);
  276. targetItem.innerText = event.object ? event.object.item : "";
  277. targetName.innerText = event.object ? event.object.name : "";
  278. targetCode.innerText = event.object ? event.object.code : "";
  279. targetModel.innerText = event.object ? event.object.ownModel : "";
  280. */
  281. var modelsId = event.object ? event.object.ownModel : "";
  282. if (modelsId=="") return
  283. var devName=modelsMap[modelsId];
  284. if(devName==null) return;
  285. }
  286. //背景虚化设置
  287. async function onchangeSetting(object, type) {
  288. if (object.id) {
  289. player.Native.Settings.set(object.id, type, object.checked);
  290. }
  291. }
  292. //选中并移动
  293. async function selectAndMove(obj) {
  294. var se = await player.Native.ModelTree.getItemBySelfId(2433);
  295. console.log("se", se);
  296. //选中
  297. player.Native.ModelTree.setSelectItem(se.item);
  298. //移动相机
  299. calcInfo = await PlayerUtils.call(player.Native.ModelTree.calcItemAabb, se.item);
  300. player.Native.Camera.moveToAabbWithDistance([calcInfo.localAabb.min, calcInfo.localAabb.max], 3,
  301. 40, 7);
  302. }
  303. //相机移动设置
  304. async function updateCamera(obj) {
  305. if (obj.id == "moveToHome")
  306. player.Native.Camera.goHome(3);
  307. else if (obj.id == "moveTo")
  308. player.Native.Camera.moveTo([9, 53, 12], [9, 11, 9], [0, 0, 1], 3);
  309. else if (obj.id == "moveToCode")
  310. player.Native.Camera.moveToCode(sam002.code, 3);
  311. else if (obj.id == "moveToItem") {
  312. sam0023 = await player.Native.ModelTree.getItemBySelfId(1576);
  313. player.Native.Camera.moveToItem(sam0023.item, 3);
  314. } else if (obj.id == "moveToPos")
  315. player.Native.Camera.moveToPos([0, 5, 5], sam.nodePtr, 5, 3);
  316. else if (obj.id == "moveToAabbWithFace") {
  317. var curItemInfo = await player.Native.ModelTree.getItemBySelfId(1576);
  318. // var curItemInfo = await PlayerUtils.call(player.Native.ModelTree.findItemByName, "/VENTILATION_UNIT1", 0, true, 3);
  319. calcInfo = await PlayerUtils.call(player.Native.ModelTree.calcItemAabb, curItemInfo.item);
  320. player.Native.Camera.moveToAabbWithFace([calcInfo.localAabb.min, calcInfo.localAabb.max], 3, 40);
  321. // player.Native.Camera.moveToAabbWithFace([calcInfo[0].aabb.min, calcInfo[0].aabb.max], 3, 21);
  322. } else if (obj.id == "moveToAabbWithDistance") {
  323. var curItemInfo = await player.Native.ModelTree.getItemBySelfId(1576);
  324. // var curItemInfo = await PlayerUtils.call(player.Native.ModelTree.findItemByName, "/VENTILATION_UNIT1", 0, true, 3);
  325. calcInfo = await PlayerUtils.call(player.Native.ModelTree.calcItemAabb, curItemInfo.item);
  326. player.Native.Camera.moveToAabbWithDistance([calcInfo.localAabb.min, calcInfo.localAabb.max], 3,
  327. 40, 7);
  328. } else if (obj.id == "moveToAabbWithMatrix") {
  329. var curItemInfo = await player.Native.ModelTree.getItemBySelfId(1576);
  330. // var curItemInfo = await PlayerUtils.call(player.Native.ModelTree.findItemByName, "/VENTILATION_UNIT1", 0, true, 3);
  331. calcInfo = await PlayerUtils.call(player.Native.ModelTree.calcItemAabb, curItemInfo.item);
  332. identityMat = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
  333. // void js::CameraProxy::moveToAabbWithMatrix ( const QVariantList & aabb,
  334. // float second,
  335. // int face,
  336. // double kDistance,
  337. // const QVariantList & mat
  338. // )
  339. // inlineslot
  340. // 移动到包围盒某个面,将会清除未完成的相机动画任务,立即执行该动画
  341. // 参数
  342. // aabb 包围盒 [[minX, minY, minZ], [maxX, maxY, maxZ]]
  343. // second 过渡时间,单位为秒
  344. // face 面索引,0表示不定位视角,可设置一个面,也可设置两个或三个面进行组合
  345. // Top = 1
  346. // Bottom = 2
  347. // Front = 4
  348. // Back = 8
  349. // Left = 16
  350. // Right = 32,
  351. // kDistance 与包围盒中心的距离系数,相对于包围盒对角线一半,默认是1.1
  352. // mat aabb所处坐标系到世界坐标系的矩阵,默认是单位矩阵,即aabb基于世界坐标系
  353. player.Native.Camera.moveToAabbWithMatrix([calcInfo.localAabb.min, calcInfo.localAabb.max], 3, 40,
  354. 5, identityMat);
  355. }
  356. }
  357. //着色器设置
  358. async function onchangeSetting(object, type) {
  359. if (object.id) {
  360. player.Native.Settings.set(object.id, type, object.value);
  361. // 更新span值
  362. if (type == "float") {
  363. var showValueStr = object.id + "Value";
  364. document.getElementById(showValueStr).innerText = object.value;
  365. }
  366. }
  367. }
  368. </script>
  369. </body>
  370. </html>
  371. <style type="text/css">
  372. body{
  373. padding: 0;
  374. margin: 0;
  375. }
  376. #loading{
  377. position: absolute;
  378. top: 50%;
  379. left: 50%;
  380. font-size: 18px;
  381. color: blue;
  382. z-index: 1;
  383. margin-left: -75px;
  384. width: 150px;
  385. }
  386. </script>