1 完整代碼下載javascript
https://pan.baidu.com/s/1JJyVcP2KqXsd5G6eaYpgHQphp
提取碼 3fzt (壓縮包名: 2020-3-12-demo.zip)html
2 圖片展現java
3 代碼展現web
1 (function(v, f){ 2 'use strict'; 3 4 if(!v || !f || window.Three !== undefined){return;} 5 6 if(WEBGL.isWebGLAvailable() === false){//是否支持WebGL 7 document.body.appendChild(WEBGL.getWebGLErrorMessage()); 8 return; 9 } 10 11 THREE.Cache.enabled = true;//加載器啓用緩存 12 13 var Three = function (){ 14 //鼠標平移視角功能 的 屬性 15 this.cmtp = { 16 speed:10, //平移速度 17 state:{x:0, y:0}, //平移狀態 18 size:20, //鼠標距顯示器邊框的大小(若是鼠標當前位置符合這個範圍則平移視角) 19 run:false //是否啓用鼠標平移視角功能 20 }; 21 22 this.animateFunc = [];//每幀自動執行的函數列表 23 this.sceneSize = sceneSize;//場景大小 24 this.clock = new THREE.Clock();//跟蹤時間 25 this.scene = scene//場景 26 this.camera = createCamera(this.sceneSize);//相機 27 this.renderer = createRenderer();//渲染器 28 this.light = createLight(this.scene);//燈光 29 this.control = createControl(this.camera, this.renderer, this.clock, this.animateFunc, this.cmtp);//控制器 30 this.Land = Land; 31 32 animate(this.scene, this.camera, this.renderer, this.animateFunc);//動畫循環 33 } 34 35 //布爾運算 type = intersect 交集、重合的部分 union 並集、組合、相加 subtract 差集、相減 36 Three.prototype.getBSP = (meshA, meshB, type)=>{ 37 if(!meshA || !meshB || !type){return;} 38 var bsp_a = new ThreeBSP(meshA);//生成ThreeBSP對象 39 var bsp_b = new ThreeBSP(meshB);//生成ThreeBSP對象 40 var bsp = bsp_a[type](bsp_b);//進行 type 計算 41 var mesh = bsp.toMesh();//轉換爲mesh模型 42 mesh.geometry.computeFaceNormals();//更新模型的面 43 mesh.geometry.computeVertexNormals();//更新模型的頂點 44 mesh.geometry = new THREE.BufferGeometry().fromGeometry(mesh.geometry);//轉換爲 buff緩衝幾何體 45 mesh.material = meshA.material;//重賦值紋理 46 return mesh; 47 } 48 49 //建立 場景 50 var createScene = ()=>{ 51 var sce = new THREE.Scene(); 52 //sce.fog = new THREE.Fog(0xcce0ff, 800, 1000);//線性霧 53 sce.background = new THREE.CubeTextureLoader() 54 .setPath('img/cube/skyboxsun25deg/') 55 .load( [ 'px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg' ] ); 56 return sce; 57 } 58 59 //建立 相機 60 var createCamera = (sceneSize)=>{ 61 var camera = new THREE.PerspectiveCamera(75, v.client.w/v.client.h, 1, sceneSize/2); 62 camera.position.set(0, 0, 100);//相機起始位置 63 return camera; 64 } 65 66 //建立 渲染器 67 var createRenderer = ()=>{ 68 var renderer = new THREE.WebGLRenderer({ 69 antialias : true,//抗割齒 70 powerPreference:"high-performance"//選擇高性能GPU渲染 71 }); 72 renderer.setSize(v.client.w, v.client.h);//設置渲染大小 73 renderer.setPixelRatio(window.devicePixelRatio);//渲染矯正 74 renderer.gammaFactor = 2.2;//着色校訂 75 renderer.physicallyCorrectLights = true;//使其精確照明 76 renderer.shadowMap.enabled = true;//渲染陰影 77 //renderer.autoClear = true;//每幀自動清理緩存 78 if(!renderer.extensions.get('WEBGL_depth_texture')){console.log("深度紋理擴展獲取失敗:WEBGL_depth_texture");} 79 renderer.domElement.style.zIndex = "0"; 80 renderer.domElement.style.position = "absolute"; 81 renderer.domElement.style.top = "0px"; 82 renderer.domElement.style.left = "0px"; 83 document.body.appendChild(renderer.domElement); 84 return renderer; 85 } 86 87 //建立 燈光 88 var createLight = (scene)=>{ 89 scene.add(new THREE.AmbientLight(0x696969));//環境光(無處不在的光,太陽光) 90 var l_d = 1000, light = new THREE.DirectionalLight(0xF0F8FF, 1);//平行光(產生陰影的光) 91 light.position.set(-3000, 3000, -3000); 92 light.position.multiplyScalar(1); 93 //陰影 94 light.castShadow = true; 95 light.shadow.mapSize.width = 1024; 96 light.shadow.mapSize.height = 1024; 97 light.shadow.camera.left = -l_d; 98 light.shadow.camera.right = l_d; 99 light.shadow.camera.top = l_d; 100 light.shadow.camera.bottom = -l_d; 101 light.shadow.camera.near = 1; 102 light.shadow.camera.far = 6000; 103 scene.add(light); 104 return light; 105 } 106 107 //建立 控制器 108 var createControl = (camera, renderer, clock, animateFunc, cmtp)=>{ 109 var control = new THREE.OrbitControls(camera, renderer.domElement); 110 control.target = new THREE.Vector3(0, 0, 0);//相機焦點 111 //control.minPolarAngle = Math.PI * 0.3;//向上最大角度 112 //control.maxPolarAngle = Math.PI * 0.4;//向下最大角度 113 control.minDistance = 1;//最小距離 114 control.maxDistance = 10000;//最大距離 115 control.autoRotateSpeed = 10;//自動旋轉速度 116 //control.panSpeed = 100;//鼠標旋轉速度 117 control.enableZoom = true;//是否啓用縮放 118 control.enableKeys = true;//是否啓用鍵盤 119 control.panSpeed = 1;//鼠標平移速度 120 control.keyPanSpeed = 100;//按鍵平移的速度 121 control.keys.LEFT = 65;//key a左 122 control.keys.UP = 87;//key w前 123 control.keys.RIGHT = 68;//key d右 124 control.keys.BOTTOM = 83;//key s後 125 controlMousePanTargetInit(control, cmtp);//初始化鼠標平移 126 animateFunc.push(()=>{//加入實時更新隊列 127 if(!control || !clock){return;} 128 control.update(clock.getDelta());//更新控制器 129 //鼠標平移視角, myRunPan 方法是我在控制器插件上新加的方法(OrbitControls.js/900) 130 //有些用戶的瀏覽器設置並佔用了鼠標右鍵(默認平移鍵), 131 if(cmtp.run === true){control.myRunPan(cmtp);} 132 }); 133 return control; 134 } 135 136 //控制鼠標平移視角 初始化 137 var controlMousePanTargetInit = (control, cmtp)=>{ 138 var w, h; 139 v.addEvent(document.body, "mousemove", (e)=>{ 140 e.preventDefault(); 141 if(cmtp.run !== true){return;} 142 w = v.client.w - e.clientX; 143 h = v.client.h - e.clientY; 144 145 if(w < cmtp.size){cmtp.state.x = 2;} 146 else if(w > v.client.w - cmtp.size){cmtp.state.x = 1;} 147 else{cmtp.state.x = 0;} 148 149 if(h < cmtp.size){cmtp.state.y = 2;} 150 else if(h > v.client.h - cmtp.size){cmtp.state.y = 1;} 151 else{cmtp.state.y = 0;} 152 }); 153 } 154 155 //建立 動畫循環 156 var k, len, animate = (scene, camera, renderer, animateFunc)=>{ 157 requestAnimationFrame(()=>{animate(scene, camera, renderer, animateFunc);}); 158 len = animateFunc.length; 159 for(k = 0; k < len; k++){animateFunc[k]();} 160 renderer.render(scene, camera); 161 } 162 163 164 165 var Land = function (){ 166 land.group.add(new THREE.GridHelper(sceneSize, 100));//添加網格輔助線 167 scene.add(land.group); 168 this.name = land.name; 169 this.group = land.group; 170 this.meshs = land.meshs; 171 } 172 173 //建立 全部的成形紋理 174 var land_texture = (object)=>{ 175 //parameter: 176 //texNum:number 加載紋理數量 默認值爲最大值 this.textureMax 177 //texture.repeat.set(25, 25);//x y 貼圖平鋪次數 178 //texture.anisotropy = 1024;//紋理的清晰度(值爲2的幕:1, 2, 4, 8, ... 512, 1024, 2048, ...) 179 //texture.matrixAutoUpdate = false;//是否自動更新矩陣 180 //texture.updateMatrix();//手動更新矩陣 181 //texture.needsUpdate = true;//下次使用紋理時觸發一次更新 182 var o = object || {}; 183 var num = o.texNum === undefined ? land.textureMax : o.texNum; 184 if(typeof(num) !== "number" || num === 0){return;} 185 186 var map = new Map(), load = new THREE.TextureLoader(); 187 var k, loading = (index, url)=>{ 188 let texture = load.load(url); 189 texture.wrapS = texture.wrapT = THREE.RepeatWrapping; 190 texture.anisotropy = 1024; 191 texture.matrixAutoUpdate = false; 192 texture.updateMatrix(); 193 map.set(index, texture); 194 } 195 for(k = 0; k < num; k++){loading(k, "img/texture/land/"+k+".jpg");} 196 //setTimeout(()=>{if(map.size === num){console.log("下載圖片完成");}}, 3000); 197 return map; 198 } 199 200 //建立 全部的 成形材質 201 var land_material = ()=>{ 202 var k, map = new Map(); 203 for(k = 0; k < land.textures.size; k++){ 204 map.set(k, new THREE.MeshLambertMaterial({map:land.textures.get(k), transparent:false})); 205 } 206 map.set(land.textures.size, new THREE.MeshLambertMaterial({color:land.color, transparent:false})); 207 return map; 208 } 209 210 //建立 全部的 成形的幾何體 211 var land_geometry = ()=>{ 212 213 } 214 215 //all mesh 216 var land_mesh = ()=>{ 217 var map = new Map(); 218 var g = new THREE.BoxGeometry(256, 256, 50); 219 map.set(0, new THREE.Mesh(g, land.materials.get(0))); 220 map.set(1, new THREE.Mesh(g, land.materials.get(1))); 221 222 return map; 223 } 224 225 226 227 var sceneSize = 5000; 228 var scene = createScene(); 229 var land = { 230 name : "land", 231 textureMax : 5, 232 color : 0x00ff00, 233 group : new THREE.Group() 234 } 235 land.group.name = "group_land"; 236 land.textures = land_texture(); 237 land.materials = land_material(); 238 land.geometrys = land_geometry(); 239 land.meshs = land_mesh(); 240 241 242 243 window.Three = new Three(); 244 245 }(new View(), new Func()))
1 /** 視圖類 2 Gui(a, b, c, d, e): 3 //介紹: 經過 修改控制器可視視圖 來 更新 a引用對象裏的屬性值, (Gui類的位置在View類的原型裏) 4 //暫支持屬性類型: number(計量控制器), function(按鈕), boolean(複選框) 5 //在默認渲染全部a對象屬性的時候,不符合的屬性會自動忽略掉 6 //控制器視圖 與 a引用對象 默認是雙向綁定的, 因此它會覆蓋掉原有的get與set 7 a : object 必須, 目標對象(引用) 8 b : array 可選, 選擇性的渲染a裏面屬性, 若是不等於array則默認渲染所有a對應的屬性名, 反之經過b數組裏的字符串渲染對應a對象裏的屬性名 9 c : array[min -1, max 1, step 0.1] 可選, a對象若是有多個number類型並有不一樣的min max step值,則須要用對象包裹,{string:[min, max, step], ...} (string必須對應a對象的屬性名) 10 d : string 可選, 塊的標題, 默認 "class" 11 e : boolean 可選, 是否雙向綁定, 默認爲 true 12 例: v = new View()//,每new一次Gui都會新增一個 標題分格線 就是 塊, 點擊title會隱藏此塊 13 new v.View().Gui(THREE); 14 new v.Gui(THREE);//渲染所有THREE對象裏符合類型的屬性 15 new v.Gui(THREE, ["NeverDepth"]);//c默認爲[-1, 1, 0.1] 16 new v.Gui(THREE, ["NeverDepth"], {NeverDepth:[-200, 200, 10]}); 17 new v.Gui(THREE, ["NeverDepth"], [-200, 200, 10]); 18 new new View().Gui(THREE, null, {NeverDepth:[-200, 200, 10]}); 19 */ 20 class View{ 21 22 constructor(){ 23 if(!this.client){this.getClient();} 24 if(!this.Gui){this.getGui();} 25 } 26 27 //建立html元素 28 add(fel, elemName, id, cls){ 29 //建立一個元素 30 let el = document.createElement(elemName); 31 //設置el id 和 class 32 if(id){el.setAttribute('id',id);} 33 if(cls){el.className = cls;} 34 //把el添加到fel並顯示(渲染el) 35 if(fel){fel.appendChild(el);} 36 return el; 37 } 38 39 //刪除html元素 40 remove(){ 41 let k, arg = arguments, err = []; 42 for(k = 0; k < arg.length; k++){ 43 if(this.isEl(arg[k]) === false){err.push(arg[k]); continue;} 44 arg[k].parentNode.removeChild(arg[k]); 45 } 46 if(err.length > 0){return {err:'這裏有一些刪除失敗的元素', arr:err};} 47 return true; 48 } 49 50 //id獲取html元素 51 get(id){ 52 return document.getElementById(id); 53 } 54 55 //獲取可視寬高 56 getClient(){ 57 View.prototype.client = { 58 w:document.documentElement.clientWidth || document.body.clientWidth || window.innerWidth, 59 h:document.documentElement.clientHeight || document.body.clientHeight || window.innerHeight, 60 }; 61 } 62 63 //經過parentNode檢查元素是否存在於頁面中 64 isEl(el){ 65 if(typeof(el) !== 'object'){return false;} 66 //被刪除以後的html元素object的 parentNode等於null 67 if(!el.parentNode){return false;} 68 return true; 69 } 70 71 //元素綁定事件 72 addEvent(target, ev, callback){ 73 target.addEventListener(ev, function(e){e.preventDefault(); if(callback){callback(e);}}, false); 74 } 75 76 removeEvent(target, ev, callback){ 77 target.removeEventListener(ev, (e)=>{if(callback)callback(e);}, false); 78 } 79 80 //建立控制器元素 81 getGui(){ 82 var tar = this, timer = 0, timerMax = 10, _isBind = true; 83 var elem = this.add(document.body, 'div', 'GuiId', 'box-shadown box-scroll-block'); 84 85 var o = function (obj, data, info, title, isBind){ 86 this.obj = obj; 87 if(typeof(this.obj) !== "object"){return;} 88 if(typeof(isBind) === "boolean"){_isBind = isBind;} 89 this.arr = []; 90 var k, bs = [], fs = [], ns = []; 91 var ti = title || "calss", fel = line(ti, timer++); 92 var T = typeof(data), A = Array.isArray(data); 93 94 if(!data){for(k in this.obj){this.arr.push(k);}} 95 else if(A === true){this.arr = data;} 96 else if(T !== "object"){this.arr.push(data);} 97 else{return;} 98 99 var len = this.arr.length; 100 for(k = 0; k < len; k++){ 101 T = typeof(this.obj[this.arr[k]]); 102 if(T === "boolean"){bs.push(this.arr[k]);} 103 else if(T === "function"){fs.push(this.arr[k]);} 104 else if(T === "number"){ns.push(this.arr[k]);} 105 else{continue;} 106 } 107 check(obj, bs, fel); 108 click(obj, fs, fel); 109 range(obj, ns, info || {}, fel); 110 } 111 112 o.prototype.elem = elem; 113 114 //添加 複選框(boolean) fel.appendChild(el); 115 var check = function (obj, arr, fel){ 116 var p = tar.add(fel, 'p'), size = 0; 117 118 var create = (val)=>{ 119 let i = tar.add(p, 'input'); 120 let s = tar.add(p, 'span'); 121 i.type = "checkbox"; 122 i.checked = obj[val]; 123 s.innerHTML = " "+val+", "; 124 tar.addEvent(i, 'change', (e)=>{obj[val] = e.target.checked;}); 125 size += i.offsetWidth; 126 size += s.offsetWidth; 127 return {i:i, s:s}; 128 } 129 130 var k, len = arr.length; 131 for(k = 0; k < len; k++){ 132 let el_f = create(arr[k]); 133 if(size > 280 && k !== 0){ 134 tar.remove(el_f.i, el_f.s); 135 arr.splice(0, k); 136 check(obj, arr, fel); 137 return; 138 } 139 bind(obj, arr[k], (old, now)=>{el_f.i.checked = now; return now;}); 140 } 141 } 142 143 //添加 按鈕(function) 144 var click = function (obj, arr, fel){ 145 var p = tar.add(fel, 'p'), size = 0; 146 147 var create = (val)=>{ 148 let i = tar.add(p, 'input'); 149 let s = tar.add(p, 'span'); 150 i.type = "button"; 151 i.value = val; 152 s.innerHTML = ", "; 153 tar.addEvent(i, 'click', obj[val]); 154 size += i.offsetWidth; 155 size += s.offsetWidth; 156 return {i:i, s:s}; 157 } 158 159 var k, len = arr.length; 160 for(k = 0; k < len; k++){ 161 let el_f = create(arr[k]); 162 if(size > 280 && k !== 0){ 163 tar.remove(el_f.i, el_f.s); 164 arr.splice(0, k); 165 click(obj, arr, fel); 166 return; 167 } 168 } 169 } 170 171 //添加 計量控制器(number) info: object 可選 默認[min -1, max 1, step0.1] 172 var range = function (obj, arr, info, fel){ 173 var di = [-1, 1, 0.1]; if(Array.isArray(info) === true){di = info;} 174 175 var create = (val)=>{ 176 let c = info[val] || di; if(c[2] < 0){c[2] = 1;} 177 if(obj[val] < c[0] || obj[val] > c[1]){return;} 178 let p = tar.add(fel, 'p'), i = tar.add(p, 'input'); 179 i.type = "range"; i.value = obj[val]; i.min = c[0]; i.max = c[1]; i.step = c[2]; 180 let nul = tar.add(p, 'span'); nul.innerHTML = " "; 181 let is = tar.add(p, 'input'); is.type = "tel"; is.value = obj[val]; 182 let key = false, x, xs, s = tar.add(p, 'span'); s.innerHTML = " "+val; 183 184 let getNum = (num)=>{ 185 if(num === obj[val]){return;} 186 if(typeof(num) !== "number" || isNaN(num) === true){ 187 i.value = obj[val]; is.value = obj[val]; 188 return; 189 } 190 if(num > c[0] && num < c[1]){ 191 return num; 192 }else if(num > c[0]){ 193 return c[1]; 194 }else if(num < c[1]){ 195 return c[0]; 196 } 197 } 198 199 let setNum = (num)=>{ 200 if(num !== undefined){ 201 i.value = num; 202 is.value = num; 203 obj[val] = num; 204 } 205 } 206 207 tar.addEvent(is, 'blur', (e)=>{setNum(getNum(Math.round(Number(e.target.value)/c[2])*c[2]));}); 208 tar.addEvent(i, 'mousedown', (e)=>{i.focus(); x = e.offsetX; key = true;}); 209 tar.addEvent(document.body, 'mouseup', (e)=>{key = false;}); 210 tar.addEvent(document.body, 'mousemove', (e)=>{ 211 if(key === true){ 212 if(e.offsetX < x){xs = obj[val] - c[2];} 213 else if(e.offsetX > x){xs = obj[val] + c[2];} 214 setNum(getNum(xs)); 215 216 x = e.offsetX; 217 } 218 }); 219 220 bind(obj, arr[k], (old, now)=>{ 221 let num = getNum(Math.round(Number(now)/c[2])*c[2]); 222 i.value = num; 223 is.value = num; 224 return num; 225 }); 226 } 227 228 var k, len = arr.length; 229 for(k = 0; k < len; k++){create(arr[k]);} 230 } 231 232 //添加 顏色選擇器(16進制數) 233 var color = function (){ 234 235 } 236 237 //添加 標題, 分格功能, 隱藏或顯示 ← ↑ → ↓ ↖ ↙ ↗ ↘ ↕ 238 var line = function (title, timer){ 239 var t_con_b = timer + " " + title + " " + " ↓"; 240 var t_con_t = timer + " " + title + " " + " ↑"; 241 var l = tar.add(elem, 'p', null, "p-min-shadown-a"); 242 l.style.cursor = "pointer"; 243 var t = tar.add(elem, "p"); 244 t.innerHTML = t_con_b; 245 t.style = "color:#bd810e; cursor:pointer;"; 246 var fel = tar.add(elem, "div"), dis = false; 247 248 var ev_run = ()=>{ 249 dis = !dis; 250 if(dis === true){ 251 fel.style.display = "none"; l.className = "p-min-shadown-b"; 252 t.innerHTML = t_con_t; 253 }else{ 254 fel.style.display = "block"; l.className = "p-min-shadown-a"; 255 t.innerHTML = t_con_b; 256 } 257 } 258 259 tar.addEvent(l, 'click', ev_run); 260 tar.addEvent(t, 'click', ev_run); 261 return fel; 262 } 263 264 //綁定 obj屬性 265 var bind = function (obj, pro, fun){ 266 if(_isBind === false){return;} 267 var _val = obj[pro]; 268 Object.defineProperty(obj, pro, { 269 get(){return _val;}, 270 set(val){ 271 if(fun) _val = fun(_val, val); 272 } 273 }); 274 } 275 276 View.prototype.Gui = o; 277 delete(View.prototype.getGui); 278 } 279 280 }
index.jsajax
1 //建立 主頁 3d 視圖 鍵盤 w a s d移動 鼠標 點擊滑動旋轉 2 function showThreeView(v){ 3 var o = { 4 aaa : false, 5 bbb : true, 6 ccc: true, 7 eee : 0, 8 fff : 25, 9 ggg : 52, 10 hhh : ()=>{console.log(1);}, 11 iii : ()=>{}, 12 mmm : ()=>{}, 13 14 j : "123", 15 k : {}, 16 p : [], 17 q : null, 18 u : undefined 19 } 20 var ceshi = new v.Gui(o, null, [0, 100, 0.1]); console.log(ceshi); 21 new v.Gui(Three, null, null, "Three"); 22 new v.Gui(Three.cmtp, null, [0, 100, 1], "鼠標平移功能"); 23 24 25 26 var land = new Three.Land(); //地面 27 //land.group.remove(mesh) 28 29 var mesh_a = land.meshs.get(0);//建立物體 a 30 var mesh_b = land.meshs.get(1);//建立物體 b 31 mesh_a.rotateX(Math.PI * 0.5); 32 land.group.add(mesh_a, mesh_b); 33 34 //組合運算 35 var mesh_BSP = Three.getBSP(mesh_a, mesh_b, "subtract");//獲取組合後的 物體 bsp(已經轉換爲buff緩衝幾何體了) 36 mesh_BSP.position.set(300, 0, 0); 37 land.group.add(mesh_BSP); 38 39 40 }
1 "use strict" 2 3 function loadFile(data, success, run){ 4 var arr = []; 5 if(typeof(data) === 'string') arr.push(data); 6 if(Array.isArray(data) === true) arr = data; 7 var max = 50, len = arr.length, t = 0, load = (url)=>{ 8 if(run) run(t, len); 9 if(t === len || t > max){ 10 if(success) success(t, len); 11 return; 12 } 13 let script = document.createElement('script'); 14 script.type = "text/javascript"; 15 script.src = url; 16 document.body.appendChild(script); 17 script.onload = (e)=>{t++; load(arr[t]);} 18 } 19 load(arr[t]); 20 } 21 22 loadFile([ 23 "./js/lib/WebGL.js", //是否支持webGL 24 "./js/lib/three_114.min.js", //ThreeJS 3d庫 25 "./js/lib/OrbitControls.js", //控制器 26 "./js/lib/Tween.min.js", //動畫庫 27 "./js/lib/ThreeBSP.js", //布爾運算 28 29 "js/func.js", //methods 30 "js/initThree.js" //init ThreeJS r114 31 ], main, (num, allnum)=>{console.log("已下載: " + num + "/ " + allnum);}); 32 33 //建立一個ajax請求, 前往index.php驗證用戶是否已登陸 34 //若是Ajax返回的是false說明用戶尚未登陸成功,並前往 view.php, 35 //不然ajax返回用戶信息對象 36 function main(){ 37 new Ajax({ 38 url:"./php/index.php", 39 method:"get", 40 success:(data)=>{ 41 let d = JSON.parse(data), v = new View(); 42 if(d === false){location.href = "./login/view.php"; return;} 43 showUserInfo(d.val, v);//用戶信息視圖 44 showThreeView(v);//場景3d視圖 45 } 46 }); 47 } 48 49 //退出 50 function exit(){ 51 if(new Func().isRun({id:"testId"}) !== true){console.log("你點得太快了,服務器跟不上"); return;} 52 new Ajax({ 53 url:"./php/exit.php", 54 method:"get", 55 success:(data)=>{main();} 56 }); 57 } 58 59 //建立html p元素 60 function create(v, fel, content){ 61 let p = v.add(fel, "p"); 62 p.innerHTML = content || ""; 63 return p; 64 } 65 66 //建立登陸成功後的主頁內容 67 function showUserInfo(user, v){//console.log(user); 68 69 var lid = v.get("loginBoxId"); 70 71 var elem_name = create(v, lid, "你好: " + user.UserName); 72 elem_name.innerHTML += "<input type = 'button' id = 'exitId' value = '退 出' />"; 73 v.get('exitId').onclick = ()=>{exit();}//退出按鈕 74 75 create(v, lid, "我知道你的郵箱是: " + user.Email); 76 77 switch(user.Like.length){ 78 case 1 : 79 create(v, lid, "我還知道你喜歡: " + user.Like[0]); 80 break; 81 case 2 : 82 create(v, lid, "我還知道你喜歡: " + user.Like[0]); 83 create(v, lid, "還有: " + user.Like[1]); 84 break; 85 case 3 : 86 create(v, lid, "我還知道你喜歡: " + user.Like[0]); 87 create(v, lid, "還有: " + user.Like[1]); 88 create(v, lid, "還有: " + user.Like[2]); 89 break; 90 default : break; 91 } 92 lid.style = "visibility:visible;"; 93 //lid居中顯示 94 /* let x = Math.round((v.client.w/2) - (lid.offsetWidth/2)); 95 let y = Math.round((v.client.h/2) - (lid.offsetHeight/2)) - 16; 96 lid.style = "left:"+x+"px; top:"+y+"px; visibility:visible;"; */ 97 } 98 99 100 101 //建立 主頁 3d 視圖 鍵盤 w a s d移動 鼠標 點擊滑動旋轉 102 function showThreeView(v){ 103 var o = { 104 aaa : false, 105 bbb : true, 106 ccc: true, 107 eee : 0, 108 fff : 25, 109 ggg : 52, 110 hhh : ()=>{console.log(1);}, 111 iii : ()=>{}, 112 mmm : ()=>{}, 113 114 j : "123", 115 k : {}, 116 p : [], 117 q : null, 118 u : undefined 119 }//Gui使用示例: 120 new v.Gui(o); 121 new v.Gui(Three, null, null, "Three"); 122 new v.Gui(Three.cmtp, null, [0, 100, 1], "鼠標平移功能"); 123 124 125 126 var land = new Three.Land(); //地面 127 //land.group.remove(mesh) 128 129 var mesh_a = land.meshs.get(0);//物體a 130 var mesh_b = land.meshs.get(1);//物體b 131 mesh_a.rotateX(Math.PI * 0.5); 132 land.group.add(mesh_a, mesh_b); 133 //物體 bsp 134 var mesh_BSP = Three.getBSP(mesh_a, mesh_b, "subtract");//組合運算 135 mesh_BSP.position.set(300, 0, 0); 136 land.group.add(mesh_BSP); 137 138 139 }