精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

麻豆网站视频在线观看| 国产成人a v| 国产伦精品一区二区三区免费优势| 亚洲一区视频在线| 久久精品aaaaaa毛片| 国产精品51麻豆cm传媒| 欧美xxx在线观看| 亚洲免费视频在线观看| 亚洲美女性囗交| 大菠萝精品导航| 中文字幕乱码亚洲精品一区| 97se国产在线视频| 国内自拍视频在线播放| 国产精品久久久乱弄 | 久久精品国产精品亚洲色婷婷| 九九在线视频| 成人免费毛片片v| 国产欧美亚洲精品| 探花视频在线观看| 国内自拍一区| 久久亚洲国产精品| 精品人伦一区二区| 精品伊人久久久| 欧美精品色一区二区三区| 久激情内射婷内射蜜桃| 黄色在线免费网站| 中文字幕 久热精品 视频在线| 精品国产一区二区三区麻豆免费观看完整版 | 国产v综合v亚洲欧美久久| 青娱乐免费在线视频| 成人在线免费观看网站| 日韩精品高清在线| 中文字幕天堂av| 精品视频一区二区三区在线观看| 欧美性大战xxxxx久久久| 亚洲 高清 成人 动漫| 天堂成人av| **欧美大码日韩| 亚洲国产精品视频一区| 国产在线高清| 久久久久久久久岛国免费| 精品日韩美女| 少妇无码一区二区三区| 国产成人亚洲综合a∨婷婷 | 久久男人资源视频| 欧美日韩国产精品综合| 中文字幕日韩一区二区不卡| 日韩中文字幕视频在线| 少妇愉情理伦三级| 欧美丝袜一区| 在线播放国产一区二区三区| 香蕉视频黄色在线观看| 日韩高清影视在线观看| 亚洲激情在线观看视频免费| 妖精视频一区二区| 精品福利网址导航| 日韩高清免费观看| 国产网站无遮挡| 午夜先锋成人动漫在线| 日韩精品在线观看网站| wwwwww日本| 精品日韩免费| 日韩中文视频免费在线观看| 亚洲女同二女同志奶水| 天天做天天爱天天综合网| 久久av红桃一区二区小说| 天天综合天天做| 影音国产精品| 欧美亚洲伦理www| 日韩综合在线观看| 麻豆精品一区二区综合av| 国产精品影片在线观看| 精品国产乱码一区二区三| 国产精品 日产精品 欧美精品| av日韩中文字幕| 日本wwwxxxx| 久久久99精品免费观看| 婷婷精品国产一区二区三区日韩| 91亚洲精选| 亚洲人成网站在线| 国产freexxxx性播放麻豆| 亚洲少妇视频| 精品视频资源站| 国产5g成人5g天天爽| 国产精品网在线观看| 亚洲网站在线看| 少妇人妻丰满做爰xxx| 亚洲性视频h| 亲子乱一区二区三区电影 | 日韩欧美视频一区| 中文在线一区二区三区| 精品国产aⅴ麻豆| 成人激情电影在线看| 依依成人综合视频| 国产女女做受ⅹxx高潮| 不卡精品视频| 日韩精品极品毛片系列视频| 亚洲少妇xxx| 99视频在线精品国自产拍免费观看| 日韩av片电影专区| 99久久精品免费看国产交换| 97se亚洲国产综合自在线观| 一个色的综合| 美女露胸视频在线观看| 欧美日产在线观看| 99久久人妻无码中文字幕系列| 久久精品国产大片免费观看| 538国产精品一区二区免费视频| 亚洲在线免费观看视频| 久久综合九色综合欧美亚洲| 400部精品国偷自产在线观看 | 女女色综合影院| 亚洲va欧美va人人爽午夜| 久久婷五月综合| 午夜精品福利影院| 欧美激情xxxx性bbbb| 国产裸体美女永久免费无遮挡| 99久久精品99国产精品| 黄黄视频在线观看| 成人自拍视频网| 亚洲精品第一页| 欧美成人精品欧美一| 麻豆精品一区二区三区| 日本在线观看不卡| 日本不卡免费高清视频在线| 精品国产污污免费网站入口| 欧美丰满熟妇bbbbbb| 日韩av电影一区| 欧美久久久久久一卡四| 国模精品视频| 亚洲大胆人体av| 欧美国产日韩在线观看成人| 免费国产亚洲视频| 日本公妇乱淫免费视频一区三区| 白浆在线视频| 欧美精品一区男女天堂| 久草国产在线视频| 国产精品综合一区二区三区| 中文字幕一区二区三区四区五区六区 | 一个色综合久久| 久久精品高清| 国产日韩欧美在线观看| 国产视频精品久久| 日本韩国一区二区三区视频| 国产成人无码一区二区在线观看| 亚洲精品在线二区| 狠狠色噜噜狠狠色综合久| 国产丝袜在线观看视频| 精品久久久久久久人人人人传媒| 波多野结衣不卡视频| 国产一区二区三区日韩| 欧美aaa在线观看| 国产精品久久免费视频| 久久99久久99精品免观看粉嫩| 国产99久一区二区三区a片 | 在线天堂中文字幕| 2022国产精品视频| 黑人糟蹋人妻hd中文字幕| 中文字幕中文字幕精品| 国产精品v片在线观看不卡| 高清美女视频一区| 欧美日韩在线播放| 日韩三级在线观看视频| 国产福利91精品一区二区三区| 草草草视频在线观看| 国产亚洲精品美女久久| 日本久久91av| 3p在线观看| 91精品国产欧美一区二区18| 免费三片在线播放| 成人深夜福利app| 精品中文字幕av| 欧美自拍偷拍| 亚洲自拍偷拍色图| 午夜欧美激情| 深夜精品寂寞黄网站在线观看| 国产毛片一区二区三区va在线| 亚洲国产色一区| 小早川怜子久久精品中文字幕| 久久66热偷产精品| 成人免费性视频| 国产欧美日韩免费观看| 成人黄色av网| 国产在线看片免费视频在线观看| 一个人看的www久久| 99在线精品视频免费观看软件| 精品久久久一区二区| 国产一区二区三区四区在线| 国产精品1024久久| 成人免费毛片播放| 欧美1区2区视频| 日本精品免费| aaa国产精品| 国产精品久久国产精品99gif| 26uuu亚洲电影在线观看| 亚洲国产日韩欧美在线图片| 97人妻一区二区精品免费视频| 亚洲国产精品天堂| 激情五月激情综合| 99久久精品免费观看| 日本中文字幕二区| 国产午夜久久| 日本老太婆做爰视频| 国内精品久久久久久久影视简单| 3d蒂法精品啪啪一区二区免费| 人成在线免费网站| 久久99精品视频一区97| 亚洲图片88| 精品亚洲一区二区三区在线播放| 成人高潮片免费视频| 欧美日韩精品欧美日韩精品一| 日韩不卡视频在线| 亚洲一区二区视频在线| 强制高潮抽搐sm调教高h| 久久久久久久久久久久久久久99 | 国产一区二区区别| 痴汉一区二区三区| 欧美男女视频| 国产不卡在线观看| 天堂√8在线中文| 久久久久久久av| 麻豆av免费在线观看| 亚洲天堂av在线播放| 天天av天天翘| 精品国精品国产| 精品久久久久久亚洲综合网站| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 日韩在线精品| 日韩精品成人一区二区在线观看| 欧美美女啪啪| 国产精品对白刺激久久久| 成人国产精品久久| 国产精自产拍久久久久久| 亚洲第一影院| 欧美在线视频免费播放| www视频在线观看| 韩剧1988免费观看全集| 精品一性一色一乱农村| 高清视频欧美一级| 国产丝袜精品丝袜| 久久久久久国产精品久久| 蜜桃传媒在线观看免费进入| 欧美激情小视频| 欧美videos另类精品| 欧美极品少妇xxxxx| 18+视频在线观看| 欧美高清自拍一区| 黄色大片在线| 91精品国产乱码久久久久久蜜臀| sm性调教片在线观看| 午夜精品一区二区三区在线视| 乱馆动漫1~6集在线观看| 欧美亚洲午夜视频在线观看| 中文字幕在线免费观看视频| 91超碰caoporn97人人| 厕沟全景美女厕沟精品| 日韩av成人在线观看| 日韩在线免费| 国产日韩在线视频| 精品一区91| 国产一区二区三区av在线| 狠狠一区二区三区| 欧美精品一区在线| 色综合五月天| 久久精品国产综合| 五月天国产视频| 九九视频精品免费| 国产一级二级av| 成人av在线影院| 无码h肉动漫在线观看| 欧美激情综合在线| 国产成人av免费在线观看| 亚洲国产中文字幕| 一级黄色免费网站| 欧美乱熟臀69xxxxxx| 国产肥老妇视频| 日韩av在线直播| 在线看av的网址| 欧美激情二区三区| 亚洲精品mv| 成人精品在线观看| 美女福利一区| 亚洲7777| 红桃视频国产一区| 成人午夜激情av| 国产成人免费视频网站高清观看视频| 亚洲男人在线天堂| 国产精品美女www爽爽爽| 国产一级免费av| 色噜噜狠狠成人中文综合| 国产农村妇女毛片精品| 日韩精品高清在线| av片哪里在线观看| 日韩av电影手机在线| vam成人资源在线观看| 欧美大香线蕉线伊人久久| 2023国产精品久久久精品双| 日本毛片在线免费观看| 精品一区二区三区在线播放| 污片免费在线观看| 亚洲视频一区在线观看| 中文字幕第四页| 精品国产区一区| 免费av在线网址| 日韩免费观看网站| 国产精品jk白丝蜜臀av小说| 亚洲在线播放电影| 亚洲欧美bt| 午夜视频在线免费看| 国产精品久久久久国产精品日日| 日韩xxxxxxxxx| 欧美一区二区三区免费| 国产精品一二三区视频| 91国内在线视频| 一区二区网站| 91手机视频在线| 日韩电影在线看| 亚洲第九十七页| 亚洲在线视频一区| 99riav国产| 精品久久久av| 国产精品麻豆成人av电影艾秋| 久久综合中文色婷婷| 国色天香一区二区| 欧美在线a视频| 中文字幕一区二区三区在线不卡| 日韩三级一区二区| 亚洲欧美变态国产另类| 国产美女精品写真福利视频| 动漫精品视频| 国户精品久久久久久久久久久不卡| 欧美激情第一区| 日韩一区欧美小说| 中文字幕自拍偷拍| 亚洲精品aaaaa| 日韩精品久久久毛片一区二区| av不卡在线| japanese在线观看| 亚洲国产精品久久人人爱| 亚洲国产www| 九色精品美女在线| 51vv免费精品视频一区二区| 男人的天堂视频在线| 国产成人啪免费观看软件| 四虎免费在线视频| 日韩天堂在线观看| 欧美人与禽猛交乱配| 国产精品国模大尺度私拍| 国产综合自拍| 中文在线永久免费观看| 欧美午夜性色大片在线观看| 国产在线一在线二| 国产精品久久久久久久久久久新郎| 欧美视频网址| www.久久av.com| 一区二区三区精品视频在线| 国产综合无码一区二区色蜜蜜| 97人人做人人爱| 欧美巨大xxxx| 91淫黄看大片| 成人免费在线观看入口| www.黄色小说.com| 午夜精品一区二区三区av| 中国av一区| 性生生活大片免费看视频| 日韩毛片在线免费观看| 国内精品久久久久久久久久| 久久久久久午夜| 欧美精品第一区| 日韩av片专区| 亚洲一级不卡视频| 欧美日韩视频精品二区| 国产女精品视频网站免费| 午夜精品久久| 手机在线看片日韩| 欧美最猛性xxxxx直播| 好了av在线| 狠狠色噜噜狠狠狠狠色吗综合| 日本午夜一本久久久综合| 看免费黄色录像| 日韩高清免费观看| 日韩一级视频| 丝袜人妻一区二区三区| 国产日韩欧美激情| 亚洲xxxx天美| 国产精品久久久久久av福利| 欧美三级特黄| 级毛片内射视频| 日韩欧美黄色影院| 国产另类xxxxhd高清| 潘金莲一级淫片aaaaa免费看| 成人av网站在线观看| 中文字幕码精品视频网站| 久久久久久久香蕉网| 日韩欧美三级| 在线观看国产免费视频| 91麻豆精品国产| 台湾佬成人网| 国产一二三在线视频| 中文字幕乱码一区二区免费|