<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Three.js 實(shí)現(xiàn) 2022 冬奧主題 3D 趣味頁面

          共 19918字,需瀏覽 40分鐘

           ·

          2022-02-10 21:24

          前端瓶子君,關(guān)注公眾號(hào)

          回復(fù)算法,加入前端編程面試算法每日一題群

          背景

          迎冬奧,一起向未來!2022冬奧會(huì)馬上就要開始了,本文使用 Three.js + React 技術(shù)棧,實(shí)現(xiàn)冬日和奧運(yùn)元素,制作了一個(gè)充滿趣味和紀(jì)念意義的冬奧主題 3D 頁面。本文涉及到的知識(shí)點(diǎn)主要包括:TorusGeometry 圓環(huán)面、MeshLambertMaterial 非光澤表面材質(zhì)、MeshDepthMaterial 深度網(wǎng)格材質(zhì)、custromMaterial 自定義材質(zhì)、Points 粒子、PointsMaterial 點(diǎn)材質(zhì)等。

          效果

          實(shí)現(xiàn)效果如以下 ?? 動(dòng)圖所示,頁面主要由 2022 冬奧會(huì)吉祥物 冰墩墩 、奧運(yùn)五環(huán)、舞動(dòng)的旗幟 ??、樹木 ?? 以及下雪效果 ?? 等組成。按住鼠標(biāo)左鍵移動(dòng)可以改為相機(jī)位置,獲得不同視圖。

          ?? 在線預(yù)覽:https://dragonir.github.io/3d/#/olympic (部署在 GitHub,加載速度可能會(huì)有點(diǎn)慢 ??

          實(shí)現(xiàn)

          引入資源

          首先引入開發(fā)頁面所需要的庫和外部資源,OrbitControls 用于鏡頭軌道控制、TWEEN 用于補(bǔ)間動(dòng)畫實(shí)現(xiàn)、GLTFLoader 用于加載 glbgltf 格式的 3D 模型、以及一些其他模型、貼圖等資源。

          import React from 'react';
          import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
          import { TWEEN } from "three/examples/jsm/libs/tween.module.min.js";
          import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
          import bingdundunModel from './models/bingdundun.glb';
          // ...

          頁面DOM結(jié)構(gòu)

          頁面 DOM 結(jié)構(gòu)非常簡單,只有渲染 3D 元素的 #container 容器和顯示加載進(jìn)度的 .olympic_loading元素。

          <div>
            <div id\="container"\></div\>
            {this.state.loadingProcess === 100 ? '' : (
              <div className\="olympic\_loading"\>
                <div className\="box"\>{this.state.loadingProcess} %</div\>
              </div\>

            )}
          </div>

          場景初始化

          初始化渲染容器、場景、相機(jī)。關(guān)于這部分內(nèi)容的詳細(xì)知識(shí)點(diǎn),可以查閱我往期的文章,本文中不再贅述。

          container = document.getElementById('container');
          renderer = new THREE.WebGLRenderer({ antialiastrue });
          renderer.setPixelRatio(window.devicePixelRatio);
          renderer.setSize(window.innerWidth, window.innerHeight);
          renderer.shadowMap.enabled = true;
          container.appendChild(renderer.domElement);
          scene = new THREE.Scene();
          scene.background = new THREE.TextureLoader().load(skyTexture);
          camera = new THREE.PerspectiveCamera(60window.innerWidth / window.innerHeight, 0.11000);
          camera.position.set(030100);
          camera.lookAt(new THREE.Vector3(000));

          添加光源

          本示例中主要添加了兩種光源:DirectionalLight 用于產(chǎn)生陰影,調(diào)節(jié)頁面亮度、AmbientLight 用于渲染環(huán)境氛圍。

          // 直射光
          const light = new THREE.DirectionalLight(0xffffff1);
          light.intensity = 1;
          light.position.set(16168);
          light.castShadow = true;
          light.shadow.mapSize.width = 512 \* 12;
          light.shadow.mapSize.height = 512 \* 12;
          light.shadow.camera.top = 40;
          light.shadow.camera.bottom = -40;
          light.shadow.camera.left = -40;
          light.shadow.camera.right = 40;
          scene.add(light);
          // 環(huán)境光
          const ambientLight = new THREE.AmbientLight(0xcfffff);
          ambientLight.intensity = 1;
          scene.add(ambientLight);

          加載進(jìn)度管理

          使用 THREE.LoadingManager 管理頁面模型加載進(jìn)度,在它的回調(diào)函數(shù)中執(zhí)行一些與加載進(jìn)度相關(guān)的方法。本例中的頁面加載進(jìn)度就是在 onProgress 中完成的,當(dāng)頁面加載進(jìn)度為 100% 時(shí),執(zhí)行 TWEEN 鏡頭補(bǔ)間動(dòng)畫。

          const manager = new THREE.LoadingManager();
          manager.onStart = (url, loaded, total) => {};
          manager.onLoad = () => { console.log('Loading complete!')};
          manager.onProgress = (url, loaded, total) => {
            if (Math.floor(loaded / total \* 100) === 100) {
              this.setState({ loadingProcessMath.floor(loaded / total \* 100) });
              // 鏡頭補(bǔ)間動(dòng)畫
              Animations.animateCamera(camera, controls, { x0y-1z20 }, { x0y0z0 }, 3600, () => {});
            } else {
              this.setState({ loadingProcessMath.floor(loaded / total \* 100) });
            }
          };

          創(chuàng)建地面

          本示例中凹凸起伏的地面是使用 Blender 構(gòu)建模型,然后導(dǎo)出 glb 格式加載創(chuàng)建的。當(dāng)然也可以只使用 Three.js 自帶平面網(wǎng)格加凹凸貼圖也可以實(shí)現(xiàn)類似的效果。使用 Blender 自建模型的優(yōu)點(diǎn)在于可以自由可視化地調(diào)整地面的起伏效果。

          var loader = new THREE.GLTFLoader(manager);
          loader.load(landModel, function (mesh{
            mesh.scene.traverse(function (child{
              if (child.isMesh) {
                child.material.metalness = .1;
                child.material.roughness = .8;
                // 地面
                if (child.name === 'Mesh\_2') {
                  child.material.metalness = .5;
                  child.receiveShadow = true;
                }
            });
            mesh.scene.rotation.y = Math.PI / 4;
            mesh.scene.position.set(15-200);
            mesh.scene.scale.set(.9.9.9);
            land = mesh.scene;
            scene.add(land);
          });

          創(chuàng)建冬奧吉祥物冰墩墩

          現(xiàn)在添加可愛的冬奧會(huì)吉祥物熊貓冰墩墩 ??,冰墩墩同樣是使用 glb 格式模型加載的。它的原始模型來源于這里,從這個(gè)網(wǎng)站免費(fèi)現(xiàn)在模型后,原模型是使用 3D max 建的我發(fā)現(xiàn)并不能直接用在網(wǎng)頁中,需要在 Blender 中轉(zhuǎn)換模型格式,還需要調(diào)整調(diào)整模型的貼圖法線,才能還原渲染圖效果。

          原模型

          冰墩墩貼圖:

          轉(zhuǎn)換成Blender支持的模型,并在Blender中調(diào)整模型貼圖法線、并添加貼圖:

          導(dǎo)出glb格式:

          ??Blender 中給模型添加貼圖教程傳送門:在Blender中怎么給模型貼圖

          仔細(xì)觀察冰墩墩 ??可以發(fā)現(xiàn),它的外面有一層透明塑料或玻璃質(zhì)感外殼,這個(gè)效果可以通過修改模型的透明度、金屬度、粗糙度等材質(zhì)參數(shù)實(shí)現(xiàn),最后就可以渲染出如 ?? banner圖 所示的那種效果,具體如以下代碼所示。

          loader.load(bingdundunModel, mesh => {
            mesh.scene.traverse(child => {
              if (child.isMesh) {
                // 內(nèi)部
                if (child.name === 'oldtiger001') {
                  child.material.metalness = .5
                  child.material.roughness = .8
                }
                // 半透明外殼
                if (child.name === 'oldtiger002') {
                  child.material.transparent = true;
                  child.material.opacity = .5
                  child.material.metalness = .2
                  child.material.roughness = 0
                  child.material.refractionRatio = 1
                  child.castShadow = true;
                }
              }
            });
            mesh.scene.rotation.y = Math.PI / 24;
            mesh.scene.position.set(-8-120);
            mesh.scene.scale.set(242424);
            scene.add(mesh.scene);
          });

          創(chuàng)建奧運(yùn)五環(huán)

          奧運(yùn)五環(huán)由基礎(chǔ)幾何模型圓環(huán)面 TorusGeometry 來實(shí)現(xiàn),創(chuàng)建五個(gè)圓環(huán)面,并調(diào)整它們的材質(zhì)顏色和位置來構(gòu)成藍(lán)黑紅黃綠順序的五環(huán)結(jié)構(gòu)。五環(huán)材質(zhì)使用的是 MeshLambertMaterial

          const fiveCycles = \[
            { key'cycle\_0'color0x0885c2position: { x-250y0z0 }},
            { key'cycle\_1'color0x000000position: { x-10y0z5 }},
            { key'cycle\_2'color0xed334eposition: { x230y0z0 }},
            { key'cycle\_3'color0xfbb132position: { x-125y-100z-5 }},
            { key'cycle\_4'color0x1c8b3cposition: { x115y-100z10 }}
          \];
          fiveCycles.map(item => {
            let cycleMesh = new THREE.Mesh(new THREE.TorusGeometry(100101050), new THREE.MeshLambertMaterial({
              colornew THREE.Color(item.color),
              side: THREE.DoubleSide
            }));
            cycleMesh.castShadow = true;
            cycleMesh.position.set(item.position.x, item.position.y, item.position.z);
            meshes.push(cycleMesh);
            fiveCyclesGroup.add(cycleMesh);
          });
          fiveCyclesGroup.scale.set(.036.036.036);
          fiveCyclesGroup.position.set(010-8);
          scene.add(fiveCyclesGroup);

          ?? TorusGeometry 圓環(huán)面

          TorusGeometry 一個(gè)用于生成圓環(huán)幾何體的類。

          構(gòu)造函數(shù)

          TorusGeometry(radius: Float, tube: Float, radialSegments: Integer, tubularSegments: Integer, arc: Float)
          • radius:圓環(huán)的半徑,從圓環(huán)的中心到管道(橫截面)的中心。默認(rèn)值是 1。
          • tube:管道的半徑,默認(rèn)值為 0.4。
          • radialSegments:圓環(huán)的分段數(shù),默認(rèn)值為 8。
          • tubularSegments:管道的分段數(shù),默認(rèn)值為 6
          • arc:圓環(huán)的圓心角(單位是弧度),默認(rèn)值為 Math.PI * 2。

          ?? MeshLambertMaterial 非光澤表面材質(zhì)

          一種非光澤表面的材質(zhì),沒有鏡面高光。該材質(zhì)使用基于非物理的 Lambertian 模型來計(jì)算反射率。這可以很好地模擬一些表面(例如未經(jīng)處理的木材或石材),但不能模擬具有鏡面高光的光澤表面(例如涂漆木材)。

          構(gòu)造函數(shù)

          MeshLambertMaterial(parameters : Object)
          • parameters:(可選)用于定義材質(zhì)外觀的對(duì)象,具有一個(gè)或多個(gè)屬性。材質(zhì)的任何屬性都可以從此處傳入。

          創(chuàng)建旗幟

          旗面模型是從sketchfab下載的,還需要一個(gè)旗桿,可以在 Blender中添加了一個(gè)柱狀立方體,并調(diào)整好合適的長寬高和旗面結(jié)合起來。

          旗面貼圖

          旗面添加了動(dòng)畫,需要在代碼中執(zhí)行動(dòng)畫幀播放。

          loader.load(flagModel, mesh => {
            mesh.scene.traverse(child => {
              if (child.isMesh) {
                child.castShadow = true;
                // 旗幟
                if (child.name === 'mesh\_0001') {
                  child.material.metalness = .1;
                  child.material.roughness = .1;
                  child.material.map = new THREE.TextureLoader().load(flagTexture);
                }
                // 旗桿
                if (child.name === '柱體') {
                  child.material.metalness = .6;
                  child.material.roughness = 0;
                  child.material.refractionRatio = 1;
                  child.material.color = new THREE.Color(0xeeeeee);
                }
              }
            });
            mesh.scene.rotation.y = Math.PI / 24;
            mesh.scene.position.set(2-7-1);
            mesh.scene.scale.set(444);
            // 動(dòng)畫
            let meshAnimation = mesh.animations\[0\];
            mixer = new THREE.AnimationMixer(mesh.scene);
            let animationClip = meshAnimation;
            let clipAction = mixer.clipAction(animationClip).play();
            animationClip = clipAction.getClip();
            scene.add(mesh.scene);
          });

          創(chuàng)建樹木

          為了充實(shí)畫面,營造冬日氛圍,于是就添加了幾棵松樹 ?? 作為裝飾。添加松樹的時(shí)候用到一個(gè)技巧非常重要:我們知道因?yàn)闃涞哪P头浅?fù)雜,有非常多的面數(shù),面數(shù)太多會(huì)降低頁面性能,造成卡頓。本文中使用兩個(gè)如下圖 ?? 所示的兩個(gè)交叉的面來作為樹的基座,這樣的話樹只有兩個(gè)面數(shù),使用這個(gè)技巧可以和大程度上優(yōu)化頁面性能,而且樹 ?? 的樣子看起來也是有 3D 感的。

          材質(zhì)貼圖

          為了使樹只在貼圖透明部分透明、其他地方不透明,并且可以產(chǎn)生樹狀陰影而不是長方體陰影,需要給樹模型添加如下 MeshPhysicalMaterial、MeshDepthMaterial 兩種材質(zhì),兩種材質(zhì)使用同樣的紋理貼圖,其中 MeshDepthMaterial 添加到模型的 custromMaterial 屬性上。

           let treeMaterial = new THREE.MeshPhysicalMaterial({
            mapnew THREE.TextureLoader().load(treeTexture),
            transparenttrue,
            side: THREE.DoubleSide,
            metalness.2,
            roughness.8,
            depthTesttrue,
            depthWritefalse,
            skinningfalse,
            fogfalse,
            reflectivity0.1,
            refractionRatio0,
          });
          let treeCustomDepthMaterial = new THREE.MeshDepthMaterial({
            depthPacking: THREE.RGBADepthPacking,
            mapnew THREE.TextureLoader().load(treeTexture),
            alphaTest0.5
          });
          loader.load(treeModel, mesh => {
            mesh.scene.traverse(child =>{
              if (child.isMesh) {
                child.material = treeMaterial;
                child.custromMaterial = treeCustomDepthMaterial;
              }
            });
            mesh.scene.position.set(14-90);
            mesh.scene.scale.set(161616);
            scene.add(mesh.scene);
            // 克隆另兩棵樹
            let tree2 = mesh.scene.clone();
            tree2.position.set(10-8-15);
            tree2.scale.set(181818);
            scene.add(tree2)
            // ...
          });

          實(shí)現(xiàn)效果也可以從 ?? 上面 Banner 圖中可以看到,為了畫面更好看,我取消了樹的陰影顯示。

          ??3D 功能開發(fā)中,一些不重要的裝飾模型都可以采取這種策略來優(yōu)化。

          ?? MeshDepthMaterial 深度網(wǎng)格材質(zhì)

          一種按深度繪制幾何體的材質(zhì)。深度基于相機(jī)遠(yuǎn)近平面,白色最近,黑色最遠(yuǎn)。

          構(gòu)造函數(shù)

          MeshDepthMaterial(parameters: Object)
          • parameters:(可選)用于定義材質(zhì)外觀的對(duì)象,具有一個(gè)或多個(gè)屬性。材質(zhì)的任何屬性都可以從此處傳入。

          特殊屬性

          • .depthPacking[Constant]depth packing 的編碼。默認(rèn)為 BasicDepthPacking。
          • .displacementMap[Texture]:位移貼圖會(huì)影響網(wǎng)格頂點(diǎn)的位置,與僅影響材質(zhì)的光照和陰影的其他貼圖不同,移位的頂點(diǎn)可以投射陰影,阻擋其他對(duì)象,以及充當(dāng)真實(shí)的幾何體。
          • .displacementScale[Float]:位移貼圖對(duì)網(wǎng)格的影響程度(黑色是無位移,白色是最大位移)。如果沒有設(shè)置位移貼圖,則不會(huì)應(yīng)用此值。默認(rèn)值為 1。
          • .displacementBias[Float]:位移貼圖在網(wǎng)格頂點(diǎn)上的偏移量。如果沒有設(shè)置位移貼圖,則不會(huì)應(yīng)用此值。默認(rèn)值為 0

          ?? custromMaterial 自定義材質(zhì)

          給網(wǎng)格添加 custromMaterial 自定義材質(zhì)屬性,可以實(shí)現(xiàn)透明外圍 png 圖片貼圖的內(nèi)容區(qū)域陰影。

          創(chuàng)建雪花

          創(chuàng)建雪花 ??,就要用到粒子知識(shí)。THREE.Points 是用來創(chuàng)建點(diǎn)的類,也用來批量管理粒子。本例中創(chuàng)建了 1500 個(gè)雪花粒子,并為它們?cè)O(shè)置了限定三維空間的隨機(jī)坐標(biāo)及橫向和豎向的隨機(jī)移動(dòng)速度。

          // 雪花貼圖
          let texture = new THREE.TextureLoader().load(snowTexture);
          let geometry = new THREE.Geometry();
          let range = 100;
          let pointsMaterial = new THREE.PointsMaterial({
            size1,
            transparenttrue,
            opacity0.8,
            map: texture,
            // 背景融合
            blending: THREE.AdditiveBlending,
            // 景深衰弱
            sizeAttenuationtrue,
            depthTestfalse
          });
          for (let i = 0; i < 1500; i++) {
            let vertice = new THREE.Vector3(Math.random() \* range - range / 2Math.random() \* range \* 1.5Math.random() \* range - range / 2);
            // 縱向移速
            vertice.velocityY = 0.1 + Math.random() / 3;
            // 橫向移速
            vertice.velocityX = (Math.random() - 0.5) / 3;
            // 加入到幾何
            geometry.vertices.push(vertice);
          }
          geometry.center();
          points = new THREE.Points(geometry, pointsMaterial);
          points.position.y = -30;
          scene.add(points);

          ?? Points 粒子

          Three.js 中,雨 ???、雪 ??、云 ??、星辰 ? 等生活中常見的粒子都可以使用 Points 來模擬實(shí)現(xiàn)。

          構(gòu)造函數(shù)

          new THREE.Points(geometry, material);
          • 構(gòu)造函數(shù)可以接受兩個(gè)參數(shù),一個(gè)幾何體和一個(gè)材質(zhì),幾何體參數(shù)用來制定粒子的位置坐標(biāo),材質(zhì)參數(shù)用來格式化粒子;
          • 可以基于簡單幾何體對(duì)象如 BoxGeometrySphereGeometry等作為粒子系統(tǒng)的參數(shù);
          • 一般來講,需要自己指定頂點(diǎn)來確定粒子的位置。

          ?? PointsMaterial 點(diǎn)材質(zhì)

          通過 THREE.PointsMaterial 可以設(shè)置粒子的屬性參數(shù),是 Points 使用的默認(rèn)材質(zhì)。

          構(gòu)造函數(shù)

          PointsMaterial(parameters : Object)
          • parameters:(可選)用于定義材質(zhì)外觀的對(duì)象,具有一個(gè)或多個(gè)屬性。材質(zhì)的任何屬性都可以從此處傳入。

          ?? 材質(zhì)屬性 .blending

          材質(zhì)的.blending 屬性主要控制紋理融合的疊加方式,.blending 屬性的值包括:

          • THREE.NormalBlending:默認(rèn)值
          • THREE.AdditiveBlending:加法融合模式
          • THREE.SubtractiveBlending:減法融合模式
          • THREE.MultiplyBlending:乘法融合模式
          • THREE.CustomBlending:自定義融合模式,與 .blendSrc, .blendDst.blendEquation 屬性組合使用

          ?? 材質(zhì)屬性 .sizeAttenuation

          粒子的大小是否會(huì)被相機(jī)深度衰減,默認(rèn)為 true(僅限透視相機(jī))。

          ?? Three.js 向量

          幾維向量就有幾個(gè)分量,二維向量 Vector2xy 兩個(gè)分量,三維向量 Vector3x、y、z 三個(gè)分量,四維向量 Vector4x、y、zw 四個(gè)分量。

          相關(guān)API

          • Vector2:二維向量
          • Vector3:三維向量
          • Vector4:四維向量

          鏡頭控制、縮放適配、動(dòng)畫

          controls = new OrbitControls(camera, renderer.domElement);
          controls.target.set(000);
          controls.enableDamping = true;
          // 禁用平移
          controls.enablePan = false;
          // 禁用縮放
          controls.enableZoom = false;
          // 垂直旋轉(zhuǎn)角度限制
          controls.minPolarAngle = 1.4;
          controls.maxPolarAngle = 1.8;
          // 水平旋轉(zhuǎn)角度限制
          controls.minAzimuthAngle = -.6;
          controls.maxAzimuthAngle = .6;
          window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
          }, false);
          function animate() {
            requestAnimationFrame(animate);
            renderer.render(scene, camera);
            controls && controls.update();
            // 旗幟動(dòng)畫更新
            mixer && mixer.update(new THREE.Clock().getDelta());
            // 鏡頭動(dòng)畫
            TWEEN && TWEEN.update();
            // 五環(huán)自轉(zhuǎn)
            fiveCyclesGroup && (fiveCyclesGroup.rotation.y += .01);
            // 頂點(diǎn)變動(dòng)之后需要更新,否則無法實(shí)現(xiàn)雨滴特效
            points.geometry.verticesNeedUpdate = true;
            // 雪花動(dòng)畫更新
            let vertices = points.geometry.vertices;
            vertices.forEach(function (v{
              v.y = v.y - (v.velocityY);
              v.x = v.x - (v.velocityX);
              if (v.y <= 0) v.y = 60;
              if (v.x <= -20 || v.x >= 20) v.velocityX = v.velocityX \* -1;
            });
          }

          ?? 完整代碼:https://github.com/dragonir/3...

          總結(jié)

          ?? 本文中主要包含的新知識(shí)點(diǎn)包括:

          • TorusGeometry 圓環(huán)面
          • MeshLambertMaterial 非光澤表面材質(zhì)
          • MeshDepthMaterial 深度網(wǎng)格材質(zhì)
          • custromMaterial 自定義材質(zhì)
          • Points 粒子
          • PointsMaterial 點(diǎn)材質(zhì)
          • 材質(zhì)屬性 .blending、.sizeAttenuation
          • Three.js 向量

          進(jìn)一步優(yōu)化的空間:

          • 添加更多的交互功能、界面樣式進(jìn)一步優(yōu)化;
          • 吉祥物冰墩墩添加骨骼動(dòng)畫,并可以通過鼠標(biāo)和鍵盤控制其移動(dòng)和交互。

          下期預(yù)告

          • Metahuman元人類!Three.js人像優(yōu)化》

          想了解場景初始化、光照、陰影、基礎(chǔ)幾何體、網(wǎng)格、材質(zhì)及其他 Three.js 的相關(guān)知識(shí),可閱讀我往期文章。如果覺得文章對(duì)你有幫助,不要忘了一鍵三連哦 ??


          來自:dragonir

          https://segmentfault.com/a/1190000041363089

          最后

          歡迎關(guān)注【前端瓶子君】??ヽ(°▽°)ノ?
          回復(fù)「算法」,加入前端編程源碼算法群,每日一道面試題(工作日),第二天瓶子君都會(huì)很認(rèn)真的解答喲!
          回復(fù)「交流」,吹吹水、聊聊技術(shù)、吐吐槽!
          回復(fù)「閱讀」,每日刷刷高質(zhì)量好文!
          如果這篇文章對(duì)你有幫助,在看」是最大的支持
           》》面試官也在看的算法資料《《
          “在看和轉(zhuǎn)發(fā)”就是最大的支持
          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲第一夜综合 | 青青草成人在线免费观看视频 | 亚洲国产精品福利一区 | 在线看片aaa | 成人黄在线 |