精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺談 WebVR 全景

開發(fā) VR/AR
虛擬現(xiàn)實(shí)(英語:virtual reality,縮寫VR),是利用電腦模擬產(chǎn)生一個(gè)三維空間的虛擬世界,提供用戶關(guān)于視覺等感官的模擬,讓用戶感覺仿佛身歷其境,可以即時(shí)、沒有限制地觀察三維空間內(nèi)的事物。用戶進(jìn)行位置移動(dòng)時(shí),電腦可以立即進(jìn)行復(fù)雜的運(yùn)算,將精確的三維世界影像傳回產(chǎn)生臨場感。

前言

近年來VR概念越來越火,相信大家在網(wǎng)上都有過VR的瀏覽體驗(yàn),比如VR全景看房[1]、VR全景看車[2]、VR全景旅游[3]等等,VR全景給了我們視覺上的沉浸式體驗(yàn)。本文將會簡單探究Web VR全景的實(shí)現(xiàn)原理,同時(shí)也會用threejs實(shí)現(xiàn)兩個(gè)小的demo,希望對大家以后在業(yè)務(wù)上遇到類似的場景能有所幫助。

什么是VR

引用維基百科的定義:

虛擬現(xiàn)實(shí)(英語:virtual reality,縮寫VR),是利用電腦模擬產(chǎn)生一個(gè)三維空間的虛擬世界,提供用戶關(guān)于視覺等感官的模擬,讓用戶感覺仿佛身歷其境,可以即時(shí)、沒有限制地觀察三維空間內(nèi)的事物。用戶進(jìn)行位置移動(dòng)時(shí),電腦可以立即進(jìn)行復(fù)雜的運(yùn)算,將精確的三維世界影像傳回產(chǎn)生臨場感。

與基于現(xiàn)實(shí)場景進(jìn)行增強(qiáng)效果的 AR(Augmented Reality)的區(qū)別在于,VR 的場景需要完全重建,類似于進(jìn)入另一個(gè)世界。

虛擬現(xiàn)實(shí)的實(shí)現(xiàn)原理

人眼對世界的感知,是通過將三維世界投射至視網(wǎng)膜上,以二維圖像建立的視覺體系。所以一張具備透視關(guān)系的圖像,在特定的角度,可以使人感受到三維的空間關(guān)系,這就是人眼的深度知覺(depth perception)。VR 技術(shù)則建立在這個(gè)基礎(chǔ)之上。

廣泛意義上來說,只要符合模擬三維空間這一行為,就可以稱為 VR,手機(jī)、電腦、大熒幕、VR 眼鏡甚至于空氣,都可以成為 VR 的載體。

如何在web上模擬三維空間

三維空間是由2D和3D圖形構(gòu)成的,要模擬三維空間,必須繪制2D和3D圖形,我們寫js有ECMAScript規(guī)范,同理的繪制2D和3D圖形也有一套規(guī)范,這套規(guī)范就是OpenGL

?OpenGL是什么?

OpenGL(英語:Open Graphics Library,譯名:開放圖形庫或者“開放式圖形庫”)是用于渲染2D、3D矢量圖形的跨語言、跨平臺的應(yīng)用程序編程接口(API)。

OpenGL規(guī)范描述了繪制2D和3D圖形的抽象API,常用于CAD、虛擬現(xiàn)實(shí)、科學(xué)可視化程序和電子游戲開發(fā)。

?在Web上能用OpenGL嗎?

可以的,在web上可以使用WebGL,它是Web瀏覽器中OpenGL的JavaScript綁定。

?什么是WebGL?

WebGL是一種JavaScript API,用于在不使用外掛程式的情況下在任何相容的網(wǎng)頁瀏覽器中呈現(xiàn)交互式2D和3D圖形。WebGL完全整合到瀏覽器的所有網(wǎng)頁標(biāo)準(zhǔn)中,可將影像處理和效果的GPU加速使用方式當(dāng)做網(wǎng)頁Canvas的一部分。WebGL元素可以加入其他HTML元素之中并與網(wǎng)頁或網(wǎng)頁背景的其他部分混合。

有了WebGL API,我們就可以web網(wǎng)頁上構(gòu)建三維空間啦。我們可以借助canvas標(biāo)簽來獲取WebGL實(shí)例來進(jìn)行WebGL API的調(diào)用,更多API可以戳WebGL: 2D and 3D graphics for the web - Web APIs | MDN[4]查看,下面是使用示例:

// 創(chuàng)建canvas標(biāo)簽
const canvas = document.createElement('canvas');
document.body.appendChild(canvas);

// 獲取webgl實(shí)例
const gl = canvas.getContext("webgl");
// 調(diào)用webgl api繪制圖形
// .....

目前業(yè)界有很多成熟的WebGL3D引擎,比如three.js[5]、babylon.js[6]等等,這些3D引擎已經(jīng)對WebGL API做了非常高效的封裝,可以幫助我們快速繪制2D和3D圖形。

three.js實(shí)現(xiàn)vr全景

在實(shí)戰(zhàn)前先了解下three.js的基本概念

?基本概念?

在three.js中,渲染一個(gè)三維空間的必要因素是場景(scene)、攝像機(jī)(camera)、渲染器(renderer)。渲染出一個(gè)三維空間后,可以往里面增加各種各樣的物體、光源等等。

場景(scene)

一個(gè)容器,容納著除渲染器以外的3d世界里的一切。場景的元素采用右手坐標(biāo)系,x軸正方向向右,y軸正方向向上,z軸由屏幕從里向外。

圖片

// three.js創(chuàng)建場景
const scene = new THREE.Scene();

攝像機(jī)(camera)

就像人的眼睛,在一個(gè)空間里可以看向任意方向,可以通過參數(shù)調(diào)節(jié)可視角度和可視距離。

three.js中常用的camera有兩種,透視投影相機(jī)(PerspectiveCamera)與正交投影相機(jī)(OrthographicCamera)。這里的投影是指將三維空間中的物體坐標(biāo)投影到二維平面上。

圖片

  • 透視 投影是將每個(gè)點(diǎn)都投影到三維空間中,近大遠(yuǎn)小,看起來更符合真實(shí)世界看到的物體。
  • 正交 投影是只考慮所有點(diǎn)的XY坐標(biāo),每一個(gè)二維空間中的點(diǎn)都是與Z軸平行的直線在觀察平面上的投影。所看到的物體大小不會受到距離遠(yuǎn)近的影響。

透視相機(jī)(PerspectiveCamera)

使用perspective projection(透視投影)來進(jìn)行投影。

這一投影模式被用來模擬人眼所看到的景象,它是3D場景的渲染中使用得最普遍的投影模式。

PerspectiveCamera(fov, aspect, near, far) 有四個(gè)參數(shù):

  • fov - field of view,視野角,下圖中綠色英文標(biāo)注的地方,是距離觀測點(diǎn)near長度處,最上端與最下端之間的角度,F(xiàn)ov越大,表示眼睛睜得越大,離得越遠(yuǎn),看得更多。
  • aspect - 畫面橫寬比
  • near - 相機(jī)最近范圍內(nèi)可以看到的物體的距離
  • far - 相機(jī)最遠(yuǎn)范圍內(nèi)可以看到的物體的距離

圖片

正交相機(jī)(OrthographicCamera)

這一攝像機(jī)使用orthographic projection(正交投影)來進(jìn)行投影。

在這種投影模式下,無論物體距離相機(jī)距離遠(yuǎn)或者近,在最終渲染的圖片中物體的大小都保持不變。這對于渲染2D場景或者UI元素是非常有用的。

OrthographicCamera(left, right, top, bottom, near, far)有六個(gè)參數(shù)

left, right, top, bottom - 分別是紅色點(diǎn)距離左右上下邊框的距離,對應(yīng)圖中XY軸的值;

near - 場景開始渲染并可以顯示的起點(diǎn),對應(yīng)圖中Z軸坐標(biāo)的值,通常為負(fù);

far - 場景結(jié)束渲染的終點(diǎn),對應(yīng)圖中Z軸坐標(biāo)的值,通常為正;

圖片

渲染器(renderer)?

將camera在scene里看到的內(nèi)容渲染/繪制到畫布上

設(shè)置好 dpr、畫布寬高,Three.js 就會生成一個(gè) canvas。

const renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
const canvas = renderer.domElement;
document.body.appendChild(canvas);
// 將camera在scene里看到的內(nèi)容渲染/繪制到畫布上
renderer.render( scene, camera );

幾何體(geometry)

三維空間里的所有物體都是點(diǎn)組成面,面組成幾何體。

three.js核心中內(nèi)置了多種幾何體,如下圖的幾何體從左到右分別為:球緩沖幾何體(SphereGeometry)?、 圓柱緩沖幾何體(CylinderGeometry)、立方緩沖幾何體(BoxGeometry)、圓錐緩沖幾何體(ConeGeometry)?、 圓環(huán)(TorusGeometry)和圓環(huán)緩沖扭結(jié)幾何體(TorusKnotGeometry)等等

貼圖(texture)

想象一下你手里有一個(gè)幾何體,你用一張A4紙包裹上幾何體,并在上面畫畫。你畫的內(nèi)容就是貼圖。

下面給立方體貼上小黃鴨貼圖:

// 立方緩沖幾何體(BoxGeometry)
const boxGeometry = new THREE.BoxGeometry(2, 2, 2);
// 小黃鴨貼圖
const texture = new THREE.TextureLoader().load( "textures/duck.png" );
const material = new THREE.MeshBasicMaterial( { map: texture } );
const cube = new THREE.Mesh( boxGeometry, material );
scene.add( cube );

圖片

也可以給立方體貼上視頻

const boxGeometry = new THREE.BoxGeometry(2, 2, 2);
const video = document.getElementById( 'video' );
const texture = new THREE.VideoTexture( video );
const material = new THREE.MeshBasicMaterial( { map: texture } );
const cube = new THREE.Mesh( boxGeometry, material );
scene.add( cube );

圖片

材質(zhì)(material)

延續(xù)貼圖里的想象,你用白卡紙畫畫,還是用油紙畫畫,呈現(xiàn)出來的質(zhì)感是不同的,這就是材質(zhì)!

下面五個(gè)圓環(huán)扭結(jié)的顏色都是一樣的,而材質(zhì)從左至右分別是:

  • MeshBasicMaterial(基礎(chǔ)材質(zhì),簡單的幾何材料,不考慮光照的影響)
  • MeshMatcapMaterial(網(wǎng)帽材質(zhì),在場景沒有光源的情況下,會模擬出物體被光照的效果)
  • MeshPhongMaterial(高光材質(zhì),適用于陶瓷,烤漆類質(zhì)感)
  • MeshToonMaterial(卡通材質(zhì))
  • MeshLambertMaterial (非光澤表面的材質(zhì),沒有鏡面高光,可以很好地模擬一些表面,例如未經(jīng)處理的木材或石材,但不能模擬具有鏡面高光的光澤表面,例如涂漆木材。)

環(huán)境光的情況下:

圖片

有從上往下的平行光:

圖片

燈光(light)

在沒有手動(dòng)創(chuàng)建光的情況下會默認(rèn)有個(gè)環(huán)境光,不然你什么都看不到。

常見的燈光有以下幾種類型:

AmbientLight:環(huán)境光,沒有方向,會均勻的照亮場景中的所有物體,不會產(chǎn)生陰影

DirectionalLight:平行光,常常用平行光來模擬太陽光 的效果; 太陽足夠遠(yuǎn),因此我們可以認(rèn)為太陽的位置是無限遠(yuǎn),所以我們認(rèn)為從太陽發(fā)出的光線也都是平行的。

圖片

PointLight:點(diǎn)光源,從一個(gè)點(diǎn)向各個(gè)方向發(fā)射的光源。可以模擬一個(gè)燈泡發(fā)出的光。

圖片

SpotLight?:聚光燈,光線從一個(gè)點(diǎn)沿一個(gè)方向射出,隨著光線照射的變遠(yuǎn),光線圓錐體的尺寸也逐漸增大。

圖片

?VR全景看房的實(shí)現(xiàn)?

原理

我們可以通過模擬人走在房子里的行為來實(shí)現(xiàn):

  • 用攝像機(jī)模擬人,鏡頭相當(dāng)于人的眼睛
  • 用立方幾何體六個(gè)面貼上貼圖模擬房子,貼圖要求真實(shí)還原房子六個(gè)面的情況
  • 將攝像機(jī)放置在幾何體里面,移動(dòng)攝像機(jī)相當(dāng)于人在房子里走動(dòng)

素材準(zhǔn)備

房子六面貼圖:

圖片

代碼實(shí)現(xiàn)

1.創(chuàng)建場景和攝像機(jī),并且設(shè)置攝像機(jī)位置和添加加軌道控制器

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera( 90, window.innerWidth / window.innerHeight, 0.1, 100 );
// 設(shè)置攝像機(jī)位置
camera.position.set(1, 1, 4);
const controls = new THREE.OrbitControls( camera, renderer.domElement );

2.創(chuàng)建立方幾何體,并且給幾何體貼上準(zhǔn)備好的貼圖

// 獲取加載6個(gè)面的貼圖
const textures = getTexturesFromAtlasFile( 'textures/house.jpeg', 6 );
const materials = [];
for ( let i = 0; i < 6; i ++ ) {
// 將貼圖貼在立方幾何體上
materials.push( new THREE.MeshBasicMaterial( { map: textures[ i ] } ) );
}
// 創(chuàng)建立方幾何體
const skyBox = new THREE.Mesh( new THREE.BoxGeometry( 1, 1, 1 ), materials );
// 把幾何體加到場景里
scene.add( skyBox );

function getTexturesFromAtlasFile( atlasImgUrl, tilesNum ) {
const textures = [];
for ( let i = 0; i < tilesNum; i ++ ) {
textures[ i ] = new THREE.Texture();
}
new THREE.ImageLoader()
.load( atlasImgUrl, ( image ) => {
let canvas, context;
const tileWidth = image.height;
for ( let i = 0; i < textures.length; i ++ ) {
canvas = document.createElement( 'canvas' );
context = canvas.getContext( '2d' );
canvas.height = tileWidth;
canvas.width = tileWidth;
context.drawImage( image, tileWidth * i, 0, tileWidth, tileWidth, 0, 0, tileWidth, tileWidth );
textures[ i ].image = canvas;
textures[ i ].needsUpdate = true;
}
} );
return textures;
}

頁面效果:

圖片

3.將攝像頭的位置移動(dòng)到幾何體內(nèi)部

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

將攝像機(jī)移動(dòng)到幾何體內(nèi)部后發(fā)現(xiàn)視野一片黑暗,這是因?yàn)橘N圖是在幾何體外表面,所以需要將貼圖翻轉(zhuǎn)至內(nèi)表面。

4.將幾何體貼圖翻轉(zhuǎn)至內(nèi)表面,就能看到全景啦

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

5.監(jiān)聽鍵盤事件移動(dòng)攝像機(jī)

window.addEventListener('keydown', onKeydown);
function onKeydown(e) {
switch(e.keyCode) {
//
case 37:

if(camera.position.x > -0.5) {
camera.position.x -= 0.01;
}
break;
//
case 38:
if(camera.position.z > -0.5) {
camera.position.z -= 0.01;
}
break;
//
case 39:
if(camera.position.x < 0.5) {
camera.position.x += 0.01;
}
break;
//
case 40:
if(camera.position.z < 0.5) {
camera.position.z += 0.01;
}
break;
}
}

最終效果

圖片

?VR全景看車的實(shí)現(xiàn)?

原理

VR全景看車的難點(diǎn)是汽車模型的設(shè)計(jì),需要設(shè)計(jì)一個(gè)3d汽車模型,然后渲染到頁面上。汽車換裝則是通過對關(guān)鍵節(jié)點(diǎn)的操作來完成。

另外我們一般說的3d模型就是一個(gè)或多個(gè)幾何體,只是有的3d模型文件里除了包含幾何體還可以包含一些額外的信息,比如貼圖,材質(zhì)等等需要在讀取模型文件時(shí)解析出來

3d模型的文件格式有很多,但threejs里常用的基本是:

  • OBJ格式:老牌通用3d模型文件,不包含貼圖,材質(zhì),動(dòng)畫等信息。
  • GLTF格式(圖形語言傳輸格式):由OpenGL官方維護(hù)團(tuán)隊(duì)推出的現(xiàn)代3d模型通用格式,可以包含幾何體、材質(zhì)、動(dòng)畫及場景、攝影機(jī)等信息,并且文件量還小。有3D模型界的JPEG之稱。GLTF格式有.gltf(JSON/ASCII)和.glb(二進(jìn)制)兩種拓展名。

素材準(zhǔn)備

官網(wǎng)上找了一個(gè)汽車模型,可以用PlayCanvas glTF Viewer[7]查看汽車模型的節(jié)點(diǎn)信息。

圖片

代碼實(shí)現(xiàn)

1.創(chuàng)建場景和攝像機(jī),并且設(shè)置攝像機(jī)位置和添加加軌道控制器

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 0.1, 100 );
const camera.position.set( 4.25, 1.4, - 4.5 );
const controls = new THREE.OrbitControls( camera, container );

2.加載汽車模型

通過GLTFLoader,我們可以加載一個(gè)gltf?格式的3d模型文件。需要注意的是,這些Loader都以插件的形式存在,需要引入相應(yīng)的XXXLoader.js才能使用

const bodyMaterial = new THREE.MeshPhysicalMaterial( {
color: 0xff0000, metalness: 1.0, roughness: 0.5, clearcoat: 1.0, clearcoatRoughness: 0.03, sheen: 0.5
} );

const detailsMaterial = new THREE.MeshStandardMaterial( {
color: 0xffffff, metalness: 1.0, roughness: 0.5
} );

const glassMaterial = new THREE.MeshPhysicalMaterial( {
color: 0xffffff, metalness: 0.25, roughness: 0, transmission: 1.0
} );

const dracoLoader = new THREE.DRACOLoader();
dracoLoader.setDecoderPath( 'draco/' );
// GLTF文件loader
const loader = new THREE.GLTFLoader();
loader.setDRACOLoader( dracoLoader );
// 存儲車輪,后面讓車輪旋轉(zhuǎn)
const wheels = [];
loader.load( 'glb/car.glb', function ( gltf ) {
// 獲取模型節(jié)點(diǎn)
const carModel = gltf.scene.children[ 0 ];
// 重定義模型節(jié)點(diǎn)的材質(zhì)
carModel.getObjectByName( 'body' ).material = bodyMaterial;
carModel.getObjectByName( 'rim_fl' ).material = detailsMaterial;
carModel.getObjectByName( 'rim_fr' ).material = detailsMaterial;
carModel.getObjectByName( 'rim_rr' ).material = detailsMaterial;
carModel.getObjectByName( 'rim_rl' ).material = detailsMaterial;
carModel.getObjectByName( 'trim' ).material = detailsMaterial;
carModel.getObjectByName( 'glass' ).material = glassMaterial;
// 存儲車輪
wheels.push(
carModel.getObjectByName( 'wheel_fl' ),
carModel.getObjectByName( 'wheel_fr' ),
carModel.getObjectByName( 'wheel_rl' ),
carModel.getObjectByName( 'wheel_rr' )
);

// 車底陰影
const mesh = new THREE.Mesh(
new THREE.PlaneGeometry( 0.655 * 4, 1.3 * 4 ),
new THREE.MeshBasicMaterial( {
map: shadow, blending: THREE.MultiplyBlending, toneMapped: false, transparent: true
} )
);
mesh.rotation.x = - Math.PI / 2;
mesh.renderOrder = 2;
carModel.add( mesh );

scene.add( carModel );
});

3.車輪滾動(dòng)

function render() {
controls.update();
const time = - performance.now() / 1000;
// 讓車輪旋轉(zhuǎn),模擬行駛效果
for ( let i = 0; i < wheels.length; i ++ ) {
wheels[ i ].rotation.x = time * Math.PI * 2;
}
grid.position.z = - ( time ) % 1;
renderer.render( scene, camera );
stats.update();
}

4.提供拾色器,改變車身(body)、細(xì)節(jié)(detail)和玻璃(glass)的顏色

<div id="info">
<span class="colorPicker"><input id="body-color" type="color" value="#ff0000"></input><br/>Body</span>
<span class="colorPicker"><input id="details-color" type="color" value="#ffffff"></input><br/>Details</span>
<span class="colorPicker"><input id="glass-color" type="color" value="#ffffff"></input><br/>Glass</span>
</div>
// 車身顏色
const bodyColorInput = document.getElementById( 'body-color' );
bodyColorInput.addEventListener( 'input', function () {
bodyMaterial.color.set( this.value );
} );
// 車細(xì)節(jié)顏色
const detailsColorInput = document.getElementById( 'details-color' );
detailsColorInput.addEventListener( 'input', function () {
detailsMaterial.color.set( this.value );
} );
// 車玻璃顏色
const glassColorInput = document.getElementById( 'glass-color' );
glassColorInput.addEventListener( 'input', function () {
glassMaterial.color.set( this.value );
} );

最終效果

圖片

總結(jié)一下

以上只是本人對web VR全景的一個(gè)粗淺的探究,希望能夠引起你們對web VR的興趣。threejs(或其他3d引擎)能做的東西遠(yuǎn)不止于此,還有非常多炫酷、好玩的3d場景,感興趣的可以私下探索哦!

參考資料

[1]VR全景看房: https://bj.ke.com/

[2]VR全景看車: https://car.autohome.com.cn/vr/list-0-0-0-1.html

[3]VR全景旅游: http://www.quanjingke.com/

[4]WebGL: 2D and 3D graphics for the web - Web APIs | MDN: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API

[5]three.js: https://github.com/mrdoob/three.js/

[6]babylon.js: https://github.com/BabylonJS/Babylon.js

[7]PlayCanvas glTF Viewer: https://playcanvas.com/viewer

[8]three.js docs: https://threejs.org/docs/index.html#manual/zh/introduction/Creating-a-scene

[9]three.js中兩種常用的攝像機(jī)模式: https://segmentfault.com/a/1190000013145246

[10]Three 之 three.js (webgl)涉及的各種材質(zhì)簡單說明(常用材質(zhì)配有效果圖)_仙魁XAN的博客-CSDN博客_threejs材質(zhì)和紋理: https://blog.csdn.net/u014361280/article/details/124416631

[11]Threejs 實(shí)現(xiàn)簡單的全景圖: https://fangsueluo.github.io/2021/01/12/vr-threejs-learning/

[12]三種前端實(shí)現(xiàn)VR全景看房的方案!說不定哪天就用得上! - 掘金: https://juejin.cn/post/6973865268426571784

[13]一步步帶你實(shí)現(xiàn)web全景看房--three.js - 掘金: https://juejin.cn/post/6844903918409875469

[14]硬核看房利器——Web 全景的實(shí)現(xiàn): https://segmentfault.com/a/1190000024476102

[15]2天賺了4個(gè)W,手把手教你用Threejs搭建一個(gè)Web3D汽車展廳! - 掘金: https://juejin.cn/post/6981249521258856456

[16]WebGL坐標(biāo)系介紹_桑榆未晚_的博客-CSDN博客_webgl坐標(biāo)系: https://blog.csdn.net/TW934440653/article/details/102529017?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-102529017-blog-70878160.pc_relevant_multi_platform_whitelistv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-102529017-blog-70878160.pc_relevant_multi_platform_whitelistv4&utm_relevant_index=2

- EN?

責(zé)任編輯:武曉燕 來源: Lab團(tuán)隊(duì)
相關(guān)推薦

2016-04-13 09:52:31

虛擬現(xiàn)實(shí)webvr搭建

2023-09-20 00:21:51

Redis數(shù)據(jù)庫

2017-08-22 21:42:51

WebVRFirefox瀏覽器

2016-09-12 14:23:37

Edge瀏覽器WebVR

2020-12-31 05:33:34

軟件性能優(yōu)化

2009-06-08 15:14:54

CMDB運(yùn)維管理摩卡

2011-06-01 14:18:41

JVM

2019-05-22 10:43:16

Cgroups容器監(jiān)控

2009-12-01 10:29:42

BSM

2021-12-08 11:30:41

Python全景拼接代碼

2009-10-15 10:58:05

敏捷開發(fā)全景圖

2017-02-23 07:00:25

2009-06-26 17:34:29

Spring入門

2023-03-06 08:42:45

KCP移動(dòng)開發(fā)

2009-09-09 15:44:22

Linq DataCo

2012-12-24 13:50:54

2016-03-08 15:18:47

GMGC

2013-04-12 13:21:44

2009-11-05 14:08:16

機(jī)房監(jiān)控

2009-09-21 13:05:18

Hibernate u
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美一级特黄aaaaaa| 日本中文字幕免费在线观看 | 美女国内精品自产拍在线播放| 亚洲午夜激情影院| 91av久久| 国产精品视频线看| 91在线在线观看| 九九精品免费视频| 四虎成人av| 亚洲第一国产精品| av污在线观看| 国产黄大片在线观看| 中文字幕av不卡| 99热在线播放| 中国a一片一级一片| 国产精品激情电影| 中文字幕国产日韩| 熟妇人妻久久中文字幕| 亚洲ww精品| 欧美性xxxxx极品| 天堂av免费看| 国产精品一区二区三区四区色| 国产成a人亚洲精品| 欧洲亚洲在线视频| 久久综合加勒比| 三级电影一区| 亚洲人成绝费网站色www| 免费黄色在线播放| 美女久久久久久| 亚洲va欧美va人人爽| 中文字幕中文字幕99| 韩国中文免费在线视频| a亚洲天堂av| 91久久精品一区二区别| 亚洲视频久久久| 久久精品女人| 欧美亚洲另类在线| 在线免费观看毛片| 欧美人成在线| 欧美成人午夜免费视在线看片| 国产在线免费av| 国产精品最新| 亚洲视频欧洲视频| 国产男女猛烈无遮挡a片漫画| 电影一区二区在线观看| 欧美一级爆毛片| 亚洲欧美日本一区二区| 精品自拍视频| 欧美视频在线观看一区| 女人另类性混交zo| 亚洲美女尤物影院| 欧美日韩国产中文字幕| 欧美色图色综合| 国产精品论坛| 色综合久久中文字幕| 日韩中文字幕三区| 高潮一区二区| 欧美性欧美巨大黑白大战| 久久久久狠狠高潮亚洲精品| 成人美女大片| 欧美无人高清视频在线观看| 99久久国产宗和精品1上映| 裤袜国产欧美精品一区| 欧美这里有精品| 自拍偷拍21p| 国产精品日韩精品在线播放| 欧美一区二区三区四区五区| 26uuu国产| 大桥未久女教师av一区二区| 亚洲国产91精品在线观看| 在线免费看黄色片| 亚洲免费福利一区| 国产一区二区三区三区在线观看| 中文字幕伦理片| 国产精品久久久久久久久妇女| 久久久精品免费| 久久精品99久久久久久| 99国产精品久久久久久久成人热| 97在线免费观看| 国产精品午夜一区二区| 精品一区二区三区在线播放视频| 亚洲专区国产精品| 天天操天天干天天插| 久久久久国产精品免费免费搜索| 亚洲7777| 欧美寡妇性猛交xxx免费| 精品国产31久久久久久| 三级a三级三级三级a十八发禁止| 秋霞午夜一区二区三区视频| 亚洲精品91美女久久久久久久| 国产精品久久久久无码av色戒| 欧美a级成人淫片免费看| 欧美黑人国产人伦爽爽爽| 国产一级做a爱片久久毛片a| 日本免费在线视频不卡一不卡二| 亚洲综合成人婷婷小说| 青青操视频在线| 亚洲免费观看在线观看| 成年网站在线免费观看| 精品午夜视频| 亚洲免费电影一区| 中文字幕在线有码| 日韩中文字幕区一区有砖一区| 成人黄色网免费| 婷婷国产在线| 亚洲黄色录像片| 午夜免费福利在线| 好吊妞国产欧美日韩免费观看网站 | 2019中文字幕免费视频| 97成人在线观看| 91亚洲精品久久久蜜桃| 9l视频自拍9l视频自拍| 网友自拍亚洲| 亚洲成人a级网| 国产第一页浮力| 久久人人97超碰国产公开结果| 91亚洲精品久久久久久久久久久久| 色网站免费观看| 亚洲日本va午夜在线影院| 国产精品97在线| 国产91精品入| 欧美成人精品不卡视频在线观看| 2019日本中文字幕| 亚洲色偷偷综合亚洲av伊人| 久久精品人人做人人爽电影蜜月| 高清国产在线一区| 免费黄色在线| 欧美体内she精视频| 玖草视频在线观看| 伊人久久久大香线蕉综合直播| 91精品中文在线| 69视频在线| 色婷婷激情一区二区三区| 丝袜熟女一区二区三区| 午夜精品免费| 91亚洲人电影| 欧美性天天影视| 欧美日韩三级在线| 少妇无套高潮一二三区| 久久亚洲综合| 欧美综合77777色婷婷| 日韩精品极品| 亚洲精品小视频| 中文字幕激情小说| 99在线精品免费| 黄色国产一级视频| 久久亚洲黄色| 88xx成人精品| 青青草视频在线免费观看| 欧美日韩中文在线观看| 中国一级特黄录像播放| 亚洲精品色图| 国内一区在线| 亚洲插插视频| 亚洲欧美资源在线| 波多野结衣在线观看视频| 国产三级精品三级| 我要看一级黄色大片| 欧美成人激情| 91aaaa| 不卡av免费观看| 日韩精品在线免费| 国产免费一级视频| 欧美韩日一区二区三区四区| 日韩精品你懂的| 99欧美视频| 不卡视频一区| 乡村艳史在线观看| 在线观看国产成人av片| 一级黄在线观看| 亚洲精品视频在线| 国产极品一区二区| 日韩一区精品字幕| 中文字幕一区二区三区四区五区六区| 国产精品va视频| 久久免费视频这里只有精品| 青青青手机在线视频观看| 欧美在线观看你懂的| 我要看黄色一级片| 成av人片一区二区| 亚洲 中文字幕 日韩 无码| 色婷婷热久久| 国产精品v欧美精品v日韩| 中文在线免费视频| 日韩在线观看成人| 欧美视频xxx| 欧美在线观看一区| 精品97人妻无码中文永久在线| 99久久国产综合色|国产精品| 久久午夜夜伦鲁鲁一区二区| 91精品一区国产高清在线gif | 天堂av.com| 亚洲精品乱码| 樱花www成人免费视频| 波多野结衣欧美| 国产剧情日韩欧美| brazzers在线观看| 神马国产精品影院av| 欧美一级特黄aaaaaa大片在线观看| 在线亚洲免费视频| 久久黄色小视频| 中文久久乱码一区二区| 日韩少妇一区二区| 久久99国产精品麻豆| 无罩大乳的熟妇正在播放| 成人影视亚洲图片在线| 国产精品制服诱惑| 91九色成人| 日本精品视频在线| 欧洲成人综合网| 中文字幕欧美国内| 香蕉久久国产av一区二区| 欧美精品 日韩| 你懂的国产在线| 一区二区成人在线视频| 香蕉久久久久久久| 91香蕉视频mp4| 亚洲图片欧美另类| 激情国产一区二区| 国产一级做a爰片久久| 一本久久综合| 久久精品xxx| 91亚洲国产成人久久精品| 欧美日韩一区二 | 日韩 欧美 精品| 中文字幕亚洲一区二区va在线| 国产高潮呻吟久久| 91污在线观看| 亚洲一级av无码毛片精品| 国产最新精品免费| 污污网站免费看| 日日夜夜免费精品| 日本精品免费在线观看| 日韩一级精品| 黄色三级中文字幕| 欧美fxxxxxx另类| 亚洲天堂av免费在线观看| 日韩系列欧美系列| 亚洲激情图片| 日韩av在线中文字幕| 日本一区视频在线观看免费| 亚洲激情播播| 免费精品视频一区| 人人网欧美视频| 久久精品国产第一区二区三区最新章节 | 国产欧美日韩一级| 国产精品又粗又长| 亚洲美女黄色| 久久久久久久午夜| 宅男噜噜噜66一区二区| 亚洲自偷自拍熟女另类| 日韩五码在线| 黑人糟蹋人妻hd中文字幕 | 国内免费久久久久久久久久久| 五月天激情在线| 欧美大片免费观看| 黄网在线免费看| 国产69精品久久久久9| av中文资源在线资源免费观看| 欧美激情亚洲另类| 九色porny丨首页入口在线| 97热精品视频官网| 超碰aⅴ人人做人人爽欧美| 国产精品福利网站| 九九热这里有精品| 91综合免费在线| 超碰成人在线观看| 免费av在线一区二区| 欧美美女一区| av磁力番号网| 亚洲大胆av| 99蜜桃臀久久久欧美精品网站| 老牛影视一区二区三区| 亚洲天堂网一区| 国产成人自拍高清视频在线免费播放| 国产又粗又猛又爽又黄| 91丨九色丨国产丨porny| 69视频在线观看免费| 亚洲欧洲韩国日本视频| 久久久久久久久久久久久久免费看| 亚洲成a人v欧美综合天堂| 超碰超碰超碰超碰| 欧美老人xxxx18| 免费观看黄色av| 曰本色欧美视频在线| 色呦呦在线看| 日韩美女在线观看| 国产精品777777在线播放| 精品中文字幕人| 999国产精品视频| 成人黄色av片| 美腿丝袜亚洲色图| 99热超碰在线| 国产精品每日更新在线播放网址| 久久久久亚洲天堂| 欧美午夜一区二区| 国内爆初菊对白视频| 一区国产精品视频| 国产高清在线a视频大全| 国产精品久久久久久av下载红粉| 最新精品在线| 亚洲人体一区| 99国产精品久久久久久久成人热| 在线不卡一区二区三区| 91视频免费播放| 美国黄色小视频| 欧美色图片你懂的| 午夜在线观看视频18| 久久手机精品视频| 激情亚洲影院在线观看| 国产精品日韩高清| 我不卡神马影院| 欧美激情精品久久久久久小说| 国产成人精品网址| 老司机深夜福利网站| 欧美日韩中文字幕在线| 国产小视频免费观看| 久久精品99久久久久久久久| 日韩av中字| 精品免费二区三区三区高中清不卡| 久久久久久美女精品| 三级在线视频观看| 91在线精品秘密一区二区| 久草视频手机在线观看| 51久久夜色精品国产麻豆| 东凛在线观看| 57pao成人国产永久免费| 97品白浆高清久久久久久| 中文字幕日韩一区二区三区| 奇米色777欧美一区二区| 男人天堂av电影| 欧美日韩亚洲精品内裤| 欧美特级特黄aaaaaa在线看| 久久综合伊人77777蜜臀| 日日夜夜精品| 亚洲精品中文字幕乱码三区不卡| 久久xxxx精品视频| 最近日本中文字幕| 性感美女极品91精品| 丁香花免费高清完整在线播放| 久久精品国产成人| 国产成人免费| 亚洲福利av在线| 免费欧美日韩国产三级电影| 精品国产aaa| 在线观看成人免费视频| 久热av在线| 日本在线观看天堂男亚洲| 免费av一区二区三区四区| www黄色av| 久久精品一区二区| 最近中文字幕在线视频| 中文字幕久久亚洲| 亚洲网站免费| 国产人妻人伦精品| 成人网在线播放| 欧美激情亚洲综合| 亚洲美女av电影| 高清电影一区| 在线免费观看成人网| 国产一区二区三区国产| 免费中文字幕视频| 亚洲精品美女在线| 免费福利视频一区二区三区| 少妇精品久久久久久久久久| 久久99在线观看| 欧美色图一区二区| 亚洲黄色成人网| 欧美aaa视频| 免费看av软件| 不卡视频在线观看| 欧美brazzers| 久久精品中文字幕免费mv| 51亚洲精品| 亚洲精品无码久久久久久| 国产女主播一区| 国产黄a三级三级三级| 97超碰色婷婷| 欧美先锋资源| 女人扒开腿免费视频app| 精品欧美一区二区三区| 亚洲视频tv| 国产精品jizz视频| 日韩精品免费视频人成| 午夜爽爽爽男女免费观看| 亚洲电影第1页| 91精品国产经典在线观看| 国产又粗又长又爽视频| www国产亚洲精品久久麻豆| 亚洲永久精品视频| 久久久久亚洲精品| 不卡中文一二三区| 稀缺小u女呦精品呦| 在线视频一区二区三区| av软件在线观看| 日韩亚洲视频在线| 成人免费视频一区| 一区二区三区黄色片| 91国内精品久久| 亚洲精品二区三区|