three.js設(shè)置物體的縮放和旋轉(zhuǎn)代碼示例
一、縮放物體介紹
1. 如何縮放
使用three.js設(shè)置物體的縮放可以通過對象的scale屬性來實現(xiàn)。例如,將一個立方體對象縮小一半的代碼如下:
var cube = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshNormalMaterial()); cube.scale.set(0.5, 0.5, 0.5);
其中,scale屬性是一個THREE.Vector3類型的對象,包含了x、y、z三個方向的縮放比例。設(shè)置scale時,可以直接使用Vector3的set方法設(shè)置縮放比例,也可以分別設(shè)置x、y、z三個方向的縮放比例。
也可以使用變換的方法來縮放物體,例如將一個物體沿著x軸縮小一半,代碼如下:
var cube = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshNormalMaterial()); cube.position.x = 2; cube.rotation.y = Math.PI / 4; var vector = new THREE.Vector3(0.5, 1, 1); cube.scale.multiply(vector);
其中,Vector3的multiply方法將會對scale屬性進行按元素乘法,實現(xiàn)沿x軸縮小一半的效果。
- 示例效果
// 創(chuàng)建幾何體 const geometry = new THREE.BoxGeometry(1, 1, 1) // 創(chuàng)建材質(zhì) const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }) // 根據(jù)幾何體和材質(zhì)創(chuàng)建物體 const cube = new THREE.Mesh(geometry, material) // 縮放 cube.scale.set(1, 2, 3) // x軸縮放1倍,y軸縮放2倍,z軸縮放3倍 // 將物體添加到場景中 scene.add(cube)
未縮放前:
沿著x/y/z縮放比例1:2:3之后
二、旋轉(zhuǎn)物體介紹
1.如何旋轉(zhuǎn)
hree.js中旋轉(zhuǎn)一個物體需要使用物體的旋轉(zhuǎn)屬性(rotation),通過改變這個屬性的值來進行物體的旋轉(zhuǎn)。
下面是一個簡單的例子,假設(shè)你有一個立方體(cube):
var cube = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshNormalMaterial()); // 將立方體添加到場景中 scene.add(cube); // 旋轉(zhuǎn)立方體 cube.rotation.x += 0.01; // 繞X軸旋轉(zhuǎn) cube.rotation.y += 0.01; // 繞Y軸旋轉(zhuǎn)
這個例子中,我們通過修改cube.rotation.x
和cube.rotation.y
的值來旋轉(zhuǎn)立方體。對于旋轉(zhuǎn)角度的控制,可以使用弧度制或者角度制。例如,可以通過下面的方式將角度轉(zhuǎn)換為弧度:
// 將角度轉(zhuǎn)換為弧度 var angleInDegrees = 45; var angleInRadians = angleInDegrees * Math.PI / 180; // 使用弧度旋轉(zhuǎn)立方體 cube.rotation.z = angleInRadians;
2. 示例
我們讓物體一直旋轉(zhuǎn)
// 使用渲染器,通過相機渲染場景 function animate() { requestAnimationFrame( animate ); //幀動畫 controls.update() //更新控制器 cube.rotation.x += 0.01; //旋轉(zhuǎn)物體 cube.rotation.y += 0.01; renderer.render( scene, camera ); //渲染 } animate();
三、完整代碼
// 導入three import * as THREE from 'three' // 導入軌道控制器 import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' // 創(chuàng)建場景 const scene = new THREE.Scene() // 創(chuàng)建相機 // 參數(shù):視野角度,長寬比,近平面,遠平面 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) // 設(shè)置相機位置 // 參數(shù):x軸,y軸,z軸 camera.position.set(0, 0, 5) // 將相機添加到場景中 scene.add(camera) // 創(chuàng)建幾何體 const geometry = new THREE.BoxGeometry(1, 1, 1) // 創(chuàng)建材質(zhì) const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }) // 根據(jù)幾何體和材質(zhì)創(chuàng)建物體 const cube = new THREE.Mesh(geometry, material) // 修改物體的位置 // cube.position.set(1, 1, 1) // 縮放 // cube.scale.set(1, 2, 3) // x軸縮放1倍,y軸縮放2倍,z軸縮放3倍 // 將物體添加到場景中 scene.add(cube) console.log('物體', cube) // 創(chuàng)建渲染器 const renderer = new THREE.WebGLRenderer() // 設(shè)置渲染器大小 renderer.setSize(window.innerWidth, window.innerHeight) // console.log(renderer) // 將渲染器添加到頁面中 document.body.appendChild(renderer.domElement) // 創(chuàng)建軌道控制器 // 參數(shù):相機,渲染器dom元素 const controls = new OrbitControls(camera, renderer.domElement) controls.enableDamping = true; // 開啟阻尼效果 controls.rotateSpeed = 0.5; // 旋轉(zhuǎn)速度 controls.target.set(0, 0, 0); // 查看物體時的中心點 // 添加坐標軸輔助器 // 參數(shù):坐標軸長度 const axesHelper = new THREE.AxesHelper(5) scene.add(axesHelper) // 使用渲染器,通過相機渲染場景 function animate() { // 讓物體沿著y軸往返運動 // cube.position.y += 0.01 // if (cube.position.y > 5) { // cube.position.y = -1 // } requestAnimationFrame( animate ); //幀動畫 controls.update() //更新控制器 cube.rotation.x += 0.01; //旋轉(zhuǎn)物體 cube.rotation.y += 0.01; renderer.render( scene, camera ); //渲染 } animate();
總結(jié)
到此這篇關(guān)于three.js設(shè)置物體的縮放和旋轉(zhuǎn)的文章就介紹到這了,更多相關(guān)three.js物體縮放和旋轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解微信小程序中數(shù)據(jù)雙向綁定如何實現(xiàn)
最近在小程序的開發(fā)過程中,需要用到雙向綁定,遇到報錯才知道微信本身是不支持對象雙向綁定的,鏖戰(zhàn)一番找到解決方案,下面這篇文章主要給大家介紹了關(guān)于微信小程序中數(shù)據(jù)雙向綁定如何實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-05-05移動端a標簽下載文件重命名(download)不生效解決辦法
在移動端使用a標簽下載文件時,文件重命名可能不生效,尤其是在APP內(nèi)嵌頁面中,這通常是因為跨域問題導致的,文中將解決辦法介紹的非常詳細,需要的朋友可以參考下2024-10-10支持多瀏覽器(IE、Firefox、Opera)剪切板復(fù)制函數(shù)_腳本之家修正版
有朋友要剪切板復(fù)制函數(shù),可網(wǎng)上的好多代碼都是不能運行的,各種其它符號,導致了腳本的不可運行,腳本之家站長特整理了下,修正了錯誤。2008-12-12async/await實現(xiàn)Promise.all()的方式
Promise.all() 方法接收一個 promise 的 iterable 類型的輸入,并且只返回一個Promise實例,并且輸入的所有 promise 的 resolve 回調(diào)的結(jié)果是一個數(shù)組,對async/await實現(xiàn)Promise.all()相關(guān)知識感興趣的朋友一起看看吧2022-12-12js異步之a(chǎn)sync和await實現(xiàn)同步寫法
本文主要介紹了js異步之a(chǎn)sync和await實現(xiàn)同步寫法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03