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

一小時,帶你入門 ThreeJS,實現一個 3D 展車的功能

開發 前端
咱們今天就花上 一個多小時 的時間,借助 ThreeJS的一個官方示例,來看下,對于我們前端開發者而言,如何快速的入門,并完成一個酷炫的 ThreeJS 項目。

Hello,大家好,我是 Sunday。

最近有很多同學特別關注 WebGL 和 ThreeJS 的知識,通過 ThreeJS 我們可以完成很多酷炫的 3D 效果。

所以,咱們今天就花上 一個多小時 的時間,借助 ThreeJS的一個官方示例,來看下,對于我們前端開發者而言,如何快速的入門,并完成一個酷炫的 ThreeJS 項目。

該項目可以直接通過 https://webgl.web.lgdsunday.club/ 進行訪問:

圖片圖片

那么廢話不多說,讓我們開始吧~

1.canvas、OpenGL、WebGL 到底都是干嘛的

我們知道 canvas 本質上是一個 html 標簽,它額外提供了一些 API 用來進行繪制。

canvas 的 API 主要用來繪制 2D 圖形,但是在日常的開發中,除了 2D 圖形之外,還存在一些 3D 的圖形,那么想要繪制 3D 圖形就需要使用到 WebGL。

WebGL 是一個  JavaScript API,可在任何兼容的 Web 瀏覽器中渲染高性能的交互式 3D 和 2D 圖形,而無需使用插件。

注意: 有些瀏覽器是可能不支持 WebGL 的。我們可以通過這個 網站 來檢測你的瀏覽器是否支持  WebGL 。

如果你使用的是  Chrome ,但是依然提示不支持,那么可以在 Chrome 中開啟 硬件加速 以獲得支持。

WebGL 中提供了很多的 API 方法,這些方法和 OpenGL 提供的方法是非常相似的。

OpenGL (Open Graphics Library) 是一套用來渲染 2D 和 3D 矢量圖形的跨語言的、跨平臺的應用程序接口 (API) . 這種接口通常用來與圖形處理單元 (GPU) 交互,來達到 硬件加速渲染 的目的。

WebGL 正是利用了 瀏覽器中的圖形加速硬件(如GPU)來進行圖形渲染(這也是為什么我們必須要開啟 瀏覽器硬件加速 的原因)。它通過JavaScript 與 HTML5的Canvas元素進行交互,并提供了在Web上展示復雜的3D圖形和交互式體驗的能力。

本章的內容,我們總結來說:

Canvas 提供了一個基本的2D渲染環境,OpenGL 是一個跨平臺的圖形編程接口規范,而 WebGL 是基于OpenGL ES的JavaScript API,用于在Web瀏覽器中進行高性能的3D圖形渲染。WebGL可以看作是在Canvas上使用OpenGL ES進行3D渲染的一種實現方式。

2.WebGL 框架 three.js 初體驗-理論篇

在上一小節中,我們初步了解了 canvas、OpenGL 和 WebGL 之間的關系,我們知道 WebGL 本質上是基于 OpenGL API 的一個 3D 圖形渲染的實現方式。

但是,如果我們直接基于 WebGL 原生 API 進行項目開發的話,那么使用起來會比較復雜。所以在日常的企業開發中,我們都會 WebGL 框架來進行開發。

基于 WebGL 的框架其實非常多,這些框架在視頻中,我們不一個一個介紹,大家感興趣的話,可以看一下課程講義:

  • Three.js: Three.js 是一個強大的 JavaScript 3D 渲染庫,它封裝了底層的 WebGL API,提供了簡化的接口和功能,使得在 Web 上創建和展示 3D 場景變得更加容易。
  • Babylon.js : Babylon.js 是另一個功能強大的 WebGL 渲染引擎,它專注于游戲開發和實時圖形應用。它提供了廣泛的功能,包括高性能渲染、物理引擎、動畫系統和粒子系統等。
  • A-Frame: A-Frame 是一個基于 Three.js 的 WebVR 框架,它使開發者能夠輕松創建虛擬現實(VR)和增強現實(AR)的交互體驗。A-Frame 使用 HTML 和實體-組件模式來定義場景和對象。
  • PlayCanvas: PlayCanvas 是一個面向游戲開發的 WebGL 引擎,它提供了可視化的場景編輯器和強大的腳本編輯器,使開發者能夠創建高性能的 HTML5 游戲。

而我們接下來,主要要說的其實就是 Three.js。

threejs 是目前國內使用率最多的 JavaScript 3D 渲染庫,它提供了 非常完善的文檔 來幫助我們完成 3D 渲染的開發。

那么接下來,咱們就創建一個項目,然后在這個項目中為大家演示 threejs 的導入和最基礎的用法。

  • 利用 vue-cli 創建項目:
vue create threejs-car
  • 配置項如下:
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, CSS Pre-processors
? Choose a version of Vue.js that you want to start the project with 3.x
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS (with dart-sass)
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? No
  • 安裝 threejs 到項目:
cnpm install --save three@0.152.2

那么接下來,咱們就在 App.vue 中利用 threejs 繪制出一個基本的正方體。

圖片圖片

整個正方體的繪制,咱們將分成兩個小節來說明:理論篇 和 實戰篇。

這一小節,咱們先說理論。讓大家對 threejs 中的一些基礎概念有一個大概的認知。

首先,先導入  threejs:

// 導入整個 three.js核心庫
import * as THREE from 'three'

接下來,我們先了解一些 threejs 中的基本概念:

  • 場景 Scene:它表示要繪制的內容,是整個 threejs 繪制的基礎
  • 相機 camera:相機分為很多種,咱們這里主要使用 PerspectiveCamera 透視相機。它是一個最常用的相機模式,主要可以模擬人眼看到的效果
  • 渲染器 renderer:它的作用比較簡單,主要用來渲染場景
  • 幾何體 Geometry:要渲染的物體形狀。物體形狀有非常多,咱們這里主要使用立方體 BoxGeometry
  • 材質 material:為物體賦予一些材質,比如是光滑的鏡面,還是粗糙的表面。咱們這里主要使用的是基礎材質 MeshBasicMaterial
  • 網格基類 mesh:將幾何體與材質合并成基類。最后可以加入到場景中
  • 渲染函數 renderer.render :利用渲染器的渲染函數,可以根據場景和攝像頭進行渲染
  • 重繪函數 requestAnimationFrame:它與渲染函數配合,可以重復進行渲染,即:生成動畫

最后匯總成一句話:

threejs 本質上是:利用 renderer.render 渲染函數,渲染指定的 scene 和 camera。scene中可以放置任何的幾何體與材質。當渲染函數與 requestAnimationFrame 配合時,可以產生動畫。

3.WebGL 框架 three.js 初體驗-實戰篇

在上一小節中,我們明確了 threejs 中的一些基本概念,那么接下來咱們就根據所學的概念,來完成一個基礎的正方體渲染。

整個正方體渲染分為三大步進行:

  • 創建場景、相機、渲染器,并把生成的 canvas 添加到 body 中
  • 創建立方體,并把它加入到場景中
  • 渲染場景

以下是具體代碼:

<template>
 <div></div>
</template>

<script setup>
// 導入整個 three.js核心庫
import * as THREE from 'three'

// 第一大步:創建場景、相機、渲染器,并把生成的 canvas 添加到 body 中
// 1. 場景:渲染 threejs 內容的地方
const scene = new THREE.Scene()
// 2. 相機:用來模擬人眼所看到的的場景
/**
 * 參數:
 * 1. 視野垂直角度 fov — 能夠看到的場景范圍
 * 2. 長寬比 aspect ratio - 當前攝像機的長寬比
 * 3. 近截面 near - 比近截面近的,用戶看不到
 * 4. 遠截面 far - 比遠截面遠的,用戶看不到
 */
const camera = new THREE.PerspectiveCamera(
 75,
 window.innerWidth / window.innerHeight,
 0.1,
 1000
)
// 為 camera 設置攝像縱深
camera.position.z = 2
// 3. 渲染器:用來渲染 3D 場景
const renderer = new THREE.WebGLRenderer()

// 4. webgl 的渲染會輸出的 canvas 中,這里用來設置 canvas 的大小
renderer.setSize(window.innerWidth, window.innerHeight)
// 5. 將生成的 canvas 標簽插入到 body 中
document.body.appendChild(renderer.domElement)

// 第二大步:創建立方體,并把它加入到場景中

// 1. BoxGeometry是四邊形的原始幾何類,三個參數分別為:
/**
 * width — X軸上面的寬度,默認值為1。
 * height — Y軸上面的高度,默認值為1。
 * depth — Z軸上面的深度,默認值為1。
 */
const geometry = new THREE.BoxGeometry(1, 1, 1)
// 2. material 一個具備簡單著色的基礎材質。表示為立方體的材質
const material = new THREE.MeshBasicMaterial({ color: 0x3f7b9d })
// 3. Mesh 一個網格類,將材質與四邊形合并
const cube = new THREE.Mesh(geometry, material)
// 4. 將當前生成的立方體加入到場景中
scene.add(cube)

// 第三大步:渲染場景

// 1. 創建一個方法,通過 requestAnimationFrame 重復回調這個方法
function animate() {
 // 2. requestAnimationFrame:是 JS 原生 API,它會根據屏幕刷新率來回調指定方法
 requestAnimationFrame(animate)

 // 3. 不斷修改 cube 的角度,產生旋轉的效果
 cube.rotation.x += 0.01
 cube.rotation.y += 0.01

 // 4. 利用渲染器的 render 方法重復渲染場景
 renderer.render(scene, camera)
}
animate()
</script>

4.threejs 配置解碼器載入 glb 格式 3D 模型

上一小節,咱們構建了一個基本的正方體,借助這個小案例咱們也大致了解了一些 threejs 的基本用法。

那么這一小節,咱們就導入一個 3D 模型,利用 threejs 進行渲染。同時構建出最終的 html 結構。

首先,咱們需要先導入一些資料(可以從源碼中獲取):

然后 復制 上一小節的 App.vue,重命名為 01:基礎幾何體渲染.vue 。然后在原有的 App.vue 中對代碼進行重構:

首先是構建出對應的 html 結構:

<template>
 <div>
  <div id="info">
   <h2>
    請確保你的瀏覽器支持 WebGL,可以點擊
    <a  target="_blank">這里</a>
    進行檢測。如果不支持,可百度處理方案。
   </h2>
   <br /><br />
   <span class="colorPicker">
    <input id="body-color" type="color" value="#ff0000" />
    <br />
    車身
   </span>
   <span class="colorPicker">
    <input id="details-color" type="color" value="#ffffff" />
    <br />
    輪轂
   </span>
   <span class="colorPicker">
    <input id="glass-color" type="color" value="#ffffff" />
    <br />
    玻璃
   </span>
  </div>

  <div id="container"></div>
 </div>
</template>

<style lang="scss">
body {
 color: #bbbbbb;
 background: #333333;
 text-align: center;
 overflow: hidden;
}

a {
 color: #08f;
}

.colorPicker {
 display: inline-block;
 margin: 0 10px;
}
</style>

如果想要導入 glb 格式 的 3D 模型,那么我們需要借助兩個東西:

  • 新的 webpack-loader:因為 webpack 默認只能處理 js 文件,所以想要處理 glb 文件的話,那么需要安裝 file-loader,并進行配置:
cnpm i --save-dev file-loader@6.2.0

在 vue.config.js 中配置對應的 loader:

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
chainWebpack: (config) => {
    config.module
        .rule('glb')
        .test(/\.(glb|gltf|hdr)$/)
        .use('file-loader')
        .loader('file-loader')
        .options({
            name: 'assets/[name].[hash:8].[ext]'
        })
        .end()
}
})
  • 使用新的 threejs API ,包括 DRACOLoader  和 GLTFLoader 。

DRACOLoader:它是一個使用 Draco 庫壓縮的幾何加載器 ,咱們需要借助它的 setDecoderPath 方法來指定 DRACO 解碼器的路徑

GLTFLoader:該 loader 是加載 gltf 文件的 loader。glTF(gl傳輸格式)是一種開放格式的規范 ,可以高效的加載 3D 內容。咱們資源中的 .glb 文件就屬于 3D 內容 的一部分。

那么明確好了這兩塊內容之后,接下來咱們完成對應得代碼:

<script setup>
// 導入Vue的onMounted鉤子函數
import { onMounted } from 'vue'
// 導入Three.js庫
import * as THREE from 'three'
// 導入GLTF模型加載器
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'
// 導入DRACO解碼器加載器
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js'

// 定義相機、場景、渲染器對象
let camera, scene, renderer

function init() {
 // 獲取容器元素
 const container = document.getElementById('container')

 // 創建場景對象
 scene = new THREE.Scene()
 // 設置場景的背景顏色為黑色
 scene.background = new THREE.Color(0x333333)

 // 創建透視相機對象
 camera = new THREE.PerspectiveCamera(
  40,
  window.innerWidth / window.innerHeight,
  0.1,
  100
 )
 // 為 camera 設置攝像縱深
 camera.position.set(1, 1, 10)

 // 創建WebGL渲染器對象,啟用抗鋸齒(更平滑)
 renderer = new THREE.WebGLRenderer({ antialias: true })
 // 設置渲染器的大小
 renderer.setSize(window.innerWidth, window.innerHeight)
 // 設置渲染循環函數(代替 requestAnimationFrame 的替代函數)
 renderer.setAnimationLoop(render)
 // 將渲染器的畫布元素添加到容器中
 container.appendChild(renderer.domElement)

 // 創建DRACO解碼器加載器對象
 const dracoLoader = new DRACOLoader()

 // 設置DRACO解碼器的路徑
 dracoLoader.setDecoderPath('decoder/')

 // 創建GLTF模型加載器對象
 const loader = new GLTFLoader()
 // 設置模型加載器的DRACO解碼器
 loader.setDRACOLoader(dracoLoader)

 // 加載 3D 文件
 loader.load(require('@/assets/ferrari.glb').default, function (gltf) {
  // 獲取加載的模型對象
  const carModel = gltf.scene.children[0]

  // 將車輛模型添加到場景中
  scene.add(carModel)
 })
}

/**
 * 渲染
 */
function render() {
  // 更新控制器
  controls.update()
  
 // 渲染場景
 renderer.render(scene, camera)
}

// 在掛載時調用初始化函數
onMounted(() => {
 init()
})
</script>

此時運行項目,我們可以看到一個黑色的車子輪廓。

圖片圖片

5.添加控制器,讓模型支持 360°

上一小節,咱們已經導入了一個基本的 3D 模型,但是這個模型本身還比較 “抽象”。所以我們這一小節,希望可以調整車輛的角度,讓模型支持 360° 旋轉。

那么想要支持這樣的功能,咱們需要借助另外一個 threejs API 叫做 OrbitControls 軌道控制器

具體代碼如下:

// 導入軌道控制器OrbitControls
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'

// 定義控制器對象
let controls

function init () {
  .....
  // 創建軌道控制器對象
 controls = new OrbitControls(camera, container)
 // 啟用阻尼效果
 controls.enableDamping = true
 // 設置控制器能夠縮放的最大距離
 controls.maxDistance = 9
 // 設置控制器的焦點位置
 controls.target.set(0, 0.5, 0)
 // 更新控制器
 controls.update()
  .....
}

6.添加材質,并基于 RGBELoader 為 3D 模型增加環境貼圖

現在咱們的模型已經可以進行 360° 旋轉了,但是它現在還比較難看,所以接下來,咱們就需要給它添加一些 “顏色”,讓他變得更加漂亮。

那么想要達到這個目的,需要分成兩步去做:

  • 通過 RGBELoader 添加環境貼圖
  • 通過 Material 渲染物理材質

那么首先,咱們先做第一步: 通過 RGBELoader 添加環境貼圖

RGBELoader 允許你從文件中加載HDR圖像,并將其用作Three.js場景中的環境貼圖。這對于創建逼真的照明效果非常有用,因為HDR圖像能夠捕捉到真實世界中的光照細節和環境反射。

// 導入HDR貼圖加載器
  import { RGBELoader } from 'three/addons/loaders/RGBELoader.js'

 // 加載HDR貼圖作為場景的環境貼圖
 scene.environment = new RGBELoader().load(
  require('@/assets/venice_sunset_1k.hdr').default
 )
 // 設置環境貼圖的映射方式為球形映射
 scene.environment.mapping = THREE.EquirectangularReflectionMapping

現在車身應該具備一個基礎顏色。

接下來我們來處理第二步,通過 Material 渲染物理材質, 讓他具備反光效果:

  • 創建對應材質:
// 材料設置
// 創建車身材質對象,設置顏色和物理屬性
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
})
  • 在 loader.load 中,設置對應材質:
// 加載 3D 文件
loader.load(require('@/assets/ferrari.glb').default, function (gltf) {
    // 獲取加載的模型對象
    const carModel = gltf.scene.children[0]

    // 設置車身部分的材質為車身材質
    carModel.getObjectByName('body').material = bodyMaterial

    // rim_xx 參考 glb 文件配置
    // 設置前左輪輞的材質為細節材質
    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

    // 將車輛模型添加到場景中
    scene.add(carModel)
})

這樣,咱們的車輛模型就具備了一個基本的反光效果,會非常漂亮。

7.根據 GridHelper 設置網格動態效果

現在咱們的車輛本身已經非常好看的,那么這一小節,咱們就構建一個地面網格效果,并且讓網格具備一個動態后移的動效。

想要構建網格效果,那么我們需要通過 THREE.GridHelper 類構建:

// 定義網格幫助器對象
let grid

function init () {
  // 創建網格幫助器對象,設置網格的大小和顏色
 grid = new THREE.GridHelper(20, 40, 0xffffff, 0xffffff)
 // 設置網格材質的透明度
 grid.material.opacity = 0.2
 // 禁用網格材質的深度寫入
 grid.material.depthWrite = false
 // 設置網格材質為透明材質
 grid.material.transparent = true
 // 將網格幫助器添加到場景中
 scene.add(grid)

}

那么此時,咱們將具備一個地面網格。

我們可以調整 camera 的角度,讓車輛位置更好看一些:

// 設置相機位置
camera.position.set(4.25, 1.4, -4.5)

最后,我們可以在被 持續回調 的 render 函數中,動態修改 z軸 的值:

/**
 * 渲染
 */
function render() {
 // 獲取當前時間:https://developer.mozilla.org/zh-CN/docs/Web/API/Performance/now
 const time = -performance.now() / 1000
 // 設置網格的位置
 grid.position.z = -time % 1

 // 渲染場景
 ......
}

這樣,咱們可以得到一個持續后撤的地面效果。

8.構建車輪模型組,讓車輪轉起來

現在地面可以持續后撤了,但是車輪還是固定死的,所以這一小節,咱們就要讓車輪可以轉動起來。

在項目中,每一個車輪都是一個單獨的模型,我們可以通過:

carModel.getObjectByName('wheel_fl')

獲取 前左 車輪。

然后可以在 render 函數中 通過 車輪.rotation.x = time * Math.PI * 2 讓它轉動。

所以,我們如果想要讓四個車輪全部轉動,那么就需要構建一個數組,然后循環數組達到轉動的效果:

// 定義一個數組用于存儲車輪模型對象
const wheels = []

在 load 中:

// 將車輛的四個車輪模型對象添加到數組中
wheels.push(
 carModel.getObjectByName('wheel_fl'),
 carModel.getObjectByName('wheel_fr'),
 carModel.getObjectByName('wheel_rl'),
 carModel.getObjectByName('wheel_rr')
)

在 render 函數中:

// 設置車輪的旋轉角度
for (let i = 0; i < wheels.length; i++) {
 wheels[i].rotation.x = time * Math.PI * 2
}

那么此時,就模擬出了一個車輛移動的效果。

9.監聽選擇器的變化,修改車身配置

這一小節,咱們來完成 修改車身顏色 的功能。

所謂的修改車身顏色,其實本質上就是利用 Material.color.set(色值) 方法重新設置色值。

明確了這一點之后,下面的實現就會非常簡單了:

// 獲取車身顏色輸入框元素
 const bodyColorInput = document.getElementById('body-color')
 // 監聽車身顏色輸入框的變化,設置車身材質的顏色
 bodyColorInput.addEventListener('input', function () {
  bodyMaterial.color.set(this.value)
 })

 // 獲取細節顏色輸入框元素
 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)
 })

那么此時,咱們就可以直接修改車身配置了。

10.創建陰影貼圖,讓場景更加真實

現在咱們的功能其實已經大致完成了。

最后還剩下一個小功能,就是車身下的陰影效果:

圖片圖片

有了這個效果之后,會讓整體變得更加立體。

而想要構建出這個效果,那么需要使用 THREE.TextureLoader ,加載陰影圖:

// 車輛設置
// 加載車輛陰影貼圖
const shadow = new THREE.TextureLoader().load(
 require('@/assets/ferrari_ao.png')
)

然后利用 mesh 構建出 **平面幾何 PlaneGeometry**,并把它添加到 carModel 中:

// 陰影配置
// 創建陰影平面模型
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)

那么此時,我們就具備了陰影效果。

責任編輯:武曉燕 來源: 程序員Sunday
相關推薦

2022-03-18 14:11:05

安全事件安全分析威脅

2017-08-08 15:55:31

戴爾

2015-04-02 11:17:20

2018-09-17 12:42:34

2017-04-05 11:32:36

環保戴爾地球一小時

2013-03-21 15:20:14

搜狗

2013-06-04 13:43:53

2020-08-29 18:51:14

效能工具效率生產力

2013-08-09 09:41:04

2022-06-17 11:35:10

物聯網

2021-06-26 07:15:25

網絡攻擊容器漏洞

2013-08-27 11:13:52

亞馬遜宕機

2018-03-08 16:22:39

FlutterAndroid代碼

2010-07-09 11:14:43

2022-11-21 18:01:24

CSSthree.js

2012-07-04 14:14:39

Linux服務器云計算

2015-08-25 14:58:19

數據

2019-07-25 14:58:40

機器人廚師消費者

2016-11-29 12:07:45

大數據思維大數據

2018-03-19 10:30:17

程序員永久斷網
點贊
收藏

51CTO技術棧公眾號

国产精品日韩久久久| 日韩欧美2区| 成人久久视频在线观看| 91tv亚洲精品香蕉国产一区7ujn| 天天躁日日躁aaaxxⅹ| 久久久人成影片一区二区三区在哪下载 | 成人免费的视频| 国产国语videosex另类| 国产97免费视频| 日韩电影在线观看完整免费观看| 欧美在线观看禁18| 白白操在线视频| 九九在线视频| 国产成人精品三级麻豆| 日本精品性网站在线观看| 在线免费看av网站| 秋霞影视一区二区三区| 欧美老人xxxx18| 日本毛片在线免费观看| 米奇777四色精品人人爽| 国产美女一区二区三区| 欧美最近摘花xxxx摘花| 99久久99久久精品国产| 欧美丝袜足交| 日韩欧美国产小视频| 女人扒开屁股爽桶30分钟| 蜜桃视频在线观看www社区| 99久久久精品免费观看国产蜜| 国产日韩在线观看av| 成人精品在线看| 中文字幕一区二区三区乱码图片| 亚洲欧美999| 色悠悠在线视频| 999精品视频在线观看| 色婷婷激情久久| 男人添女人下部高潮视频在观看| 麻豆最新免费在线视频| 国产欧美一区二区精品性色| 国产一区二区高清不卡| 国产av无码专区亚洲a∨毛片| 日韩av二区在线播放| **欧美日韩vr在线| 国产一级黄色av| 天天做天天爱天天综合网| 亚洲欧洲日本专区| 久久久久久久久免费看无码| 成人自拍在线| 精品免费日韩av| 色18美女社区| 日韩欧美三区| 欧美顶级少妇做爰| 一女二男3p波多野结衣| 日本精品另类| 欧美在线观看视频一区二区 | 国产一区二区无遮挡| 亚洲精品久久久久久动漫器材一区 | 99热成人精品热久久66| 激情都市亚洲| 在线国产电影不卡| 91av在线免费播放| 美女网站视频一区| 精品视频1区2区3区| 999精品视频在线| 国产91在线播放精品| 在线一区二区三区四区| 久久午夜夜伦鲁鲁一区二区| 日韩福利一区| 欧美艳星brazzers| 欧美一级视频在线| 国产一区二区三区免费观看在线 | 97在线观看视频| 国产成人免费看| 天堂va蜜桃一区二区三区| 国产精品69av| 国产精品一区二区免费视频| 国产一区二区美女| 国产精品成人观看视频免费| www.四虎在线观看| fc2成人免费人成在线观看播放 | 99久久九九| 欧美xxxx18性欧美| 国产无码精品视频| 欧美亚洲免费| 国产精品一区二区久久| 国产视频第二页| a美女胸又www黄视频久久| 久久精品国产精品青草色艺| 成人三级黄色免费网站| 亚洲视频1区2区| 肉大捧一出免费观看网站在线播放 | 久久视频这里只有精品| 免费网站看av| 久久久久在线| 成人在线国产精品| 全部免费毛片在线播放一个| 国产色产综合产在线视频| 最新精品视频| 色网在线免费观看| 欧美日韩精品一二三区| 9.1在线观看免费| 精品久久久久久久| 久久99热精品这里久久精品| 国产情侣自拍av| 久热成人在线视频| 极品日韩久久| 黄色视屏免费在线观看| 欧美日韩亚洲91| 两女双腿交缠激烈磨豆腐| 亚欧日韩另类中文欧美| 久久亚洲精品一区二区| 国产精彩视频在线| 精品伊人久久久久7777人| 精品国产福利| a毛片在线看免费观看| 色婷婷国产精品| 樱花草www在线| 视频国产一区| 国外成人性视频| 国产成人麻豆精品午夜在线 | 免费在线成人网| 黄色91av| xxx性欧美| 欧美一区二区三区在线电影| 午夜精产品一区二区在线观看的| 激情视频一区| 99超碰麻豆| 日本不卡三区| 欧美午夜精品免费| 白丝女仆被免费网站| 亚洲黄网站黄| 97中文在线观看| 精品麻豆一区二区三区| 欧美曰成人黄网| 国产在线观看h| 国产欧美另类| 国产欧美日韩伦理| 污污网站在线看| 91精品国产一区二区| 精品国产成人亚洲午夜福利| 国产精品毛片在线看| 成人一区二区在线| 色噜噜狠狠狠综合欧洲色8| 欧美精品 日韩| 国产精品久久国产精麻豆96堂| 另类亚洲自拍| 欧洲精品一区色| 欧美性猛交xxx高清大费中文| 亚洲激情在线观看| 中文字幕一区二区三区精品| 国产91精品久久久久久久网曝门| 黄色一级视频播放| 日韩精品视频一区二区三区| 久久影视电视剧免费网站| 一级黄色免费看| 国产精品国产精品国产专区不片| 亚洲 激情 在线| 99久久久久国产精品| 91美女片黄在线观| 羞羞网站在线看| 精品国产免费一区二区三区香蕉| 久久久久噜噜噜亚洲熟女综合| 丰满放荡岳乱妇91ww| 成年人看的毛片| 欧美网色网址| 日产精品久久久一区二区福利| 日本高清中文字幕二区在线| 色婷婷综合视频在线观看| 波多野在线播放| 美腿丝袜在线亚洲一区| 中文字幕中文字幕在线中心一区| 中文字幕综合| 欧美极品第一页| 视频午夜在线| 欧美日韩免费观看一区三区| 激情五月激情综合| 国产成人亚洲综合a∨婷婷| 精品人妻大屁股白浆无码| 欧美巨大xxxx| 国产精品高潮视频| 成人高清免费在线| 亚洲成人性视频| 成人毛片一区二区三区| 亚洲欧美在线视频观看| 久久久久亚洲av无码网站| 国产精品亚洲综合色区韩国| 日韩伦理一区二区三区av在线| 亚洲欧洲日韩精品在线| 欧美激情视频给我| 国产小视频免费在线网址| 欧美乱妇一区二区三区不卡视频| 久久久久亚洲天堂| 久久久国产综合精品女国产盗摄| www.这里只有精品| 亚洲第一区色| 日韩国产在线一区| 99久久人爽人人添人人澡| 欧美一级视频一区二区| 欧美极品另类| 亚洲精品www| 在线观看不卡的av| 午夜久久久久久久久| 欧美性猛交xxxx乱大交少妇| 粉嫩一区二区三区性色av| 国产无套粉嫩白浆内谢的出处| 91成人观看| 欧美精品尤物在线| 婷婷综合国产| 国产精品视频大全| 精品人人视频| 欧美大成色www永久网站婷| 青青青草网站免费视频在线观看| 91精品欧美久久久久久动漫| 日本中文字幕第一页| 亚洲综合丁香婷婷六月香| 非洲一级黄色片| av欧美精品.com| 波多野结衣免费观看| 日韩中文欧美在线| 欧美成人一区二区在线观看| 亚洲欧美色图| 亚洲欧美久久久久一区二区三区| 欧美挤奶吃奶水xxxxx| 99久久精品免费看国产一区二区三区 | 一级做a爱片久久| 三上悠亚在线观看视频| 久久久久久99精品| 91av在线免费| 成人在线视频一区二区| 嫩草视频免费在线观看| 日本欧美一区二区| 国产麻花豆剧传媒精品mv在线| 极品裸体白嫩激情啪啪国产精品| 国产成人精品免费看在线播放| 欧洲激情综合| 色播亚洲婷婷| 精品久久中文| 日韩精品最新在线观看| 亚洲精品进入| 久久精品人成| 老司机在线精品视频| 国产伦精品一区二区三区视频免费 | 成人黄在线观看| 国产精品伦一区二区| 日本视频久久久| 国产精品伦理| 日本韩国欧美精品大片卡二| 2001个疯子在线观看| 欧美激情精品久久久久久蜜臀 | 亚洲精品视频在线观看免费 | 国产精品久久久久久麻豆一区软件| 日本一区不卡| 国产影视精品一区二区三区| 欧美日韩亚洲综合一区二区三区激情在线 | 91免费看蜜桃| 精品欧美午夜寂寞影院| 国产精品久久九九| 欧美aaaaa级| 欧美高清性xxxxhd| 精品日韩一区| 国产又爽又黄ai换脸| 亚洲91视频| 伊人再见免费在线观看高清版 | 西瓜成人精品人成网站| 欧美久久在线| 成人羞羞网站入口免费| 一区二区三区四区欧美日韩| 91久久久精品国产| www.黄色网址.com| 狠狠综合久久av一区二区老牛| 男人添女人下部高潮视频在观看| 亚洲一区自拍| 色免费在线视频| 国产河南妇女毛片精品久久久| 在线播放第一页| www精品美女久久久tv| 日韩乱码人妻无码中文字幕久久| 国产精品沙发午睡系列990531| 四虎地址8848| 亚洲第一成年网| 午夜视频网站在线观看| 欧美老女人在线| 日日躁夜夜躁白天躁晚上躁91| 亚洲视频自拍偷拍| 国产调教视频在线观看| 韩国精品久久久999| 午夜激情成人网| 5566av亚洲| 亚洲精品播放| 91免费网站视频| 亚洲欧美网站| www.se五月| 91色.com| 免费国产羞羞网站美图| 天天色天天爱天天射综合| 中文字幕资源网| 亚洲第一福利网站| 麻豆av免费在线观看| 97高清免费视频| 亚洲人成777| 欧美下载看逼逼| 欧美精品国产一区| 一区二区三区国产免费| 国产91在线观看| av在线播放中文字幕| 亚洲国产精品久久一线不卡| 中文字幕第31页| 亚洲国产精品人人爽夜夜爽| jzzjzzjzz亚洲成熟少妇| 欧美大片免费看| 欧美视频第一| 另类欧美小说| 欧美国产高潮xxxx1819| 91激情视频在线| av爱爱亚洲一区| 成人免费视频网站入口::| 在线免费视频一区二区| 天天舔天天干天天操| 欧美成人小视频| 欧美一区二区三区婷婷| 欧美第一黄网| 9国产精品视频| 午夜诱惑痒痒网| 国产精品色在线| 天天爱天天做天天爽| 亚洲缚视频在线观看| 成人免费网址| 国产精品三级网站| 国产a久久精品一区二区三区| 国产精品www在线观看| 狠狠色综合播放一区二区| 丁香激情五月少妇| 日韩欧美亚洲国产一区| 国精品人妻无码一区二区三区喝尿| 日韩中文在线观看| 78精品国产综合久久香蕉| 欧美日韩精品一区| 在线亚洲伦理| 精品夜夜澡人妻无码av| 亚洲午夜在线视频| 亚洲精品网站在线| 欧美乱大交xxxxx| 亚洲精品tv| 91手机视频在线| 国产美女视频一区| 国产免费无码一区二区视频| 在线成人小视频| 激情视频在线观看| 91嫩草在线视频| 久久精品亚洲欧美日韩精品中文字幕| 国产日韩欧美久久| 国产精品九色蝌蚪自拍| 国产又粗又黄又爽| 欧美成人一区二区三区电影| 久久久久久爱| 日本阿v视频在线观看| 成人一区二区三区视频| 国产主播在线播放| 亚洲精品一区二区精华| 538在线观看| 久久艹中文字幕| 天堂在线亚洲视频| 中文字幕黄色网址| 欧美精品久久久久久久多人混战 | aaa一区二区三区| 久久久久中文字幕2018| 欧美午夜18电影| 国产精品视频黄色| 最新久久zyz资源站| 国产人妖一区二区| 欧美大秀在线观看| 婷婷激情久久| 一区二区三区免费播放| 中文字幕成人在线观看| 国产毛片毛片毛片毛片| 欧美激情一区二区久久久| 好吊妞视频这里有精品| 欧美极品欧美精品欧美图片| 欧美激情一区二区三区全黄| 国产巨乳在线观看| 亚州欧美日韩中文视频| 九九视频免费观看视频精品 | 四虎影视精品永久在线观看| 国产美女永久无遮挡| 久久久不卡网国产精品一区| 国产精品久久久久精| 国语对白做受69| 大片网站久久| www.四虎在线| 欧美性猛交xxxxxx富婆| 欧美videossex| 日韩少妇中文字幕| 国产黑丝在线一区二区三区| 精品国产xxx| 欧美成人激情在线| 奇米色欧美一区二区三区| 久久精品无码一区二区三区毛片| 精品日本高清在线播放| 麻豆影视国产在线观看| 久久精品国产理论片免费| 国产一区二区三区在线观看免费|