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

北京到上海,Three.js 旅行軌跡的可視化

開發 前端
最近從北京搬到了上海,開始了一段新的生活,算是人生中一個比較大的事件,于是特地用 Three.js 做了下可視化。

[[440408]]

本文轉載自微信公眾號「神光的編程秘籍」,作者神說要有光zxg。轉載本文請聯系神光的編程秘籍公眾號。

最近從北京搬到了上海,開始了一段新的生活,算是人生中一個比較大的事件,于是特地用 Three.js 做了下可視化。

在這個地理信息相關的可視化的案例中,我們能學到地圖怎么畫、經緯度如何轉成坐標值,這些是地理可視化的通用技術。

那我們就開始吧。

思路分析

Three.js 畫立方體、畫圓柱、畫不規則圖形我們都畫過,但是如何畫一個地圖呢?

其實地圖也是由線、由多邊形構成的,有了數據我們就能畫出來,缺少的只是數據。

地圖信息的描述是一個通用需求,所以有相應的國際標準,就是 GeoJson,它是通過點、線、多邊形來描述地理信息的。

通過指定點、線、多邊形的類型、然后指定幾個坐標位置,就可以描述出相應的形狀。

geojson 的數據可以通過 geojson.io 這個網站做下預覽。

比如中國地圖的 geojson:

有了這個 json,只要用 Three.js 畫出來就行,通過線和多邊形兩種方式。

但是還有一個問題,geojson 中記錄的是經緯度信息,應該如何轉成二維坐標來畫呢?

這就涉及到了墨卡托轉換,它就是做經緯度轉二維坐標的事情。

這個轉換也不用我們自己實現,可以用 d3 內置的墨卡托坐標轉換函數來做。

這樣,我們就用 Three.js 根據 geojson 來畫出地圖。

我們還要畫一條北京到上海的曲線,這個用貝塞爾曲線畫就行,知道兩個端點的坐標,控制點放在中間的位置。

那怎么知道兩個端點,也就是上海和北京的坐標呢?

這個可以用“百度坐標拾取系統”這個工具,點擊地圖的某個位置,就可以直接拿到那個位置的經緯度。然后我們做一次墨卡托轉換,就拿到坐標了。

地圖畫出來了,旅行的曲線也畫出來了,接下來調整下相機位置,從北京慢慢移動到上海就可以了。

思路理清了,我們來寫下代碼。

代碼實現

我們要引入 d3,然后使用 d3 的墨卡托轉換功能,

  1. const projection = d3.geoMercator() 
  2.     .center([116.412318,39.909843]) 
  3.     .translate([0, 0]); 

中間點的坐標就是北京的經緯度,就是我們通過“百度坐標拾取工具”那里拿到的。

北京和上海的坐標位置也可以把經緯度做墨卡托轉換得到:

  1. let beijingPosition= projection([116.412318,39.909843]); 
  2. let shanghaiPosition = projection([121.495721,31.236797]); 

先不著急畫旅行的曲線,先來畫地圖吧。

先加載 geojson:

  1. const loader = new THREE.FileLoader(); 
  2. loader.load('./data/china.json', (data) => { 
  3.     const jsondata = JSON.parse(data); 
  4.     generateGeometry(jsondata); 
  5. }) 

然后根據 json 的信息畫地圖。

遍歷 geojson 的數據,把每個經緯度通過墨卡托轉換變成坐標,然后分別用線和多邊形畫出來。

畫多邊形的時候遇到北京和上海用黃色,其他城市用藍色。

  1. function generateGeometry(jsondata) { 
  2.   const map = new THREE.Group(); 
  3.      
  4.   jsondata.features.forEach((elem) => { 
  5.     const province = new THREE.Group(); 
  6.  
  7.     // 經緯度信息 
  8.     const coordinates = elem.geometry.coordinates; 
  9.     coordinates.forEach((multiPolygon) => { 
  10.       multiPolygon.forEach((polygon) => { 
  11.         // 畫輪廓線 
  12.         const line = drawBoundary(polygon); 
  13.  
  14.         // 畫多邊形 
  15.         const provinceColor = ['北京市''上海市'].includes(elem.properties.name) ? 'yellow' : 'blue'
  16.         const mesh = drawExtrudeMesh(polygon, provinceColor); 
  17.  
  18.         province.add(line); 
  19.         province.add(mesh); 
  20.       }); 
  21.     }); 
  22.  
  23.     map.add(province); 
  24.   }) 
  25.  
  26.   scene.add(map); 

然后分別實現畫輪廓線和畫多邊形:

輪廓線(Line)就是指定一系列頂點來構成幾何體(Geometry),然后指定材質(Material)顏色為黃色:

  1. function drawBoundary(polygon) { 
  2.     const lineGeometry = new THREE.Geometry(); 
  3.  
  4.     for (let i = 0; i < polygon.length; i++) { 
  5.       const [x, y] = projection(polygon[i]); 
  6.       lineGeometry.vertices.push(new THREE.Vector3(x, -y, 0)); 
  7.     } 
  8.  
  9.     const lineMaterial = new THREE.LineBasicMaterial({  
  10.       color: 'yellow' 
  11.     }); 
  12.  
  13.     return new THREE.Line(lineGeometry, lineMaterial); 

現在的效果是這樣的:

多邊形是 ExtrudeGeometry,也就是可以先畫出形狀(shape),然后通過拉伸變成三維的。

  1. function drawExtrudeMesh(polygon, color) { 
  2.     const shape = new THREE.Shape(); 
  3.  
  4.     for (let i = 0; i < polygon.length; i++) { 
  5.       const [x, y] = projection(polygon[i]); 
  6.  
  7.       if (i === 0) { 
  8.         shape.moveTo(x, -y); 
  9.       } 
  10.  
  11.       shape.lineTo(x, -y); 
  12.     } 
  13.  
  14.     const geometry = new THREE.ExtrudeGeometry(shape, { 
  15.       depth: 0, 
  16.       bevelEnabled: false 
  17.     }); 
  18.  
  19.     const material = new THREE.MeshBasicMaterial({ 
  20.       color, 
  21.       transparent: true
  22.       opacity: 0.2, 
  23.     }) 
  24.  
  25.     return new THREE.Mesh(geometry, material); 

第一個點用 moveTo,后面的點用 lineTo,這樣連成一個多邊形,然后指定厚度為 0,指定側面不需要多出一塊斜面(bevel)。

這樣,我們就給每個省都填充上了顏色,北京和上海是黃色,其余省是藍色。

接下來,在北京和上海之間畫一條貝塞爾曲線:

  1. const line = drawLine(beijingPosition, shanghaiPosition); 
  2. scene.add(line); 

貝塞爾曲線用 QuadraticBezierCurve3 來畫,控制點指定中間位置的點。

  1. function drawLine(pos1, pos2) { 
  2.   const [x0, y0, z0] = [...pos1, 0]; 
  3.   const [x1, y1, z1] = [...pos2, 0]; 
  4.  
  5.   const geomentry = new THREE.Geometry(); 
  6.   geomentry.vertices = new THREE.QuadraticBezierCurve3( 
  7.       new THREE.Vector3(-x0, -y0, z0), 
  8.       new THREE.Vector3(-(x0 + x1) / 2, -(y0 + y1) / 2, -10), 
  9.       new THREE.Vector3(-x1, -y1, z1), 
  10.   ).getPoints(); 
  11.  
  12.   const material = new THREE.LineBasicMaterial({color: 'white'}); 
  13.  
  14.   const line = new THREE.Line(geomentry, material); 
  15.   line.rotation.y = Math.PI; 
  16.  
  17.   return line; 

這樣,地圖和旅行軌跡就都畫完了:

當然,還有渲染器、相機、燈光的初始化代碼:

渲染器:

  1. const renderer = new THREE.WebGLRenderer(); 
  2. renderer.setClearColor(0x000000); 
  3. renderer.setSize(window.innerWidth, window.innerHeight); 
  4. document.body.appendChild(renderer.domElement); 

渲染器設置背景顏色為黑色,畫布大小為窗口大小。

燈光:

  1. let ambientLight = new THREE.AmbientLight(0xffffff); 
  2. scene.add(ambientLight); 

燈光用環境光,也就是每個方向的明暗都一樣。

相機:

  1. const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); 
  2. camera.position.set(0, 0, 10); 
  3. camera.lookAt(scene.position); 

相機用透視相機,特點是近大遠小,需要指定看的角度,寬高比,和遠近的范圍這樣四個參數。

位置設置在 0 0 10 的位置,在這個位置去觀察 0 0 0,就是北京上方的俯視圖(我們做墨卡托轉換的時候指定了北京為中心)。

修改了相機位置之后,看到的地圖大了許多:

接下來就是一幀幀的渲染,在每幀渲染的時候移動下相機位置,這樣就是從北京到上海的一個移動的效果:

  1. function render() { 
  2.     if(camera.position.x < shanghaiPosition[0]) { 
  3.         camera.position.x += 0.1; 
  4.     }   
  5.     if(camera.position.y > -shanghaiPosition[1]) { 
  6.         camera.position.y -= 0.2; 
  7.     } 
  8.     renderer.render(scene, camera); 
  9.     requestAnimationFrame(render); 

大功告成!我們來看下最終的效果吧:

代碼上傳到了 github: https://github.com/QuarkGluonPlasma/threejs-exercize

也在這里貼一份:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3.   <head> 
  4.     <meta charset="UTF-8" /> 
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
  7.     <title>map-travel</title> 
  8.     <style> 
  9.       html body { 
  10.         height: 100%; 
  11.         width: 100%; 
  12.         margin: 0; 
  13.         padding: 0; 
  14.         overflow: hidden; 
  15.       } 
  16.     </style> 
  17.   </head> 
  18.   <body> 
  19.     <script src="./js/three.js"></script> 
  20.     <script src="./js/d3.js"></script> 
  21.     <script> 
  22.       const scene = new THREE.Scene(); 
  23.  
  24.       const renderer = new THREE.WebGLRenderer(); 
  25.       renderer.setClearColor(0x000000); 
  26.       renderer.setSize(window.innerWidth, window.innerHeight); 
  27.       document.body.appendChild(renderer.domElement); 
  28.  
  29.       const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); 
  30.       camera.position.set(0, 0, 10); 
  31.       camera.lookAt(scene.position); 
  32.  
  33.       let ambientLight = new THREE.AmbientLight(0xffffff); 
  34.       scene.add(ambientLight); 
  35.  
  36.       function create() { 
  37.           const loader = new THREE.FileLoader(); 
  38.           loader.load('./data/china.json', (data) => { 
  39.             const jsondata = JSON.parse(data); 
  40.             generateGeometry(jsondata); 
  41.           }) 
  42.       } 
  43.  
  44.       const projection = d3.geoMercator() 
  45.             .center([116.412318,39.909843]) 
  46.             .translate([0, 0]); 
  47.  
  48.       let beijingPosition= projection([116.412318,39.909843]); 
  49.       let shanghaiPosition = projection([121.495721,31.236797]); 
  50.  
  51.       function drawBoundary(polygon) { 
  52.         const lineGeometry = new THREE.Geometry(); 
  53.  
  54.         for (let i = 0; i < polygon.length; i++) { 
  55.           const [x, y] = projection(polygon[i]); 
  56.           lineGeometry.vertices.push(new THREE.Vector3(x, -y, 0)); 
  57.         } 
  58.  
  59.         const lineMaterial = new THREE.LineBasicMaterial({  
  60.           color: 'yellow' 
  61.         }); 
  62.  
  63.         return new THREE.Line(lineGeometry, lineMaterial); 
  64.       } 
  65.  
  66.       function drawExtrudeMesh(polygon, color) { 
  67.         const shape = new THREE.Shape(); 
  68.  
  69.         for (let i = 0; i < polygon.length; i++) { 
  70.           const [x, y] = projection(polygon[i]); 
  71.  
  72.           if (i === 0) { 
  73.             shape.moveTo(x, -y); 
  74.           } 
  75.  
  76.           shape.lineTo(x, -y); 
  77.         } 
  78.  
  79.         const geometry = new THREE.ExtrudeGeometry(shape, { 
  80.           depth: 0, 
  81.           bevelEnabled: false 
  82.         }); 
  83.  
  84.         const material = new THREE.MeshBasicMaterial({ 
  85.           color, 
  86.           transparent: true
  87.           opacity: 0.2, 
  88.         }) 
  89.          
  90.         return new THREE.Mesh(geometry, material); 
  91.       } 
  92.  
  93.       function generateGeometry(jsondata) { 
  94.           const map = new THREE.Group(); 
  95.  
  96.           jsondata.features.forEach((elem) => { 
  97.             const province = new THREE.Group(); 
  98.  
  99.             const coordinates = elem.geometry.coordinates; 
  100.             coordinates.forEach((multiPolygon) => { 
  101.               multiPolygon.forEach((polygon) => { 
  102.                 const line = drawBoundary(polygon); 
  103.  
  104.                 const provinceColor = ['北京市''上海市'].includes(elem.properties.name) ? 'yellow' : 'blue'
  105.                 const mesh = drawExtrudeMesh(polygon, provinceColor); 
  106.                  
  107.                 province.add(line); 
  108.                 province.add(mesh); 
  109.               }); 
  110.             }); 
  111.  
  112.             map.add(province); 
  113.           }) 
  114.  
  115.           scene.add(map); 
  116.           const line = drawLine(beijingPosition, shanghaiPosition); 
  117.           scene.add(line); 
  118.  
  119.       } 
  120.  
  121.       function render() { 
  122.         if(camera.position.x < shanghaiPosition[0]) { 
  123.             camera.position.x += 0.1; 
  124.         }   
  125.         if(camera.position.y > -shanghaiPosition[1]) { 
  126.             camera.position.y -= 0.2; 
  127.         } 
  128.         renderer.render(scene, camera); 
  129.         requestAnimationFrame(render); 
  130.       } 
  131.  
  132.       function drawLine(pos1, pos2) { 
  133.           const [x0, y0, z0] = [...pos1, 0]; 
  134.           const [x1, y1, z1] = [...pos2, 0]; 
  135.  
  136.           const geomentry = new THREE.Geometry(); 
  137.           geomentry.vertices = new THREE.QuadraticBezierCurve3( 
  138.               new THREE.Vector3(-x0, -y0, z0), 
  139.               new THREE.Vector3(-(x0 + x1) / 2, -(y0 + y1) / 2, -10), 
  140.               new THREE.Vector3(-x1, -y1, z1), 
  141.           ).getPoints(); 
  142.  
  143.           const material = new THREE.LineBasicMaterial({color: 'white'}); 
  144.  
  145.           const line = new THREE.Line(geomentry, material); 
  146.           line.rotation.y = Math.PI; 
  147.  
  148.           return line; 
  149.       } 
  150.  
  151.       create(); 
  152.       render(); 
  153.     </script> 
  154.   </body> 
  155. </html> 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

總結

地圖形狀的表示是基于 geojson 的規范,它是由點、線、多邊形等信息構成的。

用 Three.js 或者其他繪制方式來畫地圖只需要加載 geojson 的數據,然后通過線和多邊型把每一部分畫出來。

畫之前還要把經緯度轉成坐標,這需要用到墨卡托轉換。

我們用 Three.js 畫線是通過指定一系列頂點構成 Geometry,而畫多邊形是通過繪制一個形狀,然后用 ExtrudeGeometry(擠壓幾何體) 拉伸成三維。墨卡托轉換直接使用了 d3 的內置函數。旅行的效果是通過一幀幀的移動相機位置來實現的。

熟悉了 geojson 和墨卡托轉換,就算是入門地理相關的可視化了。

你是否也想做一些和地理相關的可視化或者交互呢?不妨來嘗試下吧。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2021-11-27 10:42:01

Three.js3D可視化AudioContex

2025-06-17 08:15:00

VTK.jsThree.js3D

2021-12-07 13:44:43

Three.js3D可視化3D 游戲

2019-11-29 09:30:37

Three.js3D前端

2017-05-08 11:41:37

WebGLThree.js

2021-11-22 06:14:45

Three.js3D 渲染花瓣雨

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2024-07-18 06:58:36

2021-04-23 16:40:49

Three.js前端代碼

2025-05-15 08:45:00

開源前端手勢

2022-07-15 13:09:33

Three.js前端

2021-12-03 07:27:30

全景瀏覽Three.js

2022-01-16 19:23:25

Three.js粒子動畫群星送福

2025-03-13 10:54:18

2017-10-14 13:54:26

數據可視化數據信息可視化

2009-04-21 14:26:41

可視化監控IT管理摩卡

2022-08-26 09:15:58

Python可視化plotly

2021-04-21 12:04:47

JS引擎流程

2022-03-07 09:20:00

JavaScripThree.jsNFT

2022-07-08 10:39:09

Three.js元宇宙VR
點贊
收藏

51CTO技術棧公眾號

99热这里只有精品首页 | 欧美巨乳在线| 精品国产a一区二区三区v免费| 在线观看日韩电影| 久久久婷婷一区二区三区不卡| 成人免费毛片视频| 偷拍自拍一区| 欧美日韩另类视频| 一区二区三区不卡在线| 色香蕉在线视频| 久久成人综合网| 日韩中文字幕久久| 亚洲av成人无码一二三在线观看| a级片免费在线观看| 国产女主播在线一区二区| 99re视频| 日本天堂网在线观看| 国产精品一区二区美女视频免费看| 亚洲成av人片一区二区三区| 国产专区一区二区三区| 国产精品老熟女视频一区二区| 国产一区白浆| 一本大道亚洲视频| 久久福利小视频| 精品国产一级| 舔着乳尖日韩一区| 青青草综合视频| a√在线中文网新版址在线| 成人av影院在线| 91精品国产91久久久久| 欧美日韩午夜视频| 57pao国产一区二区| 亚洲国产一二三| 中国成人在线视频| 成人在线免费看| 精品一区二区三区欧美| 国产成人+综合亚洲+天堂| 国产91av视频| 成人亚洲一区| 欧美电影免费提供在线观看| 最新天堂中文在线| 最新日韩一区| 亚洲曰韩产成在线| 欧美日韩国产不卡在线看| 丁香六月天婷婷| 国产成人精品免费在线| 亚洲在线免费观看| 国产成人三级一区二区在线观看一| 美女视频免费一区| 欧美另类交人妖| 欧美视频www| 香蕉久久精品| 日韩风俗一区 二区| 亚洲av成人无码一二三在线观看| 嗯用力啊快一点好舒服小柔久久| 亚洲精品一区二区三区蜜桃下载| 成人免费毛片播放| 精品肉辣文txt下载| 午夜精品福利久久久| 天天综合色天天综合色hd| 精品国产va久久久久久久| 精品一区二区三区在线播放| 亚洲自拍中文字幕| 亚洲精品一区二区口爆| 99riav一区二区三区| 成人信息集中地欧美| 91成人一区二区三区| 国产一区在线不卡| 国产精品国产三级国产aⅴ9色| 四虎影院在线免费播放| 欧美日韩免费观看一区=区三区| 久久国产精品网站| 国产精品theporn动漫| 在线一区视频| 九九热视频这里只有精品| 久久激情免费视频| 亚洲精品成人影院| 欧美激情视频一区二区三区不卡| 三级黄色片在线观看| 亚洲最好看的视频| 国产一区二区三区视频免费| 永久免费未视频| 狠狠入ady亚洲精品经典电影| 久久久噜噜噜久久久| 潘金莲一级淫片aaaaaa播放| 久久草av在线| 国产精品色婷婷视频| 国产青青草视频| 91香蕉视频在线| 亚洲第一在线综合在线| 国产在线日本| 亚洲视频你懂的| 777久久久精品一区二区三区 | 国产精品天堂| 日韩美女视频一区| 综合一区中文字幕| 国模私拍一区二区国模曼安| 欧美午夜电影一区| 欧美性猛交xxx乱久交| 精品国模一区二区三区欧美| 欧美精品vⅰdeose4hd| 浓精h攵女乱爱av| 成人爽a毛片免费啪啪红桃视频| 精品小视频在线| 加勒比婷婷色综合久久| 牛夜精品久久久久久久99黑人| 国产69久久精品成人| 91theporn国产在线观看| 精品一区二区三区在线观看国产| 国内精品视频在线播放| 99中文字幕一区| 欧美日韩在线免费| 美女一区二区三区视频| 精品视频自拍| 日韩大陆毛片av| 黄色a一级视频| 亚洲免费二区| 国产精品免费一区| 国产老妇伦国产熟女老妇视频| aaa亚洲精品一二三区| 久久精品美女| 黄上黄在线观看| 亚洲一卡二卡三卡四卡 | 久久精品美女视频| 亚洲电影成人| 日韩av快播网址| 日本激情视频网站| 国产校园另类小说区| 欧美视频在线观看视频| 成人亚洲精品| 最近2019年日本中文免费字幕 | 久久精品天堂| 国产亚洲情侣一区二区无| 成人看av片| 亚洲v中文字幕| 日本熟妇人妻中出| 日韩中文字幕一区二区高清99| 中文日韩在线观看| 久久久精品毛片| 玖玖玖国产精品| 成人a在线视频| 麻豆视频在线观看免费| 欧美日韩一区二区在线观看视频| 亚洲精品无码一区二区| 午夜欧美理论片| 成人免费视频观看视频| 中文字幕中文字幕在线中高清免费版 | 香蕉精品视频在线| 51一区二区三区| 精品国产精品网麻豆系列 | 日韩欧美福利视频| 五月激情五月婷婷| 欧美残忍xxxx极端| 91国内产香蕉| 四虎影视精品成人| 专区另类欧美日韩| 亚洲品质自拍视频网站| 清纯唯美一区二区三区| av电影在线播放高清免费观看| 91久久精品午夜一区二区| 一卡二卡三卡四卡五卡| 欧美成人一区二免费视频软件| 91欧美视频网站| 国产黄色片在线观看| 欧美综合一区二区三区| 色综合久久天天综线观看| 精品无码人妻一区二区三区| 丝袜美腿高跟呻吟高潮一区| 动漫精品视频| av手机在线观看| 亚洲人成电影在线播放| 国产一级二级三级| av资源网一区| 麻豆视频传媒入口| 第一区第二区在线| 欧美孕妇毛茸茸xxxx| 高h放荡受浪受bl| 国产精品久久久久婷婷二区次| aa在线免费观看| 2023国产精华国产精品| 欧美在线播放视频| 天堂在线视频网站| 亚洲一卡二卡三卡四卡五卡| 国产精品久久不卡| 91久久黄色| 国产精品久久久久久久久久直播 | 国产精品久久久久免费a∨大胸| 国产高清免费在线播放| 欧美一区二区三区视频| 国产成人精品网| 中文字幕一区二区三区四区| 亚洲婷婷在线观看| 日日摸夜夜添夜夜添国产精品| 久久99精品久久久久久三级 | 亚洲专区区免费| 久草中文综合在线| 久久视频这里有精品| 操欧美女人视频| 国产精品久久久久久久久久ktv| www.欧美日本韩国| 精品国产一区二区亚洲人成毛片| 一级做a爰片久久毛片| 伊人婷婷欧美激情| zjzjzjzjzj亚洲女人| 日本成人在线视频网站| 日韩精品在线中文字幕| 清纯唯美亚洲综合一区| 国产精品久久一区| hd国产人妖ts另类视频| 久久精品91久久香蕉加勒比| 国产免费一区二区三区最新不卡 | 国产免费人做人爱午夜视频| 亚洲都市激情| 99在线首页视频| 日本在线影院| 九九热r在线视频精品| 手机看片一区二区| 在线电影院国产精品| 私库av在线播放| 久久网这里都是精品| 天天天干夜夜夜操| 欧美国产一级| 欧洲一区二区日韩在线视频观看免费 | 美腿丝袜亚洲三区| 黄色片视频在线免费观看| 狠狠入ady亚洲精品| 日本三级中文字幕在线观看| 岛国精品一区| av蓝导航精品导航| 国产精久久一区二区| 国产精品免费一区豆花| 婷婷六月国产精品久久不卡| 色婷婷综合久久久久| 噜噜噜在线观看播放视频| 欧美日韩国产高清一区| 久久精品久久国产| 亚洲麻豆国产自偷在线| 99re久久精品国产| 成人99免费视频| 国产高潮失禁喷水爽到抽搐| 国产精品2024| 999热精品视频| 国产精品18久久久久久久久久久久 | 亚洲春色在线| 成人同人动漫免费观看| 亚洲春色综合另类校园电影| 亚洲国产视频二区| 国产脚交av在线一区二区| a级网站在线播放| 久久色在线播放| 免费国产在线观看| 亚洲色图狂野欧美| jizz亚洲| 久久久999精品免费| av在线免费观看网址| 亚洲日韩欧美视频一区| 久久久久久久影视| 色悠悠久久久久| 国产区在线观看| 亚洲欧洲日产国产网站| 国产永久免费高清在线观看| 在线色欧美三级视频| 免费看黄网站在线观看| 欧美精品乱码久久久久久| 国产午夜性春猛交ⅹxxx| 狠狠色狠狠色综合日日小说| 久草免费新视频| 精品日韩中文字幕| 精品99在线观看| 国产精品久久久一区麻豆最新章节| 给我免费观看片在线电影的| www久久精品| 日本黄色动态图| 成人爱爱电影网址| 在线播放国产视频| 精品一区二区三区蜜桃| 波多野结衣免费观看| 精品综合免费视频观看| 日本黄色大片在线观看| 99re在线视频这里只有精品| 久久久高清视频| 色老头一区二区三区在线观看| 国产在线成人精品午夜| 亚洲婷婷在线视频| 免费无遮挡无码永久在线观看视频| 国产精品女主播av| 看片网站在线观看| 欧美色另类天堂2015| 依依成人在线视频| 91久久精品网| 国产一区二区视频网站| 粉嫩老牛aⅴ一区二区三区| 中文字幕人妻一区二区三区视频| 日本韩国一区二区| 91精品国产高清一区二区三密臀| 婷婷开心激情综合| 99热国产在线观看| 五月天久久比比资源色| 丰满人妻一区二区三区四区| 欧洲精品一区二区| 999视频在线| 欧美日韩精品一区视频| 日本毛片在线观看| 精品亚洲一区二区三区| 国产区视频在线播放| 一本色道久久综合亚洲精品小说| 黄色在线小视频| 中文字幕亚洲无线码a| 四虎久久免费| 97视频在线播放| 久久丁香四色| 国产私拍一区| 一本一道久久综合狠狠老| 久久久天堂国产精品| 在线日韩av| 国产中文字幕免费观看| 国产成人av一区二区三区在线| 国产精品成人99一区无码| 最好看的中文字幕久久| 欧美国产一级片| 国产丝袜一区二区三区免费视频| 天堂av资源在线观看| 91av在线视频观看| 成人免费网站www网站高清| 国产成人女人毛片视频在线| 五月婷婷六月综合| 亚洲第一狼人区| 成人涩涩免费视频| 五月天av网站| 欧美精品18+| 日本蜜桃在线观看| 国产精品嫩草视频| 国产一区二区三区站长工具| 欧美三级一级片| 久久久另类综合| 日本视频网站在线观看| 538prom精品视频线放| 国产高清视频在线播放| 欧美噜噜久久久xxx| 先锋影音一区二区| 夜夜爽99久久国产综合精品女不卡 | 91精品国产91久久久久久| swag国产精品一区二区| 欧美 日韩 国产精品| 久久久久久久欧美精品| 老鸭窝一区二区| 在线欧美小视频| 成年人视频在线看| 国产精品视频网站| 另类尿喷潮videofree| 精品无码国模私拍视频| 91丝袜国产在线播放| 暗呦丨小u女国产精品| 欧美性xxxxx| 国产黄a三级三级三级| 一区二区三区国产视频| 精品肉辣文txt下载| 久久精品国产一区二区三区日韩| 亚洲综合日本| 激情av中文字幕| 亚洲天堂免费看| 亚洲精品国产片| 97久久久久久| 国产亚洲一区| 欧美成人三级在线播放| 久久久99精品免费观看不卡| 国产一级性生活| 欧美一区二区三区影视| 欧美aaaaaaa| 蜜桃欧美视频| 亚洲毛片av| 人人人妻人人澡人人爽欧美一区| 亚洲高清在线精品| 国产女人高潮的av毛片| 欧美日韩国产成人高清视频| 少妇高潮一区二区三区99| 肉大捧一出免费观看网站在线播放| 成人一区二区在线观看| 三级视频在线观看| 精品一区二区三区四区在线| www.久久.com| 天堂社区 天堂综合网 天堂资源最新版| 精品中文av资源站在线观看| 日本在线观看视频网站| 中文字幕v亚洲ⅴv天堂| 99re8这里有精品热视频8在线| 亚洲欧美一二三| 99国产精品久久久久久久久久| 中文字幕一级片| 中文字幕日韩欧美| 精品国模一区二区三区| 欧美亚洲一级二级| 国产在线一区二区| 欧美videossex极品| 免费97视频在线精品国自产拍| 欧美成人基地| 一级日本黄色片| 一区二区三区四区在线播放| 邻居大乳一区二区三区| 国产精品久久久久国产a级|