Three.js中網(wǎng)格對象MESH的屬性與方法詳解
前言
本文主要給大家介紹了關(guān)于Three.js網(wǎng)格對象MESH的屬性與方法,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹:
創(chuàng)建一個網(wǎng)格需要一個幾何體,以及一個或多個材質(zhì)。當(dāng)網(wǎng)格創(chuàng)建好之后,我們就可以將它添加到場景中并進(jìn)行渲染。網(wǎng)格對象提供了幾個屬性和方法用于改變它在場景中的位置和顯示效果。
如下:
還有一個屬性就是visible屬性,默認(rèn)為true,如果設(shè)置為false,THREE.Mesh將不渲染到場景中。
mesh對象的前三個屬性position,rotation和scale有三種設(shè)置方法。
第一種,直接設(shè)置相關(guān)坐標(biāo)軸
cube.position.x = 5; cube.position.y = 6; cube.position.z = 7;
第二種,一次性設(shè)置x,y和z坐標(biāo)的值
cube.position.set(5,6,7); //效果同第一種
第三種,因?yàn)樗鼈兌际且粋€THREE.Vector3對象,所以我們可以直接賦值一個新的對象給它
cube.position = new THREE.Vector3(5,6,7); //效果同上
為了形象的顯示這些效果,我書寫了一個案例:
這個效果是使用dat.GUI實(shí)現(xiàn)的效果,具體效果自己將代碼下載下來測試即可:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css"> html, body { margin: 0; height: 100%; } canvas { display: block; } </style> </head> <body onload="draw();"> </body> <script src="build/three.js"></script> <script src="examples/js/controls/OrbitControls.js"></script> <script src="examples/js/libs/stats.min.js"></script> <script src="examples/js/libs/dat.gui.min.js"></script> <script> var renderer; function initRender() { renderer = new THREE.WebGLRenderer({antialias:true}); renderer.setSize(window.innerWidth, window.innerHeight); //告訴渲染器需要陰影效果 renderer.shadowMap.enabled = true; renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 默認(rèn)的是,沒有設(shè)置的這個清晰 THREE.PCFShadowMap document.body.appendChild(renderer.domElement); } var camera; function initCamera() { camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000); camera.position.set(0, 40, 100); camera.lookAt(new THREE.Vector3(0,0,0)); } var scene; function initScene() { scene = new THREE.Scene(); } //初始化dat.GUI簡化試驗(yàn)流程 var settings; function initGui() { //聲明一個保存需求修改的相關(guān)數(shù)據(jù)的對象 settings = { positionX:0, positionY:5, positionZ:0, rotationX:0, rotationY:0, rotationZ:0, scaleX:1, scaleY:1, scaleZ:1, translateX:0, translateY:0, translateZ:0, translate:function () { //cube.translate(settings.translateX,settings.translateY,settings.translateZ); cube.translateX(settings.translateX); cube.translateY(settings.translateY); cube.translateZ(settings.translateZ); settings.positionX = cube.position.x; settings.positionY = cube.position.y; settings.positionZ = cube.position.z; }, visible:true }; //初始化gui var gui = new dat.GUI(); var position = gui.addFolder("position"); position.add(settings,"positionX",-30,30).listen(); position.add(settings,"positionY",-30,30).listen(); position.add(settings,"positionZ",-30,30).listen(); var scale = gui.addFolder("scale"); scale.add(settings,"scaleX",0.01,5); scale.add(settings,"scaleY",0.01,5); scale.add(settings,"scaleZ",0.01,5); var rotation = gui.addFolder("rotation"); rotation.add(settings,"rotationX",-2*Math.PI,2*Math.PI); rotation.add(settings,"rotationY",-2*Math.PI,2*Math.PI); rotation.add(settings,"rotationZ",-2*Math.PI,2*Math.PI); var translate = gui.addFolder("translate"); translate.add(settings,"translateX",-5,5); translate.add(settings,"translateY",-5,5); translate.add(settings,"translateZ",-5,5); translate.add(settings,"translate"); gui.add(settings,"visible"); } var light; function initLight() { scene.add(new THREE.AmbientLight(0x444444)); light = new THREE.PointLight(0xffffff); light.position.set(15,30,10); //告訴平行光需要開啟陰影投射 light.castShadow = true; scene.add(light); } var cube; function initModel() { //輔助工具 var helper = new THREE.AxisHelper(10); scene.add(helper); //立方體 var cubeGeometry = new THREE.CubeGeometry(10,10,10); var cubeMaterial = new THREE.MeshLambertMaterial({color:0x00ffff}); cube = new THREE.Mesh(cubeGeometry, cubeMaterial); //告訴立方體需要投射陰影 cube.castShadow = true; scene.add(cube); //底部平面 var planeGeometry = new THREE.PlaneGeometry(100,100); var planeMaterial = new THREE.MeshStandardMaterial({color:0xaaaaaa}); var plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.rotation.x = - 0.5 * Math.PI; plane.position.y = -0; //告訴底部平面需要接收陰影 plane.receiveShadow = true; scene.add(plane); } //初始化性能插件 var stats; function initStats() { stats = new Stats(); document.body.appendChild(stats.dom); } //用戶交互插件 鼠標(biāo)左鍵按住旋轉(zhuǎn),右鍵按住平移,滾輪縮放 var controls; function initControls() { controls = new THREE.OrbitControls( camera, renderer.domElement ); // 如果使用animate方法時(shí),將此函數(shù)刪除 //controls.addEventListener( 'change', render ); // 使動畫循環(huán)使用時(shí)阻尼或自轉(zhuǎn) 意思是否有慣性 controls.enableDamping = true; //動態(tài)阻尼系數(shù) 就是鼠標(biāo)拖拽旋轉(zhuǎn)靈敏度 //controls.dampingFactor = 0.25; //是否可以縮放 controls.enableZoom = true; //是否自動旋轉(zhuǎn) controls.autoRotate = false; //設(shè)置相機(jī)距離原點(diǎn)的最遠(yuǎn)距離 controls.minDistance = 100; //設(shè)置相機(jī)距離原點(diǎn)的最遠(yuǎn)距離 controls.maxDistance = 200; //是否開啟右鍵拖拽 controls.enablePan = true; } function render() { renderer.render( scene, camera ); } //窗口變動觸發(fā)的函數(shù) function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth, window.innerHeight ); } function animate() { //更新控制器 render(); //更新性能插件 stats.update(); //更新相關(guān)位置 cube.position.set(settings.positionX,settings.positionY,settings.positionZ); cube.scale.set(settings.scaleX,settings.scaleY,settings.scaleZ); cube.rotation.set(settings.rotationX,settings.rotationY,settings.rotationZ); cube.visible = settings.visible; controls.update(); requestAnimationFrame(animate); } function draw() { initGui(); initRender(); initScene(); initCamera(); initLight(); initModel(); initControls(); initStats(); animate(); window.onresize = onWindowResize; } </script> </html>
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用Three.js具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
JSON.stringify轉(zhuǎn)換JSON時(shí)日期時(shí)間不準(zhǔn)確的解決方法
這篇文章主要介紹了JSON.stringify轉(zhuǎn)換JSON時(shí)日期時(shí)間不準(zhǔn)確的解決方法,即JSON數(shù)據(jù)中包含日期對象時(shí),在轉(zhuǎn)換時(shí)會轉(zhuǎn)換成國際時(shí)間,而不是中國的時(shí)區(qū),需要的朋友可以參考下2014-08-08用javascript實(shí)現(xiàn)簡單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了用javascript實(shí)現(xiàn)簡單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08three.js著色器材質(zhì)的內(nèi)置變量示例詳解
這篇文章主要給大家介紹了關(guān)于three.js著色器材質(zhì)內(nèi)置變量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用three.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08純JS實(shí)現(xiàn)五子棋游戲兼容各瀏覽器(附源碼)
純JS實(shí)現(xiàn)五子棋游戲同時(shí)兼容各個主流瀏覽器,感興趣的朋友可以下載源碼學(xué)習(xí)下也是對你js技巧的晉級2013-04-04JavaScript實(shí)現(xiàn)找出數(shù)組中最長的連續(xù)數(shù)字序列
這篇文章主要介紹了JavaScript實(shí)現(xiàn)找出數(shù)組中最長的連續(xù)數(shù)字序列的方法,需要的朋友可以參考下2014-09-09