這是我參與更文挑戰的第3天,活動詳情查看: 更文挑戰前端
前邊兩篇文字簡單介紹了一下怎麼搭建Oasis-vue項目,和Oasis基本參數的介紹。本文咱們來說一下用Oasis來實現VR效果。vue
看到三種前端實現VR全景看房的方案!說不定哪天就用得上!裏介紹了3種前端實現VR的方法,受益不淺。我這裏也來介紹一種,使用Oasis Engine天空盒實現VR的方法。npm
那麼本文就來演示下若是作到這個功能,咱們先作一下準備工做,安裝Oasis Engine 官方提供的擴展包 @oasis-engine/controls 控制器canvas
npm i @oasis-engine/controls --save
markdown
安裝完成後,在項目中引用post
import { OrbitControl } from '@oasis-engine/controls'
ui
OrbitControl是Oasis控制視角的一個組件,和其餘的組件使用方法同樣:綁定在實體上url
咱們這裏將OrbitControl綁定在相機實體上spa
const cameraEntity = rootEntity.createChild('camera_entity')
cameraEntity.transform.setPosition(0, 0, 1)
cameraEntity.addComponent(Camera)
cameraEntity.addComponent(OrbitControl)
複製代碼
準備工做到這裏就準備完成了,接下來就是Oasis的天空盒code
在實時渲染中,若是想要繪製很是遠的物體,例如遠處的山,天空等,隨着觀察者的距離的移動,物體大小是幾乎沒有變換的。這類場景就很是適合用天空盒技術實現。
天空盒本質就是一個立方體,每一個面上貼一張圖片,實際渲染的時候,立方體始終罩在相機周圍,這樣不管相機怎麼轉動,始終可以看到背景,基於此咱們也可使用天空盒來很容易實現VR效果
對應關係 | |
---|---|
px | right |
nx | left |
py | up |
ny | down |
pz | front |
nz | back |
const cubeTextureResource = {
type: AssetType.TextureCube,
urls: [
//圖片順序: px nx py ny pz nz
require('../assets/px.png'),
require('../assets/nx.png'),
require('../assets/py.png'),
require('../assets/ny.png'),
require('../assets/pz.png'),
require('../assets/nz.png')
]
}
複製代碼
咱們首先須要按順序加載6張立方體貼圖,並申明類型爲AssetType.TextureCube
在Oasis V0.4 中將背景相關的設置從相機組件中移動到場景屬性中,因此使用以下代碼獲取到 background
const scene = engine.sceneManager.activeScene;
const { background } = scene;
複製代碼
調用引擎 ResourceManager 實例的 load 方法將貼圖加載到天空盒模型上,以下:
engine.resourceManager.load<TextureCubeMap[]>(cubeTextureResource)
.then((cubeMap: any) => {
background.mode = BackgroundMode.Sky
const skyMaterial = (background.sky.material = new SkyBoxMaterial(engine))
skyMaterial.textureCubeMap = cubeMap
background.sky.mesh = PrimitiveMesh.createCuboid(engine, 2, 2, 2)
})
複製代碼
import {
Camera,
PrimitiveMesh,
WebGLEngine,
AssetType,
TextureCubeMap,
SkyBoxMaterial,
BackgroundMode
} from 'oasis-engine'
import { OrbitControl } from '@oasis-engine/controls'
export function createOasis (): void {
// 初始化Engine
const engine = new WebGLEngine('canvas')
engine.canvas.resizeByClientSize()
// 獲取場景根實體
const scene = engine.sceneManager.activeScene
const { background } = scene
const rootEntity = scene.createRootEntity()
// 建立一個相機實體
const cameraEntity = rootEntity.createChild('camera_entity')
cameraEntity.transform.setPosition(0, 0, 1)
cameraEntity.addComponent(Camera)
cameraEntity.addComponent(OrbitControl)
// 啓動引擎
engine.run()
// 天空盒模型
const cubeTextureResource = {
type: AssetType.TextureCube,
urls: [
'https://gw.alipayobjects.com/mdn/rms_7c464e/afts/img/A*5w6_Rr6ML6IAAAAAAAAAAAAAARQnAQ',
'https://gw.alipayobjects.com/mdn/rms_7c464e/afts/img/A*TiT2TbN5cG4AAAAAAAAAAAAAARQnAQ',
'https://gw.alipayobjects.com/mdn/rms_7c464e/afts/img/A*8GF6Q4LZefUAAAAAAAAAAAAAARQnAQ',
'https://gw.alipayobjects.com/mdn/rms_7c464e/afts/img/A*D5pdRqUHC3IAAAAAAAAAAAAAARQnAQ',
'https://gw.alipayobjects.com/mdn/rms_7c464e/afts/img/A*_FooTIp6pNIAAAAAAAAAAAAAARQnAQ',
'https://gw.alipayobjects.com/mdn/rms_7c464e/afts/img/A*CYGZR7ogZfoAAAAAAAAAAAAAARQnAQ'
]
}
engine.resourceManager.load<TextureCubeMap[]>(cubeTextureResource)
.then((cubeMap: any) => {
background.mode = BackgroundMode.Sky
const skyMaterial = (background.sky.material = new SkyBoxMaterial(engine))
skyMaterial.textureCubeMap = cubeMap
background.sky.mesh = PrimitiveMesh.createCuboid(engine, 2, 2, 2)
})
}
複製代碼
good good study, day day up!!
respect by myself