整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          使用 WebGL 為 HTML5 游戲創建逼真的地形

          薦:使用NSDT 編輯器快速搭建3D應用場景


          建 模 和 3D 地形

          大多數 3D 對象是 使用建模工具創建,這是有充分理由的。創建復雜對象 (如飛機甚至建筑物)很難在代碼中完成。建模工具 幾乎總是有意義的,但也有例外!其中之一可能是案例 就像飛行拱廊島連綿起伏的丘陵一樣。我們最終使用了 我們發現更簡單,甚至可能更直觀的技術:一個 高度圖。

          高度圖是一種 使用常規二維圖像來描述 像島嶼或其他地形一樣的表面。這是一種非常常見的使用方式 高程數據,不僅在游戲中,而且在地理信息系統中 制圖師和地質學家使用的 (GIS)。

          幫助您獲得想法 有關其工作原理,請查看此交互式演示中的高度圖。嘗試繪圖 ,然后檢出生成的地形。

          高度圖背后的概念 很簡單。在上圖所示的圖像中,純黑色是 “地板”和純白色是最高峰。介于兩者之間的灰度顏色 表示相應的高程。這為我們提供了 256 個海拔高度,這 是我們游戲的大量細節。實際應用程序可能會使用完整的 色譜可存儲更多層次的細節(2564 = 4,294,967,296 級 詳細信息(如果包含 Alpha 通道)。

          高度圖有幾個 與傳統多邊形網格相比的優勢:

          一、高度圖很多 更緊湊。僅存儲最重要的數據(高程)。它 需要以編程方式轉換為 3D 對象,但這是 經典交易:您現在節省空間,稍后通過計算付款。通過存儲 數據即圖像,您將獲得另一個空間優勢:您可以利用標準 圖像壓縮技術并使數據變小(相比之下)!

          其次,高度圖是一個 生成、可視化和編輯地形的便捷方式。非常直觀 當你看到一個。感覺有點像看地圖。這被證明是 對飛行街機特別有用。我們設計和編輯了我們的島嶼 在 Photoshop 中!這使得根據需要進行小調整變得非常簡單。 例如,當我們想確保跑道完全平坦時, 我們只是確保以單一顏色在該區域上繪畫。

          您可以看到高度圖 下面的飛行拱廊。看看你是否能發現我們為 跑道和村莊。

          飛行街機島的高度圖。它是在Photoshop中創建的,它基于著名的太平洋島鏈中的“大島”。有什么猜測嗎?

          在解碼高度貼圖后映射到生成的 3D 網格上的紋理。更多內容見下文。

          解碼高度圖

          我們用Babylon.js建造了飛行拱廊,Babylon給了我們一個漂亮的 從高度圖到 3D 的簡單路徑。Babylon提供了一個 API 來生成 來自高度圖圖像的網格幾何體:

          ar ground = BABYLON.Mesh.CreateGroundFromHeightMap(

          'your-mesh-name',

          '/path/to/heightmap.png',

          100, // width of the ground mesh (x axis)
          100, // depth of the ground mesh (z axis)

          40, // number of subdivisions

          0, // min height

          50, // max height

          scene,

          false, // updateable?

          null // callback when mesh is ready
          );`

          細節量是 由該細分的財產決定。需要注意的是, 參數是指高度圖兩側的細分數量 圖像,而不是單元格總數。所以稍微增加這個數字可以 對網格中的頂點總數有很大影響。

          • 20 個細分 = 400 細胞
          • 50 個細分 = 2,500 細胞
          • 100 個細分 = 10,000 細胞
          • 500 個細分 = 250,000 細胞
          • 1,000 個細分 = 1,000,000 細胞

          在下一節中,我們將 了解如何為地面設置紋理,但在嘗試使用高度貼圖時 創建時,查看線框很有用。這是應用簡單代碼 線框紋理,因此很容易看到高度圖數據是如何轉換為的 網格的頂點:

          // simple wireframe material

          var material = new BABYLON.StandardMaterial('ground-material', scene);

          material.wireframe = true;

          ground.material = material;`

          創建紋理細節

          一旦我們有一個模型,映射一個 質地相對簡單。對于飛行街機,我們簡單地創建了一個 非常大的圖像,與我們的高度圖中的島嶼相匹配。圖像得到 延伸到地形的輪廓上,所以紋理和高度圖 保持相關性。這真的很容易想象,再一次,所有 制作工作是在Photoshop中完成的。

          原始紋理圖像是 創建于 4096x4096。那可是挺大的!(我們最終將尺寸減小了 為了保持下載合理,級別到2048x2048,但所有 使用全尺寸圖像進行開發。這是來自 原始紋理。

          原始島嶼紋理的全像素示例。整個城鎮只有大約300平方像素。

          這些矩形表示 島上城鎮的建筑。我們很快注意到 我們可以在地形和 其他 3D 模型。即使使用我們巨大的島嶼紋理,區別在于 令人分心的明顯!

          為了解決這個問題,我們“混合” 以隨機噪聲的形式進入地形紋理的附加細節。您可以 請參閱下面的之前和之后。注意額外的噪點如何增強外觀 地形細節。

          我們創建了一個自定義著色器 添加噪音。著色器為您提供了對 WebGL 3D 場景的渲染,這是著色器如何 有用。

          WebGL著色器由兩個組成 主要部分:頂點和片段著色器。頂點的主要目標 著色器是將頂點映射到渲染幀中的某個位置。片段(或 像素)著色器控制像素的結果顏色。

          著色器是用 稱為GLSL(圖形庫著色器語言)的高級語言,它 類似于C。此代碼在 GPU 上執行。深入了解如何 著色器工作,請參閱此處 有關如何為 Babylon.js 創建自己的自定義著色器的教程,或參閱此圖形著色器編碼初學者指南。

          頂點著色器

          我們不會改變我們的 紋理映射到地面網格體,因此我們的頂點著色器非常簡單。 它只是計算標準映射并分配目標位置。

          precision mediump float;
          // Attributes
          attribute vec3 position;
          attribute vec3 normal;
          attribute vec2 uv;
          // Uniforms
          uniform mat4 worldViewProjection;
          // Varying
          varying vec4 vPosition;
          varying vec3 vNormal;
          varying vec2 vUV;
          void main() {
          vec4 p = vec4( position, 1.0 );
          vPosition = p;
          vNormal = normal;
          vUV = uv;
          gl_Position = worldViewProjection * p;
          }

          碎片著色器

          我們的片段著色器有點 更復雜。它結合了兩個不同的圖像:基礎圖像和混合圖像。 基礎圖像映射到整個地面網格。在飛行街機中,這個 是島嶼的彩色圖像。混合圖像是使用的小噪點圖像 在近距離為地面提供一些紋理和細節。著色器 組合每個圖像中的值以創建跨 島。

          飛行的最后一課 街機發生在有霧的日子,所以我們的像素著色器的另一個任務是 調整顏色以模擬霧。調整基于頂點的距離 來自相機,遠處像素被“遮擋”得更厲害 在霧中。您將在函數中看到此距離計算 在主著色器代碼上方。calcFogFactor

          // #ifdef GL_ES
          precision highp float;
          // #endif
          uniform mat4 worldView;
          varying vec4 vPosition;
          varying vec3 vNormal;
          varying vec2 vUV;
          // Refs
          uniform sampler2D baseSampler;
          uniform sampler2D blendSampler;
          uniform float blendScaleU;
          uniform float blendScaleV;
          // #define FOGMODE_NONE 0.
          // #define FOGMODE_EXP 1.
          // #define FOGMODE_EXP2 2.
          // #define FOGMODE_LINEAR 3.
          // #define E 2.71828
          uniform vec4 vFogInfos;
          uniform vec3 vFogColor;
          float calcFogFactor() {
          // gets distance from camera to vertex
          float fogDistance = gl_FragCoord.z / gl_FragCoord.w;
          float fogCoeff = 1.0;
          float fogStart = vFogInfos.y;
          float fogEnd = vFogInfos.z;
          float fogDensity = vFogInfos.w;
          if (FOGMODE_LINEAR == vFogInfos.x) {
          fogCoeff = (fogEnd - fogDistance) / (fogEnd - fogStart);
          }
          else if (FOGMODE_EXP == vFogInfos.x) {
          fogCoeff = 1.0 / pow(E, fogDistance * fogDensity);
          }
          else if (FOGMODE_EXP2 == vFogInfos.x) {
          fogCoeff = 1.0 / pow(E, fogDistance * fogDistance * fogDensity * fogDensity);
          }
          return clamp(fogCoeff, 0.0, 1.0);
          }
          void main(void) {
          vec4 baseColor = texture2D(baseSampler, vUV);
          vec2 blendUV = vec2(vUV.x * blendScaleU, vUV.y * blendScaleV);
          vec4 blendColor = texture2D(blendSampler, blendUV);
          // multiply type blending mode
          vec4 color = baseColor * blendColor;
          // factor in fog color
          float fog = calcFogFactor();
          color.rgb = fog * color.rgb + (1.0 - fog) * vFogColor;
          gl_FragColor = color;
          }

          我們定制的最后一件作品 Blend shader 是 Babylon 使用的 JavaScript 代碼。主要目的 此代碼用于準備傳遞給頂點和像素著色器的參數。

          function BlendMaterial(name, scene, options) {
          this.name = name;
          this.id = name;
          this.options = options;
          this.blendScaleU = options.blendScaleU || 1;
          this.blendScaleV = options.blendScaleV || 1;
          this._scene = scene;
          scene.materials.push(this);
          var assets = options.assetManager;
          var textureTask = assets.addTextureTask('blend-material-base-task', options.baseImage);
          textureTask.onSuccess = _.bind(function(task) {

              this.baseTexture = task.texture;
              this.baseTexture.uScale = 1;
              this.baseTexture.vScale = 1;
              if (options.baseHasAlpha) {
                  this.baseTexture.hasAlpha = true;
              }
          }, this);
          textureTask = assets.addTextureTask('blend-material-blend-task', options.blendImage);
          textureTask.onSuccess = _.bind(function(task) {
              this.blendTexture = task.texture;
              this.blendTexture.wrapU = BABYLON.Texture.MIRROR_ADDRESSMODE;
              this.blendTexture.wrapV = BABYLON.Texture.MIRROR_ADDRESSMODE;
          }, this);
          

          }
          BlendMaterial.prototype = Object.create(BABYLON.Material.prototype);
          BlendMaterial.prototype.needAlphaBlending = function () {
          return (this.options.baseHasAlpha === true);
          };
          BlendMaterial.prototype.needAlphaTesting = function () {
          return false;
          };
          BlendMaterial.prototype.isReady = function (mesh) {
          var engine = this._scene.getEngine();
          // make sure textures are ready
          if (!this.baseTexture || !this.blendTexture) {
          return false;
          }
          if (!this._effect) {
          this._effect = engine.createEffect(
          // shader name
          "blend",
          // attributes describing topology of vertices
          [ "position", "normal", "uv" ],
          // uniforms (external variables) defined by the shaders
          [ "worldViewProjection", "world", "blendScaleU", "blendScaleV", "vFogInfos", "vFogColor" ],
          // samplers (objects used to read textures)
          [ "baseSampler", "blendSampler" ],
          // optional define string
          "");
          }
          if (!this._effect.isReady()) {
          return false;
          }
          return true;
          };
          BlendMaterial.prototype.bind = function (world, mesh) {
          var scene = this._scene;
          this._effect.setFloat4("vFogInfos", scene.fogMode, scene.fogStart, scene.fogEnd, scene.fogDensity);
          this._effect.setColor3("vFogColor", scene.fogColor);
          this._effect.setMatrix("world", world);
          this._effect.setMatrix("worldViewProjection", world.multiply(scene.getTransformMatrix()));
          // Textures
          this._effect.setTexture("baseSampler", this.baseTexture);
          this._effect.setTexture("blendSampler", this.blendTexture);
          this._effect.setFloat("blendScaleU", this.blendScaleU);
          this._effect.setFloat("blendScaleV", this.blendScaleV);
          };
          BlendMaterial.prototype.dispose = function () {
          if (this.baseTexture) {
          this.baseTexture.dispose();
          }
          if (this.blendTexture) {
          this.blendTexture.dispose();
          }
          this.baseDispose();
          };

          Babylon.js使它變得容易 創建基于著色器的自定義材質。我們的混合材料相對簡單, 但它確實對島嶼的外觀產生了很大的影響,當 飛機低空飛到地面。著色器將 GPU 的強大功能帶到 瀏覽器,擴展可應用于 3D 的創意效果類型 場景。在我們的案例中,這是畫龍點名!

          原文鏈接:使用 WebGL 為 HTML5 游戲創建逼真的地形

          /xia仔のke:chaoxingit.com/196/

          入門WebGL與Three.js:從理論到實戰

          引言

          在當今互聯網的時代,3D 技術的應用已經越來越普遍,無論是在游戲開發、虛擬現實、還是在線可視化等領域,都有著廣泛的應用。在Web開發領域,通過 WebGL 和 Three.js 技術,我們可以輕松地在網頁上展現出引人入勝的 3D 圖形和交互效果。本文將介紹如何入門 WebGL 與 Three.js,并通過實戰示例帶你系統學習 Web3D 技術。

          第一部分:理論基礎

          1. 什么是WebGL?

          WebGL(Web Graphics Library)是一種用于在瀏覽器中呈現交互式 3D 和 2D 圖形的技術,它基于 OpenGL ES 標準,并與 HTML5 兼容。通過 WebGL,開發者可以利用瀏覽器的圖形處理能力來創建各種各樣的視覺效果。

          2. 什么是Three.js?

          Three.js 是一個開源的 JavaScript 庫,它封裝了 WebGL,簡化了在瀏覽器中創建 3D 圖形的過程。Three.js 提供了一系列易于使用的API,使開發者可以輕松地創建和控制各種 3D 場景、模型、動畫等。

          第二部分:實踐操作

          1. 設置環境

          首先,我們需要設置開發環境。創建一個 HTML 文件,并引入 Three.js 庫:

          html<!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>WebGL + Three.js</title>
              <style>
                  body { margin: 0; }
                  canvas { display: block; }
              </style>
          </head>
          <body>
              <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
              <script>
                  // 在這里編寫 Three.js 代碼
              </script>
          </body>
          </html>
          

          2. 創建一個簡單的場景

          接下來,我們將創建一個簡單的 3D 場景,并在其中添加一個立方體:

          html<script>
              // 創建場景
              const scene = new THREE.Scene();
          
              // 創建相機
              const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
              camera.position.z = 5;
          
              // 創建渲染器
              const renderer = new THREE.WebGLRenderer();
              renderer.setSize(window.innerWidth, window.innerHeight);
              document.body.appendChild(renderer.domElement);
          
              // 創建立方體
              const geometry = new THREE.BoxGeometry();
              const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
              const cube = new THREE.Mesh(geometry, material);
              scene.add(cube);
          
              // 渲染場景
              function animate() {
                  requestAnimationFrame(animate);
                  cube.rotation.x += 0.01;
                  cube.rotation.y += 0.01;
                  renderer.render(scene, camera);
              }
              animate();
          </script>
          

          第三部分:進階應用

          1. 加載模型

          Three.js 還支持加載外部的 3D 模型文件,如 OBJ、FBX、GLTF 等格式。通過加載模型,我們可以在場景中展示更加復雜的物體。

          html<script>
              const loader = new THREE.GLTFLoader();
              loader.load('model.glb', function (gltf) {
                  scene.add(gltf.scene);
              });
          </script>
          

          2. 添加光照

          為了使場景中的物體更加逼真,我們可以添加光源。Three.js 支持多種光源類型,包括環境光、點光源、平行光等。

          html<script>
              // 添加環境光
              const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
              scene.add(ambientLight);
          
              // 添加點光源
              const pointLight = new THREE.PointLight(0xffffff, 1);
              pointLight.position.set(5, 5, 5);
              scene.add(pointLight);
          </script>
          

          結論

          通過本文的介紹,你應該已經對 WebGL 與 Three.js 有了基本的了解,并且能夠通過實踐操作來創建簡單的 3D 場景和模型。Web3D 技術的應用范圍非常廣泛,未來你可以利用這些知識來開發各種有趣的 Web3D 應用,如游戲、虛擬現實體驗、產品展示等。


          /xia仔のke:itzcw.com/8968/

          WebGL與Three.js入門

          WebGL(Web Graphics Library)是一種JavaScript API,它基于OpenGL ES標準,允許開發者在瀏覽器中創建和渲染3D圖形。WebGL與HTML5 Canvas元素緊密結合,使得開發者可以使用JavaScript代碼直接與GPU通信,從而實現高性能的3D渲染。

          Three.js是一個流行的JavaScript庫,它建立在WebGL之上,提供了一個簡潔的API,使得開發者更容易地創建和管理3D場景、模型、動畫等。Three.js簡化了WebGL的使用,使得即使是沒有WebGL經驗的開發者也能快速上手開發3D應用。

          實戰項目

          在學習WebGL和Three.js的過程中,實戰項目是非常重要的一部分。通過實際的項目,你可以將所學的理論知識付諸實踐,解決真實世界的問題。實戰項目通常包括以下幾個方面:

          創建3D場景:設置相機、添加幾何體、設置材質和光源等。

          實現物體的旋轉和移動:通過修改物體的位置和旋轉角度來實現。

          實現交互操作:例如通過鼠標或觸摸屏控制物體的旋轉和移動。

          優化性能:包括減少重繪區域、使用緩沖區等手段優化性能。

          發布應用:將應用打包發布到Web服務器上,供用戶訪問。

          學習資源

          目前網絡上有很多關于WebGL和Three.js的學習資源。例如,有些課程會涵蓋WebGL基礎、Three.js入門、圖形學基礎、模型加載與處理、紋理與材質、光照與陰影、交互與動畫、優化與性能調優等內容。這些課程可能還會提供一些實戰項目,讓學員應用所學知識,開發并部署具有實際應用場景的Web3D應用。

          此外,還有一些書籍、在線教程、視頻課程和社區論壇,如Bilibili、掘金等平臺,也提供了大量的WebGL和Three.js學習資源,可以幫助你更快地上手和深入學習。

          通過這些資源,你可以逐步提升自己的Web3D技術水平,并為開發各種類型的交互式3D應用奠定堅實的基礎。

          WebGL和Three.js在現代Web開發中的地位

          WebGL和Three.js在現代Web開發中扮演著重要的角色,它們極大地推動了3D技術在網頁上的應用和發展。WebGL作為底層的圖形渲染API,為開發者提供了在瀏覽器中渲染三維圖形的可能性。而Three.js作為一個建立在WebGL之上的JavaScript庫,它簡化了使用WebGL創建和展示三維圖形的過程,使得開發者無需深入了解WebGL的復雜性,也能夠輕松地在網頁中集成3D內容。

          對推動3D技術普及的作用

          WebGL和Three.js的出現降低了3D技術在Web開發中的門檻,使得更多的開發者和設計師能夠參與到3D內容的創作中來。Three.js提供的豐富功能,如加載并顯示模型、應用各種材質和紋理、創建燈光和相機、執行動畫等,都大大簡化了3D開發的流程。這不僅促進了3D技術在商業領域的應用,如在線購物、在線教育、游戲等,而且還激發了創新,因為開發者可以用3D技術來解決更多樣化的問題。

          未來趨勢

          隨著技術的發展,WebGL和Three.js將繼續在Web開發中發揮重要作用。隨著5G和物聯網時代的到來,WebGL和Three.js的技術前景將進一步得到發展,預計會有更多的創新和應用出現。同時,隨著WebGL支持的增強和瀏覽器功能的日益強大,WebGL和Three.js也將繼續成為復雜應用和圖形的主要平臺。因此,WebGL和Three.js不僅是當前Web開發的重要組成部分,也是未來發展的關鍵技術之一。

          在進行Web3D應用開發時,以下幾個因素會對應用的性能和用戶體驗產生顯著影響:

          性能優化

          性能優化是提高Web3D應用流暢度的關鍵。這包括但不限于以下幾點:

          JavaScript壓縮和模塊打包:減小文件大小,提高加載速度。

          渲染性能優化:使用高效的渲染技術,快速加載和渲染大規模的3D模型數據。

          數據壓縮與傳輸:采用有效的數據壓縮算法和傳輸優化技術,減少加載時間和網絡帶寬消耗。

          瀏覽器兼容性

          不同的瀏覽器對WebGL的支持程度可能會有所不同,確保應用在主流瀏覽器上都能正常運行,并進行充分的兼容性測試。

          移動設備適配

          移動設備上的WebGL性能可能有限,而且屏幕尺寸較小。確保應用在移動設備上能夠正常運行,并提供良好的用戶體驗。

          用戶體驗設計

          為用戶提供友好的界面和控制方式,確保用戶能夠輕松地與3D場景交互。考慮到不同用戶的設備和技能水平,使界面易于理解和使用。

          網絡加載和優化

          3D模型和紋理文件可能較大,因此需要考慮加載時間和帶寬。使用適當的壓縮技術、資源懶加載和CDN等手段來優化加載性能。

          安全性考慮

          處理用戶上傳的3D模型時需要謹慎,防止潛在的安全風險。確保應用在處理用戶輸入和上傳時具有適當的安全性措施。

          綜上所述,性能優化、瀏覽器兼容性、移動設備適配、用戶體驗設計和網絡加載優化是影響Web3D應用性能和用戶體驗的關鍵因素。在開發過程中,應特別注意這些方面的優化和適應性調整。

          WebGL和Three.js在新興技術領域的應用前景

          WebGL和Three.js作為Web開發中的3D技術,已經在多個新興技術領域展現出了巨大的潛力和應用前景。以下是幾個關鍵點,展示了它們在未來可能扮演的角色:

          增強現實(AR)和混合現實(MR): WebGL和Three.js可以用來創建在現實世界中疊加虛擬元素的體驗,這在增強現實游戲中尤其常見。通過在Web瀏覽器中渲染3D內容,用戶可以直接在他們的物理環境中與數字對象互動,這種無縫集成的體驗對于教育和娛樂領域尤為有價值。

          虛擬現實(VR): WebGL和Three.js也可以用于創建虛擬現實體驗,讓用戶沉浸在一個完全由數字構成的環境中。這種技術可以用于游戲、電影、甚至是遠程工作,提供了一個全新的維度來體驗內容。

          Web3技術融合: Web3技術,特別是區塊鏈,正逐漸與虛擬現實技術融合。這種融合可能會導致去中心化的虛擬世界的誕生,其中用戶可以擁有和交易虛擬資產,并在沒有中介的情況下參與虛擬活動。WebGL和Three.js將是實現這些虛擬世界的重要技術基礎。

          教育和培訓: 在教育領域,WebGL和Three.js可以提供一個更加直觀和互動的學習環境。無論是醫學解剖、地理信息系統還是復雜的科學概念,都可以通過3D模型和模擬來教授,提高學習效率和興趣。

          娛樂和社交: 在娛樂行業,WebGL和Three.js可以用來創建互動式的音樂視頻、在線游戲和社交平臺,讓用戶在虛擬空間中與他人互動,享受沉浸式的娛樂體驗。

          商業和零售: 商家可以使用WebGL和Three.js來創建虛擬的商店或產品展示廳,讓顧客在不受地域限制的情況下探索和體驗產品。這種新型的購物體驗有望改變消費者的購買習慣。

          文化和旅游: 文化機構可以使用WebGL和Three.js來創建虛擬博物館或歷史遺跡的復原,讓公眾在家中就能享受到實地參觀的體驗。旅游業也可能利用這些技術來提供虛擬旅游服務。

          總的來說,WebGL和Three.js在新興技術領域的前景看起來非常廣闊,它們不僅能夠推動3D技術的發展,還能夠為用戶提供更加豐富和沉浸式的體驗。隨著技術的進步和市場的需求,我們可以預見這些工具將在未來幾年內繼續發展和演變,以滿足不斷變化的市場需求


          主站蜘蛛池模板: 国产一区二区三区久久精品| 国产精品视频一区| 亚洲国产美国国产综合一区二区| 91精品一区二区综合在线| 亚洲Aⅴ无码一区二区二三区软件| 无码人妻精品一区二区三区久久 | 一区二区传媒有限公司| 精品国产一区二区三区久久蜜臀| 午夜在线视频一区二区三区| 成人免费观看一区二区| 色窝窝无码一区二区三区成人网站| 国产精品自在拍一区二区不卡| 国产一区美女视频| 北岛玲在线一区二区| 日韩精品一区二区三区国语自制| 伊人色综合网一区二区三区| 日本激情一区二区三区| 91精品国产一区| 亚洲无圣光一区二区| 亚洲视频一区二区在线观看| 99久久人妻精品免费一区| 无码精品人妻一区二区三区中| 国产爆乳无码一区二区麻豆 | 人妻互换精品一区二区| 亚洲av无码一区二区三区人妖| 亚洲一区二区观看播放| 亚洲日韩一区二区三区| 成人丝袜激情一区二区| 国产一区二区三区电影| 变态调教一区二区三区| 精品国产一区二区三区久久蜜臀| 一区二区三区精品高清视频免费在线播放 | 国产无码一区二区在线| 中文字幕在线无码一区二区三区 | 精品国产日韩亚洲一区在线| 国产成人精品无码一区二区老年人| 国产成人av一区二区三区不卡| 人妻内射一区二区在线视频| 亚洲日韩精品无码一区二区三区| 无码AV中文一区二区三区| 免费无码A片一区二三区|