当前位置: 首页 > Web前端 > JavaScript

使用three.js实现一个图片覆盖的球体

时间:2023-03-27 14:14:16 JavaScript

绠€浠嬪湪鍋氬睍绀洪」鐩殑鏃跺€欙紝閫氬父闇€瑕佸疄鐜颁竴浜涘渾褰㈢殑閫夊尯鏁堟灉銆傝繖鍙互鍦╟ssrotate鐨勫府鍔╀笅瀹炵幇銆備絾锛佸浣曞疄鐜板甫鍥剧墖鐨?D鏃嬭浆鐞冧綋锛熷紑濮嬪惂銆傞瑙堝湴鍧€馃敆宸ュ叿three.jsOrbitControlsdraw鍒涘缓鍦烘櫙瑕佺敤three.js鏄剧ず鍦烘櫙锛屾垜浠渶瑕佷互涓嬪璞★細scene銆乧amera鍜宺enderer锛岃繖鏍锋垜浠氨鍙互閫氳繃camera鏉ユ覆鏌撳満鏅€俵etcamera,scene,renderer;//scenecene=newTHREE.Scene();//cameracamera=newTHREE.PerspectiveCamera(10,window.innerWidth/window.innerHeight,0.1,200);camera.position.set(30,5,20);//rendererrenderer=newTHREE.WebGLRenderer();renderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(renderer.domElement);鑺辩偣鏃堕棿瑙i噴涓€涓嬭繖閲屽彂鐢熶簡浠€涔堛€傛垜浠幇鍦ㄥ凡缁忚缃簡鍦烘櫙銆佺浉鏈哄拰娓叉煋鍣ㄣ€倀hree.js涓湁鍑犵鈥嬧€嬩笉鍚岀殑鐩告満锛岃繖閲岋紝鎴戜滑浣跨敤鐨勬槸PerspectiveCamera锛堥€忚鐩告満锛夈€傜涓€涓弬鏁版槸瑙嗛噹(FOV)銆傚彲瑙嗚搴︽槸鎮ㄩ殢鏃跺彲浠ュ湪鏄剧ず鍣ㄤ笂鐪嬪埌鐨勬櫙鐗╃殑鑼冨洿锛屾暟鍊艰秺澶э紝璺濈瓒婅繙銆傜浜屼釜鍙傛暟鏄旱妯瘮銆備篃灏辨槸璇达紝鎮ㄥ皢瀵硅薄鐨勫搴﹂櫎浠ュ叾楂樺害銆備緥濡傦紝褰撴偍鍦ㄥ灞忕數瑙嗕笂鎾斁鑰佺數褰辨椂锛屽浘鍍忓彲鑳戒細琚帇鎵併€傛帴涓嬫潵鐨勪袱涓弬鏁版槸杩戞锛坣ear锛夊拰杩滄锛坒ar锛夈€傚綋瀵硅薄鐨勬煇浜涢儴鍒嗘瘮鐩告満鐨勮繙閮ㄥ垎鏇磋繙鎴栨瘮杩戦儴鍒嗘洿杩戞椂锛岃繖浜涢儴鍒嗗皢涓嶄細娓叉煋鍒板満鏅腑銆備篃璁镐綘鐜板湪涓嶇敤鎷呭績杩欎釜鍊肩殑褰卞搷锛屼絾鏄互鍚庝负浜嗗緱鍒版洿濂界殑娓叉煋鎬ц兘锛屼綘鍙互鍦ㄤ綘鐨勫簲鐢ㄧ▼搴忎腑璁剧疆瀹冦€傛帴涓嬫潵鏄覆鏌撳櫒銆傝繖灏辨槸榄旀硶鍙戠敓鐨勫湴鏂广€傞櫎浜嗘垜浠繖閲屼娇鐢ㄧ殑WebGLRenderer娓叉煋鍣紝Three.js杩樻彁渚涗簡鍏朵粬鍑犵娓叉煋鍣紝褰撶敤鎴蜂娇鐢ㄧ殑娴忚鍣ㄥお鏃ф垨鑰呭叾浠栧師鍥犱笉鏀寔WebGL鏃讹紝鍙互灏嗘覆鏌撳櫒闄嶇骇銆傞櫎浜嗗垱寤烘覆鏌撳櫒鐨勫疄渚嬩箣澶栵紝鎴戜滑杩橀渶瑕佸湪鎴戜滑鐨勫簲鐢ㄧ▼搴忎腑璁剧疆娓叉煋鍣ㄧ殑澶у皬銆備緥濡傦紝鎴戜滑鍙互浣跨敤鎵€闇€娓叉煋鍖哄煙鐨勫搴﹀拰楂樺害锛屼娇娓叉煋鍣ㄦ覆鏌撶殑鍦烘櫙鍏呮弧鎴戜滑鐨勫簲鐢ㄧ▼搴忋€傚洜姝わ紝鎴戜滑鍙互灏嗘覆鏌撳櫒鐨勫楂樿缃负娴忚鍣ㄧ獥鍙g殑瀹介珮銆傚浜庢€ц兘鏁忔劅鐨勫簲鐢ㄧ▼搴忥紝鍙互浣跨敤setSize浼犲叆涓€涓緝灏忕殑鍊硷紝姣斿window.innerWidth/2鍜寃indow.innerHeight/2锛岃繖灏嗕娇搴旂敤绋嬪簭浠ヤ竴鍗婄殑闀垮娓叉煋鍦烘櫙銆傚鏋滄偍甯屾湜淇濇寔搴旂敤绋嬪簭鐨勫ぇ灏忥紝浣嗕互杈冧綆鐨勫垎杈ㄧ巼鍛堢幇锛屾偍鍙互璋冪敤setSize骞跺皢updateStyle锛堢涓変釜鍙傛暟锛夎缃负false銆備緥濡傦紝鍋囪鎮ㄧ殑鏍囩鐜板湪鍏锋湁100%鐨勫搴﹀拰楂樺害锛岃皟鐢╯etSize(window.innerWidth/2,window.innerHeight/2,false)灏嗕娇鎮ㄧ殑搴旂敤绋嬪簭浠ュ崐鍒嗚鲸鐜囨覆鏌撹繍琛屻€傛渶鍚庝竴姝ュ緢閲嶈锛屾垜浠皢娓叉煋鍣ㄧ殑dom鍏冪礌(renderer.domElement)娣诲姞鍒版垜浠殑HTML鏂囨。涓€傝繖鏄覆鏌撳櫒鐢ㄦ潵鍚戞垜浠樉绀哄満鏅殑鍏冪礌銆傗€滃棷锛岀湅璧锋潵涓嶉敊锛岄偅涔堜綘璇寸殑閭d釜鐞冧綋鍦ㄥ摢閲岋紵鈥濇帴涓嬫潵锛岃鎴戜滑娣诲姞鐞冧綋銆傚垱閫犵悆浣撹鍦扮悆锛沜onstearthGeometry=newTHREE.SphereGeometry(2,16,16);constearthMaterial=newTHREE.MeshBasicMaterial({specular:0x333333,shininess:5,map:textureLoader.load("./img/earth_atmos_2048.jpg"),specularMap:textureLoader.load("./img/earth_specular_2048.jpg"),normalMap:textureLoader.load("./img/earth_normal_2048.jpg"),normalScale:newTHREE.Vector2(0.85,0.85),});earth=newTHREE.Mesh(earthGeometry,earthMaterial);scene.add(鍦扮悆);//controlsconstcontrols=newTHREE.OrbitControls(camera,renderer.domElement);controls.minDistance=5;controls.maxDistance=100;controls.enablePan=false;瑕佸垱寤轰竴涓悆浣擄紝鎴戜滑闇€瑕佷竴涓猄phereGeometry锛堢悆浣撶紦鍐插嚑浣曪級瀵硅薄銆傝繖涓墿浣撴壂鎻忓嚑浣曞浘褰紝璁$畻缁昚杞达紙姘村钩鎵弿锛夊拰X杞达紙鍨傜洿鎵弿锛夌殑椤剁偣鎺ヤ笅鏉ワ紝瀵逛簬杩欎釜鐞冧綋锛屾垜浠渶瑕佺粰瀹冧竴涓潗璐ㄥ苟娣诲姞涓€寮犲浘鐗囥€俆hree.js鑷甫浜嗗嚑绉嶆潗璐紝杩欓噷鎴戜滑浣跨敤MeshBasicMaterial銆傚鏋滈渶瑕佷竴浜涘厜鐓у拰鐗╃悊鏉愯川锛屽彲浠ヤ娇鐢∕eshPhysicalMaterial銆傜涓夋锛屾垜浠渶瑕佷竴涓狹esh锛堢綉鏍硷級銆傜綉鏍肩敱鍑犱綍浣撳拰搴旂敤浜庡畠鐨勬潗鏂欑粍鎴愩€傛垜浠彲浠ョ洿鎺ュ皢缃戞牸鐗╀綋鏀惧叆鎴戜滑鐨勫満鏅腑锛岃瀹冨湪鍦烘櫙涓嚜鐢辩Щ鍔ㄣ€傜4姝ワ紝娣诲姞鎺у埗鍣紝浠ヤ究鎴戜滑鍙互鎷栧姩閫夋嫨鐞冧綋鏉ユ覆鏌撳満鏅幇鍦紝濡傛灉鎮ㄥ皢涔嬪墠缂栧啓鐨勪唬鐮佸鍒跺埌HTML鏂囦欢涓紝鎮ㄥ皢涓嶄細鍦ㄩ〉闈笂鐪嬪埌浠讳綍鍐呭銆傝繖鏄洜涓烘垜浠繕娌℃湁瀹為檯娓叉煋瀹冦€備负姝わ紝鎴戜滑闇€瑕佷娇鐢ㄤ竴绉嶇О涓衡€滄覆鏌撳惊鐜€濇垨鈥滃姩鐢诲惊鐜€濈殑涓滆タrenderer.render(scene,camera);}鍒朵綔鐞冧綋鍦ㄦ垜浠紑濮嬩箣鍓嶏紝濡傛灉浣犲凡缁忓皢涓婇潰鐨勪唬鐮佸啓鍏ヤ綘鍒涘缓鐨勬枃浠朵腑锛屼綘鍙互鐪嬪埌涓€涓湴鐞冦€傝鎴戜滑鍋氫竴浜涙洿鏈夎叮鐨勪簨鎯呪€斺€旇瀹冩棆杞€傚湪animate()鍑芥暟涓renderer.render鐨勮皟鐢ㄤ笂鏂规坊鍔犱互涓嬩唬鐮侊細earth.rotation.x+=0.001;earth.rotation.y+=0.001;杩欐浠g爜灏嗘瘡甯ф墽琛屼竴娆★紙閫氬父涓?0娆?绉掞級锛屼粠鑰屼负鐞冧綋鎻愪緵婕備寒鐨勬棆杞姩鐢汇€傚熀鏈笂锛屽綋搴旂敤绋嬪簭杩愯鏃讹紝濡傛灉浣犳兂绉诲姩鎴栨敼鍙樺満鏅腑鐨勪换浣曚笢瑗匡紝浣犲繀椤荤粡鍘嗚繖涓姩鐢诲惊鐜€傚綋鐒朵綘鍙互鍦ㄨ繖涓姩鐢诲惊鐜腑璋冪敤鍏朵粬鍑芥暟锛岃繖鏍峰氨涓嶇敤鍐欎竴涓嚑鐧捐浠g爜鐨刟nimate鍑芥暟浜嗐€傛坊鍔犺儗鏅浘鐗?/鍔犺浇鑳屾櫙绾圭悊vartexture=textureLoader.load("./img/eQ9y7xBeY4.jpg");鍦烘櫙.鑳屾櫙=绾圭悊锛涜繖鏍凤紝鎴戜滑灏卞疄鐜颁簡涓€涓熀浜庡浘鍍忚鐩栫殑鏃嬭浆鐞冧綋銆傚枩娆㈠氨鐐硅禐瀹屾暣浠g爜codesandbox馃敆瀹屾暣浠g爜gitee馃敆棰勮鍦板潃馃敆澶囬€夐瑙堝湴鍧€馃敆