日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在Unity中实现基于粒子的水模拟

發布時間:2024/1/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Unity中实现基于粒子的水模拟 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

曲面細分進行水模擬(一:物理模擬)


文章目錄

  • 曲面細分進行水模擬(一:物理模擬)
  • 前言
  • 一、曲線模擬的原理介紹
  • 二、代碼計算終點
    • 1.代碼原理介紹
    • 2.第一條射線計算
    • 3.第二條射線計算
    • 4. 分配數據準備
    • 5. 傳遞數據
    • 6. 總代碼
  • 總結


前言

之前花費了不少時間編寫了一套通過GPU進行粒子系統的模擬,效率很不錯,因此覺得只用來制作霧效太浪費了,于是打算再多實現點什么東西。正好這篇文章的液體成色的原理給了我啟發,于是打算添加一點簡單的水槍效果模擬,沒有很真實的物理效果,只是使用射線獲取落點然后數據進行貝塞爾曲線擬合。并非是真正的液體模擬,只是制作一個簡單的水槍效果,但是好處是效率高,能夠在游戲中用的上。(至少在我的項目是用的上的,畢竟只是學校的小項目)

效果請看視頻

Unity粒子系統液體模擬

由于這次的模擬效果涉及的內容過多,因此我打算分為幾篇文章來寫,這是第一篇,使用代碼進行一些預運算,準備數據傳遞給材質進行模擬。


一、曲線模擬的原理介紹

由于Unity并不存在曲線檢測,我們不能真正的進行曲線的碰撞檢測(印象中射線檢測算法確實只有直線的檢測,畢竟是包圍盒切割,曲線的話包圍盒都不好確定了),但是我們可以首先通過公式算出終點,然后從起點到終點射一條射線,碰撞到的點就是曲線的終點,這樣確實不是真實效果,但是對于簡單的模擬還是足夠的。
看圖理解:


光看圖可能會覺得有遮擋和沒遮擋差距很大,但由于只是曲線的終點有一定的差距,只要射線距離不要太大,看起來也不會有很大的問題。

當然,一條射線只能確定上方會不會碰撞到物體,水是會下落的,因此我們要確定下面有沒有物體。完整流程如下:

當然,實際效果可比我手畫的好多了,因為是一個貝塞爾曲線,至少曲線的效果還是有的,只是這是射線檢測,不能判斷到曲線過程中會射中的點,因此可能會在曲線中依舊會有穿模現象,不過只要射線大小不要太大,穿模是不會經常出現的。

二、代碼計算終點

1.代碼原理介紹

根據原理我們發現至少要有2條射線,但是實際上由于水槍的出發點不可能正好在地面上,因此需要知道地面的高度,因此在最壞的情況下我們需要發出三條射線,如果沒有遮擋,這就是正常情況,因此為了這個物理模擬,確實有一點奢侈。

在第一條射線中,目標是確定是否有上方遮擋物,因此可以直接根據計算出來的終點往上射,看看是否有碰撞到的點。不過第一條射線可以舍去,比如當初始方向朝下時,不可能向上飛,因此可以直接舍去第一條射線,直接從第二條射線開始計算,此時起始點就是自身的坐標。

第二條射線就是進行下降的計算,需要注意的時由于我是默認地面是水平的,沒有明顯的起伏,高度一直都是和獲取到的地面高度一致,如果不一致的話由于射線是一條直線,下落曲線就會被拉的很長,曲線效果可能會有一定的影響,同時時間直接按照我的寫法也會有一定的出入,但是時間方面只要在經過一次計算就可以解決,主要問題還是曲線。

第三條射線是為第二條射線的地面位置做準備,為了能夠確定第二條射線的落點,需要預先獲取地面位置,因此需要一條射線直接向下射,獲取到地面的Y軸,根據這個進行落點計算。

2.第一條射線計算

代碼如下(示例):

//用模型的前方作為我們的水槍起始方向,rayDis是射線強度, //upDir 計算出來的就是液體的速度 Vector3 upDir = transform.forward * rayDis; Vector3 upPos = transform.position; Vector3 veTemp = Vector3.zero; float upTime = 0;//向上時執行上拋,否則直接向下確定位置 if (transform.forward.y >= 0) {//本質上下面幾行代碼就是一個自由落體,獲取到最大高度upTime = upDir.y / 9.8f;upDir.y = 0;//確定高度位置upPos.y += 0.5f * 9.8f * upTime * upTime;//確定最后終點upPos += upDir * upTime;//確定距離差veTemp = upPos - transform.position;//第一條線射中目標,檢查是否上方有東西阻擋if (Physics.Raycast(transform.position, veTemp, out raycastHit, veTemp.magnitude, layer)){//第一條射線射中數據傳遞的方法,后面介紹OneRayHit(raycastHit, raycastHit.distance, upTime);Debug.DrawLine(transform.position, raycastHit.point, Color.red);return;} }

3.第二條射線計算

第二條射線需要預先準備地面高度,因此首先發射一條射線到地面。

//默認底部高度 float buttonY = transform.position.y - 1;if (Physics.Raycast(transform.position, Vector3.down, out raycastHit, layer)) {buttonY = raycastHit.point.y; }

確定了高度后就可以檢查第二個落點了。

float s = upPos.y - buttonY;//就是簡單的解方程,指導s和v計算t的方程 //這里計算只用到了Y值,根據的是Y值差確定時間 float downTime = Mathf.Sqrt(2 * (0.5f * 9.8f * Mathf.Pow(upDir.y / 9.8f, 2) + s) / 9.8f) - Mathf.Abs(upDir.y) / 9.8f; upDir.y = 0; Vector3 downPos = downTime * upDir + transform.position; downPos.y = buttonY;//第二條射線默認無限距離,往盡頭射,因為終點很可能不在同一高度 if (Physics.Raycast(upPos, downPos - upPos, out raycastHit, layer)) {//第二條射線碰撞到物體的情況,要有好的物理模擬效果,//需要再進行一次時間計算,因為還有開方,計算量大,我舍去了TwoRayHit(raycastHit, upPos, veTemp.sqrMagnitude, transform.forward, downTime + upTime);Debug.DrawLine(upPos, raycastHit.point, Color.black);return; }//第二條也沒有中,就在空中結束 //賦值默認碰撞點 raycastHit.point = downPos; raycastHit.normal = Vector3.up; TwoRayHit(raycastHit, upPos, veTemp.sqrMagnitude, transform.forward, downTime + upTime);Debug.DrawLine(upPos, raycastHit.point, Color.white);

有了碰撞點后就需要將數據傳遞給材質進行著色了,為了有足夠好的物理模擬效果,我們需要保證值之間能夠獨立,不受其他值影響,因此直接設置材質的變量是一定不行的。
要設置獨立存在的數據最好的位置是什么,自然是模型的頂點數據啊,uv、normal、tangent、color都能作為我們的數據傳遞位置,數據之間也不會相互影響。

首先我們需要確定要傳遞什么數據,首先,起始點和終點是一定需要的,為了有液體射出去的效果,我們需要存儲時間,為了能夠擬合出貝塞爾曲線,需要存儲兩個射線的中間位置,為了保證粒子系統效果的生成,需要有固定不變的定值,因此模型空間不能變。所以數據分配結果如下:

  • 首先頂點數據依舊用來存儲隨機數,這個數據是固定不變的, 第一條射線的起點存儲在uv0和uv1(x)中,即begin=(uv0.xy, uv1.x)

  • 第一條射線的貝塞爾曲線 中點 存儲在uv1(y)和uv2中,其中center=(uv2.xy, uv1.y)

  • 第一條射線的終點[也是第二條射線的起點]在uv3和uv4(x)中,即end=(uv3.xy, uv4.x)

  • 第二條射線的貝塞爾曲線中點存儲在uv4(y)和uv5中,其中center=(uv5.xy, uv4.y)

  • 第二條射線的終點存儲在tangent中,其中end=(tangent.xyz) 射線的最終點的法線存儲在normal中,就是normal = normal

  • 這個點的結束時間存儲在tangent.w中,這個也是刷新的根據時間,確定該粒子是否可用

  • color存儲了這批點的射中類型,x為1時就是第一條射線射中,y為1就是第二條射線射中

  • 為了物理模擬,移動時間設在uv6的x中,保證這個模液體移動時間是可變的

4. 分配數據準備

要保證數據能夠正常分配,因此需要代碼生成頂點,由于粒子效果的模擬時會涉及曲面細分,如果一個面的數據差距很大時,很可能導致有一些粒子值差距很大,導致一閃一閃的效果,因此建議使用一次賦值一個三角面。

因此頂點生成算法很簡單,根據設置的頂點數量生成頂點,這些頂點看起來都是一個三角面。

代碼如下

/// <summary> /// 用來初始化這個生成的頂點,為了畫出較好的貝塞爾曲線, /// 且保證每一邊都是貝塞爾曲線,打算將三個點的數據傳入其中 /// 首先頂點數據依舊用來存儲隨機數,這個數據是固定不變的, /// 第一條射線的起點存儲在uv0和uv1(x)中,即begin=(uv0.xy, uv1.x) /// 第一條射線的貝塞爾曲線 中點 存儲在uv1(y)和uv2中,其中center=(uv2.xy, uv1.y) /// 第一條射線的終點[也是第二條射線的起點]在uv3和uv4(x)中,即end=(uv3.xy, uv4.x) /// 第二條射線的貝塞爾曲線 中點 存儲在uv4(y)和uv5中,其中center=(uv5.xy, uv4.y) /// 第二條射線的終點存儲在tangent中,其中end=(tangent.xyz) /// 射線的最終點的法線存儲在normal中,就是normal = normal /// 這個點的結束時間存儲在tangent.w中,這個也是刷新的根據時間 /// color存儲了這批點的射中類型,x為1時就是第一條射線射中,y為1就是第二條射線射中 /// 為了物理模擬,移動時間設在uv6的x中 /// </summary> private void AddMesh() {//表示沒有開始循環circulatePos = 0;particleSize -= particleSize % 3;poss = new Vector3[particleSize];tris = new int[particleSize];tangents = new Vector4[particleSize];normals = new Vector3[particleSize];uv0 = new Vector2[particleSize]; //Texcoord0uv1 = new Vector2[particleSize]; //Texcoord1uv2 = new Vector2[particleSize]; //Texcoord2uv3 = new Vector2[particleSize]; //Texcoord3uv4 = new Vector2[particleSize]; //Texcoord4uv5 = new Vector2[particleSize]; //Texcoord5uv6 = new Vector2[particleSize]; //Texcoord6colors = new Color[particleSize];//三個三個的加for (int i = 0; i < particleSize; i += 3){poss[i] = new Vector3(0, 0, 0);poss[i + 1] = new Vector3(0, 0, 1);poss[i + 2] = new Vector3(1, 0, 0);tris[i] = i;tris[i + 1] = i + 1;tris[i + 2] = i + 2;//設置結束時間為負數,讓Shader知道這個屬性沒有在使用中,//因為只有當前時間在終止時間和終止時間減存活時間之間才會開始運行tangents[i] = new Vector4(0, 0, 0, -100);tangents[i + 1] = new Vector4(0, 0, 0, -100);tangents[i + 2] = new Vector4(0, 0, 0, -100);normals[i] = Vector3.zero;normals[i + 1] = Vector3.zero;normals[i + 2] = Vector3.zero;uv0[i] = Vector2.zero;uv0[i + 1] = Vector2.zero;uv0[i + 2] = Vector2.zero;uv1[i + 2] = Vector2.zero;uv1[i + 2] = Vector2.zero;uv1[i + 2] = Vector2.zero;uv2[i] = Vector2.zero;uv2[i + 1] = Vector2.zero;uv2[i + 2] = Vector2.zero;uv3[i] = Vector2.zero;uv3[i + 1] = Vector2.zero;uv3[i + 2] = Vector2.zero;uv4[i] = Vector2.zero;uv4[i + 1] = Vector2.zero;uv4[i + 2] = Vector2.zero;uv5[i] = Vector2.zero;uv5[i + 1] = Vector2.zero;uv5[i + 2] = Vector2.zero;uv6[i] = Vector2.zero;uv6[i + 1] = Vector2.zero;uv6[i + 2] = Vector2.zero;colors[i] = Color.black;colors[i + 1] = Color.black;colors[i + 2] = Color.black;}mesh = new Mesh();mesh.vertices = poss;mesh.triangles = tris;mesh.tangents = tangents;mesh.uv = uv0;mesh.uv2 = uv1;mesh.uv3 = uv2;mesh.uv4 = uv3;mesh.uv5 = uv4;mesh.uv6 = uv5;mesh.uv7 = uv6;mesh.normals = normals;mesh.colors = colors;meshFilter.mesh = mesh;}

5. 傳遞數據

首先是第一個射線射中的數據傳遞方式

/// <summary> /// 第一條射線射中目標 /// </summary> /// <param name="raycastHit">射中點數據</param> /// <param name="dis">理論上的最大距離,也就是本來這條線的長度</param> /// <param name="sqrTrue">中間射中了東西,所以確定實際長度</param> private void OneRayHit(RaycastHit raycastHit, float dis, float moveTime) {SetOneRayPoint(raycastHit, dis, moveTime, circulatePos);SetOneRayPoint(raycastHit, dis, moveTime, circulatePos + 1);SetOneRayPoint(raycastHit, dis, moveTime, circulatePos + 2);meshFilter.sharedMesh.SetTangents(tangents);meshFilter.sharedMesh.SetColors(colors);meshFilter.sharedMesh.SetUVs(0, uv0);meshFilter.sharedMesh.SetUVs(1, uv1);meshFilter.sharedMesh.SetUVs(2, uv2);meshFilter.sharedMesh.SetUVs(3, uv3);meshFilter.sharedMesh.SetUVs(4, uv4);meshFilter.sharedMesh.SetUVs(6, uv6);meshFilter.sharedMesh.SetNormals(normals);circulatePos += 3; }private void SetOneRayPoint(RaycastHit raycastHit, float dis, float moveTime, int index) {//表示這個粒子正在使用中tangents[index].w = Time.time + moveTime + outTime + offsetTime;//第一條射線射中colors[index] = new Color(1, 0, 0, 1);//設置起始位置SetPos(ref uv0[index], transform.position);uv1[index].x = transform.position.z;//設置第一條貝塞爾曲線中點Vector3 dir = transform.forward * dis * 0.5f + transform.position;SetPos(ref uv2[index], dir);uv1[index].y = dir.z;//第一條線的終點SetPos(ref uv3[index], raycastHit.point);uv4[index].x = raycastHit.point.z;//射中的法線normals[index] = raycastHit.normal;//設置粒子移動時間uv6[index].x = moveTime; }

第二個點射中,或者壓根就沒射中

/// <summary> /// 第二條射線射中的情況 /// </summary> /// <param name="raycastHit">射線射中點信息</param> /// <param name="upPos">第一條射線的終點</param> /// <param name="firstSqrMax">第一條射線長度的平方</param> /// <param name="fowardDir">第二條射線開始的方向,設為參數是為了考慮看向下方的情況</param> private void TwoRayHit(RaycastHit raycastHit, Vector3 upPos, float dis, Vector3 fowardDir, float moveTime) {SetTwoRayPoint(raycastHit, upPos, dis, fowardDir, moveTime, circulatePos);SetTwoRayPoint(raycastHit, upPos, dis, fowardDir, moveTime, circulatePos + 1);SetTwoRayPoint(raycastHit, upPos, dis, fowardDir, moveTime, circulatePos + 2);circulatePos += 3;mesh.SetColors(colors);mesh.SetUVs(0, uv0);mesh.SetUVs(1, uv1);mesh.SetUVs(2, uv2);mesh.SetUVs(3, uv3);mesh.SetUVs(4, uv4);mesh.SetUVs(5, uv5);mesh.SetUVs(6, uv6);mesh.SetTangents(tangents);mesh.SetNormals(normals); }private void SetTwoRayPoint(RaycastHit raycastHit, Vector3 upPos, float dis, Vector3 fowardDir, float moveTime, int index) {//表示這個粒子正在使用中tangents[index].w = Time.time + moveTime + outTime + offsetTime;colors[index] = new Color(0f, 1f, 0f, 1f);//設置起始位置SetPos(ref uv0[index], transform.position);uv1[index].x = transform.position.z;//設置第一條射線中間位置Vector3 dir = transform.forward * dis * 0.5f + transform.position;SetPos(ref uv2[index], dir);uv1[index].y = dir.z;//設置第一條線的終點SetPos(ref uv3[index], upPos);uv4[index].x = upPos.z;//設置第二條線的中間位置,注意,為了方便,這個點的賦值方式有點特別fowardDir *= (raycastHit.point - upPos).magnitude * 0.5f;fowardDir += upPos;SetPos(ref uv5[index], fowardDir);uv4[index].y = fowardDir.z;//設置第二條線終點SetPos(ref tangents[index], raycastHit.point);//設置射中點的法線normals[index] = raycastHit.normal;//設置粒子移動時間uv6[index].x = moveTime;}

6. 總代碼

using UnityEngine;namespace Common.ParticleSystem {/// <summary>/// 水模擬粒子系統控制器,需要時時刷新數據,生成頂點/// </summary>public class ParticleWater : MonoBehaviour{private MeshFilter meshFilter;public Material setMat;/// <summary> /// 循環到的位置 /// </summary>public int circulatePos;/// <summary> /// 粒子輸出花費時間 /// </summary>public float outTime = 0.3f;/// <summary> /// 粒子到達后開始偏移的損耗時間 /// </summary>public float offsetTime = 2f;/// <summary> /// 粒子數量,用來一開始創建 /// </summary>public int particleSize = 300;public float rayDis = 10;public LayerMask layer;#region CurveDate//移動大小曲線public bool isOpenMoveSizeCurve = false;public AnimationCurve moveSizeCurve = AnimationCurve.Linear(0,0,1,1);//偏移大小曲線public bool isOpenOffsetSizeCurve = false;public AnimationCurve offsetSizeCurve = AnimationCurve.Linear(0, 0, 1, 1);//透明曲線,因為透明都在片原著色器使用,因此設置一個就夠了public bool isOpenAlphaCurve = false;public AnimationCurve offsetAlphaCurve = AnimationCurve.Linear(0, 1, 1, 0);//移動透明曲線public AnimationCurve moveAlphaCurve = AnimationCurve.Linear(0, 0, 1, 1);#endregion#region MeshDate //Mesh數據設置位置,因為MeshFilter中的mesh設置沒有效果,只能將Mesh//提出來然后每次設置為后賦值了private Mesh mesh;private Vector3[] poss;private int[] tris;private Vector4[] tangents;private Vector3[] normals;private Vector2[] uv0;private Vector2[] uv1;private Vector2[] uv2;private Vector2[] uv3;private Vector2[] uv4;private Vector2[] uv5;private Vector2[] uv6;private Color[] colors;#endregionprivate void Start(){meshFilter = GetComponent<MeshFilter>();if(meshFilter == null)meshFilter = gameObject.AddComponent<MeshFilter>();else{meshFilter.sharedMesh.Clear();meshFilter.sharedMesh = null;}AddMesh();SetMatValue();}private void OnValidate(){SetMatValue();}private void SetMatValue(){if (setMat == null) return;setMat.SetFloat("_OutTime", outTime);setMat.SetFloat("_OffsetTime", offsetTime);Vector4[] vector4;//設置移動大小vector4 = new Vector4[moveSizeCurve.length];for (int i = 0; i < moveSizeCurve.length; i++){vector4[i] = new Vector4(moveSizeCurve.keys[i].time, moveSizeCurve.keys[i].value,moveSizeCurve.keys[i].inTangent, moveSizeCurve.keys[i].outTangent);}if (isOpenMoveSizeCurve) setMat.EnableKeyword("_MOVE_SIZE");else setMat.DisableKeyword("_MOVE_SIZE");setMat.SetInt("_MoveSizePointCount", moveSizeCurve.length);setMat.SetVectorArray("_MoveSizePointArray", vector4);//設置透明if (isOpenAlphaCurve) setMat.EnableKeyword("_ALPHA");else setMat.DisableKeyword("_ALPHA");//移動透明vector4 = new Vector4[moveAlphaCurve.length];for (int i = 0; i < moveAlphaCurve.length; i++){vector4[i] = new Vector4(moveAlphaCurve.keys[i].time, moveAlphaCurve.keys[i].value,moveAlphaCurve.keys[i].inTangent, moveAlphaCurve.keys[i].outTangent);}setMat.SetInt("_MoveAlphaPointCount", moveAlphaCurve.length);setMat.SetVectorArray("_MoveAlphaPointArray", vector4);//偏移透明vector4 = new Vector4[offsetAlphaCurve.length];for (int i = 0; i < offsetAlphaCurve.length; i++){vector4[i] = new Vector4(offsetAlphaCurve.keys[i].time, offsetAlphaCurve.keys[i].value,offsetAlphaCurve.keys[i].inTangent, offsetAlphaCurve.keys[i].outTangent);}setMat.SetInt("_OffsetAlphaPointCount", offsetAlphaCurve.length);setMat.SetVectorArray("_OffsetAlphaPointArray", vector4);//設置大小vector4 = new Vector4[offsetSizeCurve.length];for (int i = 0; i < offsetSizeCurve.length; i++){vector4[i] = new Vector4(offsetSizeCurve.keys[i].time, offsetSizeCurve.keys[i].value,offsetSizeCurve.keys[i].inTangent, offsetSizeCurve.keys[i].outTangent);}if (isOpenOffsetSizeCurve)setMat.EnableKeyword("_OFFSET_SIZE");else setMat.DisableKeyword("_OFFSET_SIZE");setMat.SetInt("_OffsetSizePointCount", offsetSizeCurve.length);setMat.SetVectorArray("_OffsetSizePointArray", vector4);//設置位置setMat.SetVector("_BeginPos", transform.position);}/// <summary>/// 用來存儲是否射線/// </summary>bool desireRay;public void RayWater(){desireRay = true;}private void FixedUpdate(){//if (!desireRay) return;//else desireRay = false;circulatePos %= particleSize;//檢查粒子是否可以使用,因為所有粒子是順序執行的,不能用就直接退出int i = 0;for (; i<particleSize; i+=3){//可以使用,進行操作if (meshFilter.sharedMesh.tangents[(circulatePos + i)%particleSize].w < Time.time){circulatePos = circulatePos + i;break;}}if (i >= particleSize) return;RaycastHit raycastHit;Vector3 upDir = transform.forward * rayDis;Vector3 upPos = transform.position;Vector3 veTemp = Vector3.zero;float upTime = 0;//向上時執行上拋,否則直接向下確定位置if (transform.forward.y >= 0){upTime = upDir.y / 9.8f;//確定第一條射線數據upDir.y = 0;upPos.y += 0.5f * 9.8f * upTime * upTime;upPos += upDir * upTime;veTemp = upPos - transform.position;//第一條線射中目標,檢查是否上方有東西阻擋if (Physics.Raycast(transform.position, veTemp, out raycastHit, veTemp.magnitude, layer)){OneRayHit(raycastHit, raycastHit.distance, upTime);Debug.DrawLine(transform.position, raycastHit.point, Color.red);return;}}//默認底部高度float buttonY = transform.position.y - 1;if (Physics.Raycast(transform.position, Vector3.down, out raycastHit, layer)){buttonY = raycastHit.point.y;}float s = upPos.y - buttonY;float downTime = Mathf.Sqrt(2 * (0.5f * 9.8f * Mathf.Pow(upDir.y / 9.8f, 2) + s) / 9.8f) - Mathf.Abs(upDir.y) / 9.8f;upDir.y = 0;Vector3 downPos = downTime * upDir + transform.position;downPos.y = buttonY;//第二條射線默認無限距離,往盡頭射if (Physics.Raycast(upPos, downPos - upPos, out raycastHit, layer)){TwoRayHit(raycastHit, upPos, veTemp.magnitude, transform.forward, downTime + upTime);Debug.DrawLine(upPos, raycastHit.point, Color.black);return;}//第二條也沒有中,就在空中結束吧raycastHit.point = downPos;raycastHit.normal = Vector3.up;TwoRayHit(raycastHit, upPos, veTemp.magnitude, transform.forward, downTime + upTime);Debug.DrawLine(upPos, raycastHit.point, Color.white);}/// <summary>/// 第一條射線射中目標/// </summary>/// <param name="raycastHit">射中點數據</param>/// <param name="dis">理論上的最大距離,也就是本來這條線的長度</param>/// <param name="sqrTrue">中間射中了東西,所以確定實際長度</param>private void OneRayHit(RaycastHit raycastHit, float dis, float moveTime){SetOneRayPoint(raycastHit, dis, moveTime, circulatePos);SetOneRayPoint(raycastHit, dis, moveTime, circulatePos + 1);SetOneRayPoint(raycastHit, dis, moveTime, circulatePos + 2);meshFilter.sharedMesh.SetTangents(tangents);meshFilter.sharedMesh.SetColors(colors);meshFilter.sharedMesh.SetUVs(0, uv0);meshFilter.sharedMesh.SetUVs(1, uv1);meshFilter.sharedMesh.SetUVs(2, uv2);meshFilter.sharedMesh.SetUVs(3, uv3);meshFilter.sharedMesh.SetUVs(4, uv4);meshFilter.sharedMesh.SetUVs(6, uv6);meshFilter.sharedMesh.SetNormals(normals);circulatePos += 3;}private void SetOneRayPoint(RaycastHit raycastHit, float dis, float moveTime, int index){//表示這個粒子正在使用中tangents[index].w = Time.time + moveTime + outTime + offsetTime;//第一條射線射中colors[index] = new Color(1, 0, 0, 1);//設置起始位置SetPos(ref uv0[index], transform.position);uv1[index].x = transform.position.z;//設置第一條貝塞爾曲線中點Vector3 dir = transform.forward * dis * 0.5f + transform.position;SetPos(ref uv2[index], dir);uv1[index].y = dir.z;//第一條線的終點SetPos(ref uv3[index], raycastHit.point);uv4[index].x = raycastHit.point.z;//射中的法線normals[index] = raycastHit.normal;//設置粒子移動時間uv6[index].x = moveTime;}/// <summary>/// 第二條射線射中的情況/// </summary>/// <param name="raycastHit">射線射中點信息</param>/// <param name="upPos">第一條射線的終點</param>/// <param name="firstSqrMax">第一條射線長度的平方</param>/// <param name="fowardDir">第二條射線開始的方向,設為參數是為了考慮看向下方的情況</param>private void TwoRayHit(RaycastHit raycastHit, Vector3 upPos, float dis, Vector3 fowardDir, float moveTime){SetTwoRayPoint(raycastHit, upPos, dis, fowardDir, moveTime, circulatePos);SetTwoRayPoint(raycastHit, upPos, dis, fowardDir, moveTime, circulatePos + 1);SetTwoRayPoint(raycastHit, upPos, dis, fowardDir, moveTime, circulatePos + 2);circulatePos += 3;mesh.SetColors(colors);mesh.SetUVs(0, uv0);mesh.SetUVs(1, uv1);mesh.SetUVs(2, uv2);mesh.SetUVs(3, uv3);mesh.SetUVs(4, uv4);mesh.SetUVs(5, uv5);mesh.SetUVs(6, uv6);mesh.SetTangents(tangents);mesh.SetNormals(normals);}private void SetTwoRayPoint(RaycastHit raycastHit, Vector3 upPos, float dis, Vector3 fowardDir, float moveTime, int index){//表示這個粒子正在使用中tangents[index].w = Time.time + moveTime + outTime + offsetTime;colors[index] = new Color(0f, 1f, 0f, 1f);//設置起始位置SetPos(ref uv0[index], transform.position);uv1[index].x = transform.position.z;//設置第一條射線中間位置Vector3 dir = transform.forward * dis * 0.5f + transform.position;SetPos(ref uv2[index], dir);uv1[index].y = dir.z;//設置第一條線的終點SetPos(ref uv3[index], upPos);uv4[index].x = upPos.z;//設置第二條線的中間位置,注意,為了方便,這個點的賦值方式有點特別fowardDir *= (raycastHit.point - upPos).magnitude * 0.5f;fowardDir += upPos;SetPos(ref uv5[index], fowardDir);uv4[index].y = fowardDir.z;//設置第二條線終點SetPos(ref tangents[index], raycastHit.point);//設置射中點的法線normals[index] = raycastHit.normal;//設置粒子移動時間uv6[index].x = moveTime;}/// <summary> /// 將第二個參數的xyz值賦予第一個參數的xyz中,簡化上面的函數 /// </summary>private void SetPos(ref Vector4 vector, Vector3 vector3){vector.x = vector3.x;vector.y = vector3.y;vector.z = vector3.z;}/// <summary> /// 將第二個參數的xyz值賦予第一個參數的xyz中,簡化上面的函數 /// </summary>private void SetPos(ref Vector2 vector, Vector3 vector3){vector.x = vector3.x;vector.y = vector3.y;}/// <summary>/// 用來初始化這個生成的頂點,為了畫出較好的貝塞爾曲線,/// 且保證每一邊都是貝塞爾曲線,打算將三個點的數據傳入其中/// 首先頂點數據依舊用來存儲隨機數,這個數據是固定不變的,/// 第一條射線的起點存儲在uv0和uv1(x)中,即begin=(uv0.xy, uv1.x)/// 第一條射線的貝塞爾曲線 中點 存儲在uv1(y)和uv2中,其中center=(uv2.xy, uv1.y)/// 第一條射線的終點[也是第二條射線的起點]在uv3和uv4(x)中,即end=(uv3.xy, uv4.x)/// 第二條射線的貝塞爾曲線 中點 存儲在uv4(y)和uv5中,其中center=(uv5.xy, uv4.y)/// 第二條射線的終點存儲在tangent中,其中end=(tangent.xyz)/// 射線的最終點的法線存儲在normal中,就是normal = normal/// 這個點的結束時間存儲在tangent.w中,這個也是刷新的根據時間/// color存儲了這批點的射中類型,x為1時就是第一條射線射中,y為1就是第二條射線射中/// 為了物理模擬,移動時間設在uv6的x中/// </summary>private void AddMesh(){//表示沒有開始循環circulatePos = 0;particleSize -= particleSize % 3;poss = new Vector3[particleSize];tris = new int[particleSize];tangents = new Vector4[particleSize];normals = new Vector3[particleSize];uv0 = new Vector2[particleSize]; //Texcoord0uv1 = new Vector2[particleSize]; //Texcoord1uv2 = new Vector2[particleSize]; //Texcoord2uv3 = new Vector2[particleSize]; //Texcoord3uv4 = new Vector2[particleSize]; //Texcoord4uv5 = new Vector2[particleSize]; //Texcoord5uv6 = new Vector2[particleSize]; //Texcoord6colors = new Color[particleSize];//三個三個的加for (int i = 0; i < particleSize; i += 3){poss[i] = new Vector3(0, 0, 0);poss[i + 1] = new Vector3(0, 0, 1);poss[i + 2] = new Vector3(1, 0, 0);tris[i] = i;tris[i + 1] = i + 1;tris[i + 2] = i + 2;//設置結束時間為負數,讓Shader知道這個屬性沒有在使用中,//因為只有當前時間在終止時間和終止時間減存活時間之間才會開始運行tangents[i] = new Vector4(0, 0, 0, -100);tangents[i + 1] = new Vector4(0, 0, 0, -100);tangents[i + 2] = new Vector4(0, 0, 0, -100);normals[i] = Vector3.zero;normals[i + 1] = Vector3.zero;normals[i + 2] = Vector3.zero;uv0[i] = Vector2.zero;uv0[i + 1] = Vector2.zero;uv0[i + 2] = Vector2.zero;uv1[i + 2] = Vector2.zero;uv1[i + 2] = Vector2.zero;uv1[i + 2] = Vector2.zero;uv2[i] = Vector2.zero;uv2[i + 1] = Vector2.zero;uv2[i + 2] = Vector2.zero;uv3[i] = Vector2.zero;uv3[i + 1] = Vector2.zero;uv3[i + 2] = Vector2.zero;uv4[i] = Vector2.zero;uv4[i + 1] = Vector2.zero;uv4[i + 2] = Vector2.zero;uv5[i] = Vector2.zero;uv5[i + 1] = Vector2.zero;uv5[i + 2] = Vector2.zero;uv6[i] = Vector2.zero;uv6[i + 1] = Vector2.zero;uv6[i + 2] = Vector2.zero;colors[i] = Color.black;colors[i + 1] = Color.black;colors[i + 2] = Color.black;}mesh = new Mesh();mesh.vertices = poss;mesh.triangles = tris;mesh.tangents = tangents;mesh.uv = uv0;mesh.uv2 = uv1;mesh.uv3 = uv2;mesh.uv4 = uv3;mesh.uv5 = uv4;mesh.uv6 = uv5;mesh.uv7 = uv6;mesh.normals = normals;mesh.colors = colors;meshFilter.mesh = mesh;}} }

傳遞完數據后就到Shader的模擬階段了,估計要過一段時間才能寫后面,最近到大作業的時間了,雖然大學課程很水,但是績點太低還是很難看的,所以更新時間估計要延遲一點了。而且項目壓力好大,找隊友真的是個難題,找到些水貨真的心累,整個項目代碼我寫、框架我搭、著色都我寫,明明都是程序員,寫個代碼有這么難嘛,幸虧我有水平,繃得住,還有閑暇時間寫文章。

總結

以上就是這篇文章的全部內容,這篇文章只是起始部分,在之后的著色部分才是大頭,畢竟要一整套流程搞下來還是內容挺多的,這里只是最簡單的數據傳遞部分而已。
實際上這里的數據傳遞還有可以優化的部分,因為直接使用Set來傳遞頂點數據的話是替換,從效率來看的話是很慢的,畢竟我們實際上只是改變部分值,卻替換了整一個數組對象,因為C#和unity底層有區別,本質上模型存儲的數據應該不是代碼中控制的數組數據,因此在替換時會進行數據檢測、替換等階段,效率很低。
在看unity官方文檔時看到流操作傳遞數據,既然是流,那一定很快啊,但是官方文檔的操作寫的好隨便,網上也沒有找到資料是最令我震驚的,如果有人知道請在下面評論區解答一下,畢竟能優化是最好的。

總結

以上是生活随笔為你收集整理的在Unity中实现基于粒子的水模拟的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

一区二区三区四区五区六区 | 99久久精品国产亚洲 | 亚洲精品国内 | 97超级碰碰碰碰久久久久 | 午夜电影 电影 | 久久99久国产精品黄毛片入口 | 国产一区在线看 | 国产小视频免费在线网址 | 韩国精品在线 | 欧洲视频一区 | 水蜜桃亚洲一二三四在线 | 少妇bbw搡bbbb搡bbbb | 久久久久久久久亚洲精品 | 天天综合中文 | a级免费观看 | 九九免费在线视频 | 国产亚洲免费观看 | 国产精品青草综合久久久久99 | 激情综合五月天 | 日韩网站在线免费观看 | 国产无套一区二区三区久久 | 在线视频久久 | 热99在线视频 | av片在线看 | 日韩欧美视频免费在线观看 | 国产精品一区二区三区免费视频 | 亚洲一区二区三区精品在线观看 | 欧美日韩视频在线 | 免费在线观看成人小视频 | 久久成人综合 | 日本高清免费中文字幕 | 亚洲精品五月天 | 女人18毛片a级毛片一区二区 | 日韩美女久久 | 狠狠做深爱婷婷综合一区 | 免费a级黄色毛片 | 91一区二区三区久久久久国产乱 | 一区二区三区免费在线观看视频 | 成人免费在线观看av | 国产精品永久久久久久久久久 | 日韩欧美视频在线观看免费 | 在线国产一区 | 国产精品成人久久久久 | 亚洲精品免费在线视频 | 亚洲毛片久久 | 成年美女黄网站色大片免费看 | 精品国产一区在线观看 | 成人一级在线 | 99re久久资源最新地址 | 中文字幕在线播放第一页 | 涩涩网站在线观看 | 日日夜夜免费精品视频 | 玖玖视频网 | 五月婷婷操 | 日韩精品视频在线观看免费 | 日韩欧美一区视频 | 超碰国产在线 | 91精品视频在线 | 美女国产在线 | 久久久久久久久免费视频 | 91视频在线免费下载 | 婷婷国产在线观看 | 最新国产在线观看 | 99国内精品久久久久久久 | 国产精品免费不卡 | 国产精品一区二区久久久久 | 久久久久久福利 | 久久久久视| 国产精品午夜久久 | 国产麻豆传媒 | 激情导航 | 国内精品免费 | 久久综合九色综合欧美就去吻 | 黄网站色视频 | 亚洲精品小区久久久久久 | 亚洲婷婷在线视频 | 国产精品一区免费观看 | 亚洲激情在线播放 | 日韩av片免费在线观看 | 亚洲精品一区二区久 | a午夜电影| 午夜91在线 | 毛片一二区 | 国产精品成人一区二区 | 狠狠色丁香久久婷婷综 | 国产免费久久av | 亚洲成人av在线播放 | 夜夜嗨av色一区二区不卡 | 99精品国产亚洲 | 91成年人在线观看 | 91一区二区三区在线观看 | 69国产盗摄一区二区三区五区 | 久久国产精品免费一区 | 99精品国产一区二区三区不卡 | 一区二区三区四区久久 | www91在线观看 | 国产精品一区二区久久 | 日韩免费在线网站 | 黄网站色视频 | 午夜美女wwww | 亚洲男模gay裸体gay | 4438全国亚洲精品在线观看视频 | 草久久久久 | 日韩在线观看中文 | 亚洲在线资源 | 日韩一二三区不卡 | 在线国产视频 | 国产日韩欧美网站 | 天堂v中文| 成人av免费电影 | 国产亚洲综合精品 | 99r精品视频在线观看 | 亚洲精品日韩在线观看 | 欧美特一级片 | 91av视频网站 | 丁香六月婷婷开心婷婷网 | 天天天干 | 91精品在线免费观看 | 中国一区二区视频 | 久久夜色电影 | 久久在线影院 | 亚洲狠狠操 | 久草手机视频 | 99九九视频 | 又黄又爽的免费高潮视频 | 午夜精品久久一牛影视 | 亚洲成av人片在线观看香蕉 | 日本亚洲国产 | 国产成人a v电影 | 视频在线播放国产 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 久久亚洲私人国产精品va | 超碰免费在线公开 | 久久嗨| 国产精品久久久久久久久久妇女 | 国产在线国偷精品产拍 | 成人xxxx| 久久首页 | 天天夜夜狠狠操 | a天堂最新版中文在线地址 久久99久久精品国产 | 久久tv| 日韩久久一区 | 欧美激情精品久久 | 手机av资源 | 亚洲开心激情 | 亚洲性视频 | 五月天激情综合网 | 日韩大片免费在线观看 | 国产精品久久久久久久久久久久久 | 国产精品久久久久久一二三四五 | 少妇bbw搡bbbb搡bbbb | 欧美片一区二区三区 | 久久久免费看视频 | 97天堂| 国内偷拍精品视频 | av在线播放国产 | 日本久久电影 | 岛国av在线免费 | 国产精品成人一区二区 | 亚洲成人999 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 中文在线中文资源 | 在线观看aa | 色国产精品| 综合精品久久 | 久久精品一二三区 | 色综合小说| 久久久久久久av麻豆果冻 | 国产成人区 | 欧美一级视频免费看 | 日本丶国产丶欧美色综合 | 深爱激情五月婷婷 | 在线精品亚洲一区二区 | 成人禁用看黄a在线 | 久久五月婷婷综合 | 久久精品国产v日韩v亚洲 | 久久天天躁夜夜躁狠狠躁2022 | 日精品在线观看 | a在线一区 | 激情五月视频 | 日韩电影在线看 | 国产精品成人一区二区 | 天天干 夜夜操 | 亚洲天堂自拍视频 | 狠狠色丁香久久综合网 | 黄色一级大片在线观看 | 综合五月婷婷 | 瑞典xxxx性hd极品 | 国产视频久 | 狠狠色狠狠色终合网 | 日韩免费小视频 | 久久久国产精品人人片99精片欧美一 | 欧美国产精品久久久久久免费 | 国产三级午夜理伦三级 | 五月婷婷一区 | 亚洲一区二区三区毛片 | 香蕉视频久久 | 一区二区三区三区在线 | 国产黄色免费 | 天天干天天干天天干 | 久久五月天色综合 | 又色又爽的网站 | 日韩欧美高清不卡 | 99精品视频中文字幕 | 欧美日韩久久不卡 | 亚色视频在线观看 | avav片 | 亚洲人成精品久久久久 | 午夜国产福利在线 | 免费激情网 | 日韩视频欧美视频 | 国产 日韩 在线 亚洲 字幕 中文 | 最近免费中文字幕大全高清10 | 国产色婷婷在线 | 婷婷性综合 | 免费裸体视频网 | 欧美有色| 国产成年免费视频 | 久久人人插 | 欧美国产不卡 | 午夜精品久久久久久久99水蜜桃 | 一区二区三区日韩在线 | 中文字幕a∨在线乱码免费看 | 五月天网页| 欧美天堂视频在线 | 国产精品9999 | 高清国产午夜精品久久久久久 | 久久亚洲美女 | 日韩,中文字幕 | 黄色小说网站在线 | 国产精品亚洲综合久久 | 精品9999| 欧美性黑人 | 亚洲日本在线一区 | 99久久99久久精品免费 | 国产欧美在线一区 | 久久视频在线免费观看 | 日韩免费在线一区 | 麻豆视频成人 | 91麻豆精品国产91久久久无需广告 | 亚洲免费视频观看 | 日韩黄色免费看 | 欧美小视频在线 | 日韩视频免费观看高清 | 久久久久久久久久免费 | 啪啪肉肉污av国网站 | 中文字幕电影高清在线观看 | 国产精品免费视频观看 | 99久久9 | 国产在线观看午夜 | 丁香av| 欧美少妇bbwhd | 亚洲精品人人 | 日韩在线精品视频 | 五月天最新网址 | 欧美日韩国内在线 | 麻豆国产在线播放 | 国产视频精品网 | 国产精品一区二区免费看 | 成人免费网视频 | 在线看一区| 三级av免费看 | 免费久久久 | 免费麻豆视频 | 日本韩国欧美在线观看 | 婷婷去俺也去六月色 | 精品1区2区3区| 国产丝袜网站 | 亚洲激精日韩激精欧美精品 | 亚洲精品福利视频 | 欧美一级黄大片 | 亚洲最大av网站 | 国产中文字幕国产 | 日日夜夜狠狠操 | 久久夜色精品国产欧美一区麻豆 | 不卡中文字幕在线 | 手机在线看片日韩 | 成人av电影免费在线播放 | av青草| 久久久久久麻豆 | 国产极品尤物在线 | 亚洲国产视频网站 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 在线播放日韩av | 久久伊99综合婷婷久久伊 | 精品成人免费 | 久久精品99久久久久久2456 | 日日爱影视 | 最近中文字幕大全中文字幕免费 | 99精品久久只有精品 | 成年人在线观看免费视频 | 日本中文字幕视频 | 美女视频黄免费的 | 99色亚洲 | 亚洲专区路线二 | 91麻豆精品国产91久久久久 | 天天看天天干天天操 | 99精品国产一区二区三区麻豆 | 日韩在线视频线视频免费网站 | 亚洲va欧洲va国产va不卡 | 人人看人人草 | 亚洲精品伦理在线 | 激情婷婷在线观看 | 日本黄色大片儿 | 国产精品毛片久久久久久久久久99999999 | 国产福利91精品张津瑜 | 久久久久黄 | 精品亚洲va在线va天堂资源站 | 久草在线视频国产 | 成人在线免费小视频 | 精品女同一区二区三区在线观看 | 五月婷婷中文字幕 | 四虎在线免费观看视频 | 丁香电影小说免费视频观看 | 日韩精品一区二区三区第95 | 日韩成人精品一区二区 | 高清视频一区二区三区 | 骄小bbw搡bbbb揉bbbb | 天天躁日日躁狠狠躁av麻豆 | 亚洲国产高清在线观看视频 | 日夜夜精品视频 | 日韩中文字幕电影 | www.狠狠色 | 国产精品视频免费看 | 国产高清视频免费最新在线 | 国产色道| 精品一区二区免费视频 | 91在线网址 | 日韩电影一区二区三区在线观看 | 午夜精品久久久久久久99无限制 | 国产精品视频地址 | 人人爽人人干 | 日本最大色倩网站www | 中文字幕在线一二 | 国产成人黄色av | 成人在线观看免费视频 | 色婷婷国产在线 | a国产精品 | 91视频大全| 亚洲乱亚洲乱妇 | 国产亚洲视频中文字幕视频 | 在线免费黄色 | 久久久久国产一区二区三区 | 日本在线观看中文字幕无线观看 | 免费成人黄色av | 中文字幕精品www乱入免费视频 | 激情五月婷婷综合 | 视频成人永久免费视频 | 亚洲精品国产综合99久久夜夜嗨 | 91精品一区国产高清在线gif | 婷婷精品国产一区二区三区日韩 | 狠狠色丁香久久婷婷综 | 中文字幕刺激在线 | 免费看三片 | 亚洲精品乱码久久久久久写真 | 操操日日| 午夜视频不卡 | 免费视频久久久 | 成人黄色大片在线免费观看 | 免费合欢视频成人app | 婷婷六月激情 | 欧美夫妻生活视频 | 伊人视频 | 久久久精品国产一区二区电影四季 | 日韩av手机在线观看 | 中文字幕在线免费观看视频 | 国产视频日韩视频欧美视频 | 超碰人人在 | www.亚洲激情.com | 日韩网站在线看片你懂的 | 手机av看片| 久久久久看片 | www.久久视频 | 美女在线观看网站 | 国产成人精品免高潮在线观看 | 成人va在线观看 | 97福利| 天天夜夜亚洲 | 成人国产网址 | 96国产精品| 韩国精品在线观看 | 日本韩国中文字幕 | 久久免费视屏 | 国产在线理论片 | 国产精品免费在线观看视频 | 精品久久一二三区 | 色综合婷婷 | 日韩视频中文字幕 | 天天色天天综合网 | 免费久久久 | 天天综合精品 | 欧美性色综合网站 | 日日爽天天爽 | 国产在线观看二区 | 日韩欧美视频一区 | 久久国产区 | 91人网站 | 欧美久久久久久久久久久久久 | 91久久国产露脸精品国产闺蜜 | 这里有精品在线视频 | 欧美a级片网站 | 色偷偷网站视频 | 99色在线| 狠狠干婷婷色 | 国产成人一区二区三区影院在线 | 日b黄色片 | 亚洲午夜久久久久久久久 | 在线观看一区二区精品 | 91九色视频观看 | 在线观看a视频 | 免费日韩电影 | 又紧又大又爽精品一区二区 | 99视频在线精品国自产拍免费观看 | 99国产情侣在线播放 | 免费在线观看av片 | 在线看v片| 91视频在线免费下载 | 免费高清在线观看成人 | 97成人资源站 | 成人免费视频播放 | 国产男女无遮挡猛进猛出在线观看 | 一级免费看视频 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 美女在线免费观看视频 | 免费黄av| 精品国产乱子伦一区二区 | 久久黄色成人 | www.国产毛片 | 欧美久久久久 | 欧美大片mv免费 | 欧美xxxx性xxxxx高清 | 人人爽人人爽 | 国产精品久久久久久久电影 | 午夜手机看片 | 69国产精品成人在线播放 | 99国产视频在线 | 免费的成人av| 日韩视频中文字幕在线观看 | 人人爽人人爱 | 97国产大学生情侣酒店的特点 | 国产在线欧美 | 91麻豆精品国产自产在线游戏 | 人人玩人人添人人澡超碰 | 国产精品字幕 | 美女黄视频免费看 | 欧美最新另类人妖 | 久久伦理电影网 | 久久久久久激情 | 免费高清无人区完整版 | 久热免费在线观看 | 播五月综合 | 免费日韩在线 | 国产一区二区电影在线观看 | 国产亚洲无 | 久久激情影院 | 成人久久 | 日日日操| 人人干天天射 | 成人在线免费小视频 | 黄色一级性片 | 久久成年人网站 | 日韩激情一二三区 | 在线观看免费av网 | 99色资源 | 在线免费精品视频 | 国产精品久久久久av | 欧美成a人片在线观看久 | 91天堂素人约啪 | 国产午夜精品理论片在线 | 国产区精品在线 | 91精品在线视频观看 | 香蕉视频久久 | 色午夜影院 | 久久久91精品国产一区二区精品 | 国外av在线 | 精品在线你懂的 | 免费黄色在线网址 | 四虎4hu永久免费 | 99精品毛片 | 久久精品看 | 黄色一级大片免费看 | 国产精品av在线免费观看 | 在线导航av | 超碰人人做 | 国产在线中文字幕 | 亚洲在线网址 | 亚洲天堂网视频 | 久久精品中文字幕免费mv | 国产麻豆剧传媒免费观看 | 91在线视频一区 | 97成人超碰 | 五月婷亚洲 | 天天干夜夜干 | 青青河边草免费观看完整版高清 | 久久a v视频| 一区二区不卡高清 | 9999激情 | 黄色毛片视频 | 久久精品国产精品 | 成人丝袜| 成人黄色小说视频 | 欧美日韩不卡在线视频 | 波多野结衣电影一区二区三区 | 久久久免费在线观看 | 久久免费一级片 | 免费久久网站 | 成人av地址 | 亚洲免费av电影 | 久久热亚洲| 久久天天躁 | 黄色精品视频 | 香蕉视频亚洲 | 免费在线观看成年人视频 | 在线a亚洲视频播放在线观看 | 成 人 黄 色 视频播放1 | 成年人免费看片网站 | 亚洲一级片在线观看 | 91天堂影院 | 黄色av成人在线观看 | 国产剧情一区 | 成人一区影院 | 最近能播放的中文字幕 | 亚洲精品视频免费在线 | 国产精品视频免费在线观看 | 91.麻豆视频 | 久久久在线免费观看 | 视频在线观看国产 | 黄色亚洲 | 国内精品久久久久 | 91大神精品视频在线观看 | 天天鲁一鲁摸一摸爽一爽 | 国产精品va在线 | 日韩va欧美va亚洲va久久 | 中文字幕乱码亚洲精品一区 | 国产精品电影一区 | 欧美aa在线 | 亚洲成a人片在线www | 国产伦理久久精品久久久久_ | 国产91大片 | 成人高清av在线 | 久久久天堂 | 中文字幕在线播放日韩 | 一区二区在线电影 | 国产精品专区在线观看 | 日本不卡一区二区 | 干亚洲少妇 | 在线a视频 | 国产淫片免费看 | 亚洲女同videos | 99久久国产免费看 | 五月婷婷综合激情网 | 日韩免费av片| 亚洲精品2区 | 一区二区在线不卡 | 国产精品一区二区av | 国产精品成人一区二区三区 | 日韩视频免费观看高清完整版在线 | 国产精品免费在线视频 | 色综合久久88色综合天天 | 国产黄色在线 | 一区二区观看 | 国产精品高潮呻吟久久久久 | 久久精品视频免费观看 | 亚洲国产中文字幕在线观看 | 亚洲国产成人精品在线观看 | 四虎在线永久免费观看 | 午夜精品久久久久久久久久久 | 国产精品 欧美 日韩 | 国产1区2区3区精品美女 | 久久精品视频4 | 成人91视频 | 超级碰视频 | 国产精品一区在线观看 | 日日躁你夜夜躁你av蜜 | 一区二区影视 | 在线免费观看的av | 91在线区 | 91精品视频网站 | 伊人官网 | 涩涩爱夜夜爱 | 91亚洲精品久久久蜜桃借种 | 日批视频在线观看免费 | 最近中文字幕在线中文高清版 | av天天干 | 婷婷六月在线 | 91系列在线 | 久久久久在线视频 | 国产精品电影一区二区 | 97成人在线观看视频 | 国产亚洲日本 | .精品久久久麻豆国产精品 亚洲va欧美 | 国产视频网站在线观看 | 成人午夜精品久久久久久久3d | 91成年人在线观看 | 久草视频视频在线播放 | 成人黄色在线电影 | 欧美日韩国产综合网 | 99精品在线免费在线观看 | 欧洲一区二区在线观看 | 免费网站在线观看成人 | 久久精选视频 | 欧美日韩久久久 | 亚洲97在线| 特黄特黄的视频 | 91av色| 免费av黄色 | 日日激情 | 日日夜夜噜 | 中文字幕精品一区 | 91亚洲精| 欧美激情综合五月色丁香 | 综合色天天 | 天天干天天干天天干天天干天天干天天干 | 午夜视频黄 | 91黄色免费网站 | av在线短片 | 国产一级在线观看 | 97视频在线免费观看 | 视频一区二区免费 | 亚洲五月激情 | 国产精品黄色av | 成人欧美亚洲 | 日韩欧美高清在线 | 久久午夜影视 | 在线看国产日韩 | 黄色电影在线免费观看 | 日产中文字幕 | 欧美性色19p | 天天综合网 天天 | 99这里只有精品99 | 激情综合久久 | 丁香婷婷色月天 | 黄色免费观看视频 | 国产成人精品午夜在线播放 | 中文字幕一区二区三区四区视频 | 国产 日韩 在线 亚洲 字幕 中文 | 人人澡人人爱 | 亚洲精品网站 | 婷婷久久婷婷 | 91私密视频 | 视频三区 | 色噜噜狠狠狠狠色综合 | 五月天婷亚洲天综合网精品偷 | 久久婷婷久久 | 日韩黄在线观看 | av成人在线电影 | 色婷婷天天干 | 国产又粗又猛又黄又爽的视频 | 国产精品乱看 | 久久久精品网站 | 国产精品久久久久久久久久免费看 | 亚洲欧美综合精品久久成人 | 天天操比 | 久久av电影 | 不卡中文字幕在线 | 丁香花在线观看免费完整版视频 | 五月婷婷一区 | 国产一区二区不卡在线 | 色综合天天狠天天透天天伊人 | 国产一区二区在线视频观看 | 青青久草在线视频 | 精品免费观看视频 | 亚洲一区精品二人人爽久久 | 国内精品亚洲 | 久久久99精品免费观看app | 国产精品久久久区三区天天噜 | 久久综合九色九九 | 不卡电影一区二区三区 | 色.com| 黄色日本免费 | 亚洲精品久久久久中文字幕二区 | 婷婷综合导航 | 国产精品视频永久免费播放 | 国产伦精品一区二区三区无广告 | 婷婷六月中文字幕 | 最新av在线网址 | 国产精华国产精品 | 中文字幕在线免费观看视频 | 成人av网站在线播放 | 美女免费视频观看网站 | 国产伦精品一区二区三区四区视频 | 香蕉视频免费在线播放 | 97在线视频免费观看 | 国产成人精品亚洲 | 国产一级在线观看 | 国产污视频在线观看 | av一级片在线观看 | 国产99久久久国产精品免费看 | 亚洲第一成网站 | 日本在线观看中文字幕 | 亚洲天堂首页 | 久久有精品 | av在线免费观看不卡 | 福利av在线 | 涩涩爱夜夜爱 | 亚在线播放中文视频 | 久久久久欧美精品 | 成人蜜桃 | 少妇bbbb揉bbbb日本 | 亚洲精品国产精品国自产观看 | 视频在线精品 | 伊色综合久久之综合久久 | 中文字幕一区二区三区四区在线视频 | 亚洲永久精品在线观看 | 99精品国产成人一区二区 | 国产一级片视频 | 欧美成人91| 在线免费观看羞羞视频 | 天天插狠狠插 | 精品一区二区久久久久久久网站 | 日本bbbb摸bbbb | 亚洲国产美女精品久久久久∴ | 黄色大片网 | 狠狠操狠狠 | 国产99黄| 久久a免费视频 | 在线97| 色婷婷六月天 | 国产 一区二区三区 在线 | 国产不卡精品 | 日本久热 | 免费日韩一区二区三区 | 在线观看国产亚洲 | av电影在线不卡 | 国产精品美女在线观看 | 久久在线观看 | 日本91在线 | 中文在线字幕观看电影 | adn—256中文在线观看 | 亚洲区精品 | 亚洲男男gaygay无套同网址 | 香蕉视频在线视频 | 色婷婷综合激情 | 久草在线视频看看 | 精品在线二区 | 欧美在线18 | 韩国一区二区三区视频 | 国产精品久久一区二区三区, | 久久精品艹| 国产一区国产二区在线观看 | 亚洲国产欧洲综合997久久, | 欧美成人视 | 久久久久女人精品毛片九一 | 九草视频在线 | 久久兔费看a级 | 一区电影 | 久久a v视频| 亚洲视频电影在线 | 四虎在线免费观看视频 | 色爱成人网 | 日韩欧美视频一区二区 | 国产精品一区二区吃奶在线观看 | 国内精品久久久 | 国产一区二区不卡在线 | 日本久久片 | 欧美91精品久久久久国产性生爱 | 黄色av播放 | 狠狠狠色丁香婷婷综合久久88 | 久久精品视频在线 | 成人黄色片在线播放 | 欧美在线视频日韩 | 午夜影院一级 | 久久精品国产免费观看 | 狠狠色噜噜狠狠狠狠 | 中文字幕观看视频 | 欧美一级电影片 | h动漫中文字幕 | 成人午夜av电影 | 欧美日韩aa| 国产日韩欧美中文 | 欧美91片| 欧美日韩不卡一区 | 国产一区二区日本 | 丁香六月中文字幕 | 99视频国产精品 | 精品国产人成亚洲区 | 就要干b | 日韩久久精品一区二区三区 | 欧美日韩国产一区二区三区在线观看 | 日韩欧美电影在线 | 九九色网 | 久久福利电影 | 色婷婷免费视频 | 国产一区二区免费在线观看 | 国产精品久久久久久久午夜片 | 免费高清男女打扑克视频 | 9797在线看片亚洲精品 | 国产99久久久国产精品免费看 | 狠狠色丁香婷婷 | 成人av在线影视 | 一区二区三区视频网站 | 精品久久久久一区二区国产 | 干狠狠| 久草在线手机观看 | 热久久视久久精品18亚洲精品 | 97超碰资源 | 日韩精品在线视频 | 婷婷综合视频 | 亚洲成人国产精品 | 伊人久久婷婷 | 永久免费毛片在线观看 | 亚洲国产精品99久久久久久久久 | 日韩av综合网站 | 午夜在线免费观看 | 91在线影视 | 国产精品区二区三区日本 | 国产精品综合久久久久久 | 日韩一区二区三区免费视频 | 国产精品青草综合久久久久99 | 国产一区二区在线免费观看 | 中文字幕在线观看完整版 | 色婷婷激情电影 | 欧美日本国产在线观看 | 日韩欧美一区二区在线播放 | japanesexxxhd奶水| 四川妇女搡bbbb搡bbbb搡 | 久久 地址 | 成人试看120秒 | 国产九九九九九 | 视频 天天草 | 亚洲黄色大片 | 九九亚洲视频 | 国产精品女人网站 | 91精品免费看 | 国产精品久久久久久麻豆一区 | 97超碰在线播放 | 欧美伊人网 | 成人在线一区二区 | 国产中文在线字幕 | 国产免费观看高清完整版 | 婷婷丁香激情五月 | 国产在线理论片 | 激情大尺度视频 | 国产精品美女久久久久久免费 | 日本夜夜草视频网站 | 黄色小说在线免费观看 | 亚洲国产中文字幕在线 | 亚洲一区二区精品3399 | 在线高清一区 | 国产精品毛片一区二区在线看 | 九九热在线观看 | av成人黄色 | 亚洲国产无 | 久久精品亚洲国产 | 中文字幕av一区二区三区四区 | 九九九九九九精品任你躁 | 婷婷丁香五 | 久久9精品 | 婷婷伊人五月天 | 精品电影一区二区 | 成+人+色综合 | 亚洲天堂免费视频 | 密桃av在线| 中文字幕一区二区三区久久蜜桃 | 黄色国产在线观看 | 国产三级久久久 | 精品久久久久国产免费第一页 | 久久开心激情 | 婷婷丁香在线 | 国产人免费人成免费视频 | 久久久资源 | 国产91精品久久久久 | 国产精品麻豆99久久久久久 | 久久精品在线视频 | 日韩在线国产精品 | 99在线观看| www久久精品 | 在线播放你懂 | av大全在线播放 | 日韩激情三级 | 日批视频在线观看免费 | 丁香导航 | 又黄又爽免费视频 | 国产一二区视频 | 日韩激情视频在线观看 | 波多野结衣电影一区二区三区 | 337p日本大胆噜噜噜噜 | 91精品在线播放 | 黄色软件视频大全免费下载 | 亚洲自拍偷拍色图 | 97色狠狠| 超碰99在线 | 国产综合精品一区二区三区 | 国产黄色理论片 | 国产精品中文字幕在线播放 | www国产亚洲精品久久麻豆 | 一区二区中文字幕在线观看 | 99热在线免费观看 | 国产精品国产三级国产 | 久久久久久不卡 | 精品久久久久久一区二区里番 | 97精品国产手机 | 午夜影视剧场 | 亚州av成人 | 91探花国产综合在线精品 | 国产黄色精品网站 | 亚洲手机天堂 | 亚洲国产精品第一区二区 | 国产一区二区精品久久91 | 色视频在线观看 | 91精品一区二区在线观看 | 九色琪琪久久综合网天天 | 缴情综合网五月天 | 91九色蝌蚪视频在线 | 99国产情侣在线播放 | 国产精品久久久久久久久蜜臀 | 久久九九久久 | 久久综合狠狠综合 | 91一区二区三区久久久久国产乱 | 日韩中文在线观看 | 国产91精品欧美 | 国内精品久久久久久久久久久 | 99久久免费看 | 九九九热精品免费视频观看网站 | 91插插插免费视频 | 欧美视频www | 超级碰碰碰视频 | 亚洲精品久久激情国产片 | 欧美国产日韩激情 | 色姑娘综合天天 | 亚洲视频www| 在线观看精品黄av片免费 | 天天色天天操综合 | 黄色软件大全网站 | 欧美性久久久久久 | 成人欧美在线 | 免费在线观看一区二区三区 | 亚洲精品日韩一区二区电影 | 久久精品国产成人 | 808电影| 免费高清男女打扑克视频 | 亚洲欧美乱综合图片区小说区 | 一级黄色片在线观看 | 国产91亚洲 | 丝袜美腿亚洲综合 | 久久人人爽人人爽人人 | 久草免费电影 | 亚洲精品久久久久久国 | 久久免费av电影 | 在线国产精品视频 | 午夜国产福利在线观看 | 久久综合婷婷 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 日本公乱妇视频 | 91免费在线播放 | 在线免费看黄色 | 美女露久久 | 999电影免费在线观看 | 精品国产一区二区三区久久久蜜月 | 97国产精品亚洲精品 | 一区二区三区电影在线播 | 国产视频不卡一区 | 996久久国产精品线观看 | 久久久久久高清 | 久久99精品久久久久久秒播蜜臀 | 久av电影| 91九色视频在线 | 国产免费观看久久黄 | 中文字幕视频 | 激情小说 五月 | 成年人在线 | 成人黄色免费观看 | 伊人色播 | 天天激情天天干 | 91亚洲精品久久久蜜桃网站 | 九九九九精品九九九九 | 粉嫩av一区二区三区入口 | 天天干天天上 | 在线播放视频一区 | 91av视频在线观看免费 | 国产黄在线观看 | 国产成人三级 | 午夜婷婷在线观看 | 久影院| 国产无套一区二区三区久久 | 六月天综合网 | 亚在线播放中文视频 | 亚洲男模gay裸体gay | 四虎影视国产精品免费久久 | 国产精品18久久久久久久久久久久 | 黄色a级片在线观看 | 欧美电影在线观看 | 四虎永久免费在线观看 | 91丨九色丨国产在线 | 国产99久久久精品 | 国产69精品久久99不卡的观看体验 | 日韩av一区二区在线 | 一区二区三区在线免费播放 | 成人少妇影院yyyy | 中文在线www | 久久99久久精品国产 | 欧美一级视频一区 | 男女啪啪免费网站 | 99久久99视频只有精品 | 日韩精品一区二区三区免费观看视频 | 日韩久久网站 | 在线v片免费观看视频 | 超碰97网站|