three.js全景漫游實(shí)踐

Hello 小伙伴們,如果覺得本文還不錯,記得給個 star , 小伙伴們的 star 是我持續(xù)更新的動力!GitHub 地址

簡介

全景圖分兩種

由六張正方形圖片組成的SkyBox

一整張的寬高比為2比1的全景圖片。

今天我就實(shí)現(xiàn)一整張全景圖的案例。

思路

我們超贊的設(shè)計師畫的中秋全景圖(利用透視網(wǎng)格輔助PS繪制)


創(chuàng)建一個球體網(wǎng)格,對網(wǎng)格進(jìn)行x軸反轉(zhuǎn),使所有的面點(diǎn)向內(nèi)

let geometry = new THREE.SphereGeometry( 500, 60, 40 );

geometry.scale( -1, 1, 1 );


使用上面的全景貼圖創(chuàng)建基礎(chǔ)材質(zhì)

let material = new THREE.MeshBasicMaterial({? ?

????map: new THREE.TextureLoader().load('panorama.jpg'),? ?

????depthTest:false//此參數(shù)控制是否使用像素深度來計算新像素的值

});

let mesh = new THREE.Mesh( geometry, material );scene.add( mesh );

把相機(jī)設(shè)置為球的中心點(diǎn)

let camera = new THREE.PerspectiveCamera( 100, window.innerWidth / window.innerHeight, 1, 1100 );

camera.target = new THREE.Vector3( 0, 0, 0 );

camera.position.set(0, 0, 0);

陀螺儀相機(jī)控制器,實(shí)現(xiàn)移動端陀螺儀控制相機(jī)

let controls = new THREE.DeviceOrientationControls( camera );

此時還沒有動畫效果,還需要增加一個實(shí)時更新渲染動畫

function animate() {? ?

????render();? ?

????requestAnimationFrame(animate);

}

function render() {? ?

????//更新控制器? ?

????controls.update();? ?

????camera.lookAt( camera.target );? ?

????renderer.render(scene, camera);

}

簡單案例代碼

DEMO

相機(jī)

直接上圖,常規(guī)的全景漫游的進(jìn)場效果:

左邊是效果,右邊是相機(jī)輔助效果。

思路分析

相機(jī)起始在球體接近頂部位置,從上往下看

let camera = new THREE.PerspectiveCamera( 150, window.innerWidth / window.innerHeight, 1, 2000 );

camera.position.set(0, 450, 0);//相機(jī)定位在y軸450

camera.target = new THREE.Vector3( 0, -500, 0 );//設(shè)置目標(biāo)點(diǎn)

camera.lookAt( camera.target );//看向y軸負(fù)方向

相機(jī)有上往下移動到求的中心點(diǎn)(0, 0, 0)。同時,相機(jī)目標(biāo)點(diǎn)從底部(0, -500, 0)轉(zhuǎn)到背面(0, 0, -500)。把fov從150調(diào)整為100,效果更贊了。

new TWEEN.Tween( { y : 450, lat : 0, fov : 150 } )? ?

????.to( { y : 0, lat : 90, fov : 100 }, 2500 )? ?

????.onUpdate(function() {? ? ? ?

????????camera.position.y = this.y;

????????let phi = THREE.Math.degToRad( this.lat );? ? ? ?

????????camera.target.y = -500 * Math.cos( phi );? ? ? ?

????????camera.target.z = -500 * Math.sin( phi );? ? ? ?

????????camera.fov = this.fov;? ? ? ?

????????camera.updateProjectionMatrix();? ?

})

進(jìn)場案例代碼

DEMO

輔助理解DEMO

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容