<blockquote id="g5mpq"><rt id="g5mpq"></rt></blockquote>

    1. <pre id="g5mpq"></pre>
      <i id="g5mpq"><legend id="g5mpq"></legend></i>
      浪漫女家教主演:黛比地区:台湾 ,日本jiZz,爸爸的种子在线观看,特别的酒店2免费,哇嘎在线,荒野渔夫高清免费观看,新有菜在线免费观看,哇嘎美国
      網易首頁 > 網易號 > 正文 申請入駐

      UE5 Chaos物理|創建物理世界對象

      0
      分享至


      【USparkle專欄】如果你深懷絕技,愛“搞點研究”,樂于分享也博采眾長,我們期待你的加入,讓智慧的火花碰撞交織,讓知識的傳遞生生不息!

      這是侑虎科技第1966篇文章,感謝作者南京周潤發供稿。歡迎轉發分享,未經作者授權請勿轉載。如果您有任何獨到的見解或者發現也歡迎聯系我們,一起探討。(QQ群:793972859)

      作者主頁:

      https://www.zhihu.com/people/xu-chen-71-65

      物理系統與物理世界

      物理系統是每個游戲引擎必備的功能,可以讓游戲模擬真實世界的物理規則。而現代游戲引擎中的“物理”,應該稱為剛體動力學。剛體(Rigidbody)是理想化、無限堅硬、不變形的固體物理。動力學(Dynamics)是一個過程,計算剛體怎樣在力(Force)的影響下隨時間移動及相互作用。

      在游戲世界背后,有一個鏡像的物理世界,其中不關心Actor的視覺表現,只關注Actor的形狀、物理材質等信息。簡單使用場景下,只要把所有Actor當成剛體處理即可。

      以常見的StaticMeshActor為例。下圖左側是Editor窗口,右側是Chaos Visual Debugger看到的物理世界。


      UE5的物理引擎已經從PhysX改成了Chaos,可能物理查詢速度會慢些,但更適合做物理破壞效果,而且數據結構和游戲引擎統一,不需要再做轉換。

      物理世界類

      UWorld是代表由Actor構成的整個游戲世界,它持有一個FPhysScene來代表物理世界,可以類比為渲染中的FScene,物理世界的步進(Advance)初始也由UWorld::Tick()發起。UWorld與物理相關的功能一般在PhysLevel.cpp中實現。FPhysScene等價于FPhysScene_Chaos,繼承自FChaosScene,是Chaos的首要入口。碰撞事件的注冊分發,物理網絡同步相關的內容也由其處理,物理模擬的步進也在該類開始(StartFrame)。

      示例:創建一個StaticMeshComponent

      StaticMesh的物理配置

      編輯器中,可以給StaticMesh設置碰撞,這里直接使用和模型大小一樣的Box碰撞即可。還有其他很多選項,如Sphere、Capsule、凸包等,面對復雜模型時會用多種基礎形狀拼出一個碰撞。


      UBodySetup

      這些碰撞配置,最終會存儲到UBodySetup類里,作為資源的一部分,它會是StaticMesh的一個配置項。對于例子中添加的簡單幾何體碰撞,存儲在其AggGeom變量中。

      class UBodySetup : public UBodySetupCore
      {
      //...
      /** Simplified collision representation of this */
      UPROPERTY(EditAnywhere, Category = BodySetup, meta=(DisplayName = "Primitives", NoResetToDefault))
      struct FKAggregateGeom AggGeom;
      //...
      };

      AggGeom里是一大串幾何體的數據,Box就位于BoxElems數組里。

      struct FKAggregateGeom
      {
      GENERATED_USTRUCT_BODY()
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "Spheres", TitleProperty = "Name"))
      TArray SphereElems;
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "Boxes", TitleProperty = "Name"))
      TArray BoxElems;
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "Capsules", TitleProperty = "Name"))
      TArray SphylElems;
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "Convex Elements", TitleProperty = "Name"))
      TArray ConvexElems;
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "Tapered Capsules", TitleProperty = "Name"))
      TArray TaperedCapsuleElems;
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "Level Sets", TitleProperty = "Name"))
      TArray LevelSetElems;
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "(Experimental) Skinned Level Sets", TitleProperty = "Name"), Experimental)
      TArray SkinnedLevelSetElems;
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "(Experimental) ML Level Sets", TitleProperty = "Name"), Experimental)
      TArray MLLevelSetElems;
      UPROPERTY(EditAnywhere, editfixedsize, Category = "Aggregate Geometry", meta = (DisplayName = "(Experimental) Skinned Triangle Meshes", TitleProperty = "Name"), Experimental)
      TArray SkinnedTriangleMeshElems;
      };

      UPrimitiveComponent

      UPrimitiveComponent為所有持有幾何物體的基類,StaticMeshComponent也是它的子類。會創建一個FBodyInstance作為其在物理世界中的代表。無論是UStaticMeshComponent還是USkeletalMeshComponent又或者UCapsuleComponent,實際最終都會通過FBodyInstance與物理世界進行交互。此外還有UGeometryCollectionComponent等用于特定物理功能相關的Component,它們會持有額外的物理代理。

      FBodyInstance

      一個物理對象的實例,在Gameplay部分的表示,用于設置物理相關的各項屬性。引擎代碼注釋中對FBodyInstance的定義如下:

      Container for a physics representation of an object

      一些屬性舉例:

      • TWeakObjectPtr BodySetup:關聯的BodySetup,BodyInstance本身并不包含具體的幾何形狀。

      • FBodyInstance* WeldParent:一個BodyInstance所連接的父Body。

      • FPhysicsActorHandle ActorHandle:實際是FSingleParticlePhysicsProxy*,為物理引擎內部BodyInstance的呈現與代理。

      • FName CollisionProfileName:碰撞的ProfileName。

      至此,StaticMeshComponent創建完畢,其包含了BodyInstance,并關聯了BodySetup。

      簡單理解的話,StaticMeshComponent包含了Render和物理信息,而BodySetup+BodyInstance就表示物理信息。


      物理對象與Shape

      直觀理解,物理世界就是大量的形狀構成的。

      物理世界如何表示"對象"

      Game世界使用Actor、Component等類型來表示一個對象,但物理世界只關注一個物體的幾何形狀、位置、以及質量等屬性,它們構成了另一套PhysScene里的數據結構,以及PhysScene里的“對象”。這個對象稱為GeometryParticle,Game世界通過FPhysicsActorHandle類型來索引它。

      FPhysicsActorHandle
      using FPhysicsActorHandle = Chaos::FSingleParticlePhysicsProxy*;

      看聲明代碼,等價于FSingleParticlePhysicsProxy*,既然叫XXProxy,那就是一個代理的作用。一個需要進行物理解算的對象在物理引擎內被稱為一個Particle,是一個約定俗成的名字,該類作為其代理充當與物理交互的接口。物理引擎只關注一個物體的幾何形狀、位置、以及質量等屬性,它們由TGeometryParticle持有。PhysicsActorHandle的TGeometryParticleHandle屬性指向了GeometryParticle,實現關聯。不僅如此,TGeometryParticle內部還有一個指向更底層物理SOA存儲的FGeometryParticleHandle,暫時用不到,先不管。概念比較多,之后會做總結。

      注意,目前都只涉及物理世界,但不涉及物理線程。游戲線程和物理線程都可以讀寫物理世界,但物理線程主要負責物理模擬。

      除此之外還有描述Chaos破壞集合的FGeometryCollectionPhysicsProxy、描述關節約束的FJointConstraintPhysicsProxy等。

      FSingleParticlePhysicsProxy的屬性:

      TUniquePtr 
      
       Particle; 
      
      FParticleHandle* Handle;
      FPhysicsObjectUniquePtr Reference;
      int32 GravityGroupIndex;
      TUniquePtr InterpolationData;

      GetGameThreadAPI()是GameThread獲取操作類的方法,直接cast即可:

      FORCEINLINE FRigidBodyHandle_External& GetGameThreadAPI()
      {
      return (FRigidBodyHandle_External&)*this;
      }

      UPrimitiveComponent::OnCreatePhysicsState

      用于創建物理數據。Component在創建時會執行RegisterComponent函數,其中執行到OnCreatePhysicsState創建物理數據,OnCreatePhysicsState本身是虛函數,可以被PrimitiveComponent的不同子類重載。

      重載了OnCreatePhysicsState的Component:


      而其中主要邏輯都在FBodyInstance::InitBody函數里,最終執行到FInitBodiesHelperBase::InitBodies。

      UPrimitiveComponent和FPhysicsActorHandle的映射

      給UPrimitiveComponent創建完物理對象后,和PhysicsActorHandle的映射關系會存儲在PhysScene里,用于后續查詢。

      值得注意的是,Component和PhysicsActorHandle是個一對多的關系,比如一個Component里面可以創建多個BodyInstance,自然就有了多個PhysicsActorHandle。

      一個例子是SkeletalMeshComponent,會有多個剛體組成。

      /** Array of FBodyInstance objects, storing per-instance state about about each body. */
      TArray Bodies;


      創建Actor(Particle)

      這里Actor是PhysX遺留的術語,可以視為物理場景中的一個對象,基本等價于Particle,也即前文的TGeometryParticle。這里的Particle和下文的Shapes都在CreateShapesAndActors函數中創建。

      最終的創建代碼如下,StaticMesh情況比較簡單,直接創建TGeometryParticle即可:

      void FChaosEngineInterface::CreateActor(const FActorCreationParams& InParams,FPhysicsActorHandle& Handle, UObject* InOwner)
      {
      TUniquePtr Particle;
      // Set object state based on the requested particle type
      if(InParams.bStatic)
      {
      Particle = FGeometryParticle::CreateParticle();
      Particle->SetResimType(EResimType::ResimAsFollower);
      }
      //...
      }

      TGeometryParticle的屬性如下:

      TChaosProperty 
      
       MXR; 
      
      TChaosProperty MNonFrequentData;
      void* MUserData;
      FShapeInstanceProxyArray MShapesArray;
      EParticleType Type;
      FDirtyChaosPropertyFlags MDirtyFlags;

      MXR:表示位置和旋轉;FVec3 MX;FRotation3f MR;MShapesArray是Particle所包含的Shape,一個GeometryParticle完全可以包含多個形狀,如球、長方體等,只是用的不多。

      MNonFrequentData指向了低頻訪問的數據。

      有了Particle,隨之就能創建PhysicsActorHandle了,把剛創建的FGeometryParticle指針存入即可。

      創建不同形狀的Shape

      Shape為一個幾何體,它包含碰撞、幾何與物理材質等數據,一個Particle可以有多個Shape。

      Shape的形狀描述都在AggGeom里,總共有以下幾種基礎形狀:

      Sphere:對應幾何類為TSPhere,記錄了圓心坐標和半徑。


      Box:對應幾何類為TBox,記錄了Box的HalfExtent和中心Transform。


      Capsule:對應類型為FCapsule,照理說應該記錄HalfHeight、Radius和中心Transform,但小小優化了一下,改為記錄圓柱體上下兩個點+Radius。


      Convex:除了這些基礎形狀,還有能處理任意形狀的凸包,對應類型為FConvex,里面存儲了所有頂點數據,是三角形的集合。下圖是為一個錐體生成的凸包。


      這里例子的StaticMesh只配置了Box類型的碰撞,會創建TBox類型的Geometry,包含了Min和Max兩個坐標,其實就是HalfExtend的作用。

      template
      class TBox final : public FImplicitObject
      {
      TAABB AABB;
      };
      class TAABB
      {
      TVector MMin, MMax;
      };

      然后對TBox再包一下,加上Box的Transform數據,生成ImplicitObjectTransformed對象。


      ChaosInterface::CreateGeometry函數負責根據配置的AggGeom數據,創建Geometry實例,然后存入Particle中。


      至此,示例中StaticMesh對應的物理Geometry已創建完畢。


      Simple Collision & Complex Collision

      通常一個對象會有簡單&復雜兩套碰撞,就需要分別創建兩個Shape和Geometry。勾選UseSimpleAsComplex則只用一套,但不建議這么做。


      把上面幾個類都聯系起來,總結關系如下。


      寫入物理世界

      目前為止,只是創建了Particle、Shape等數據,還需要把它們注冊到物理世界中,就像把Actor注冊到UWorld。

      FChaosScene::AddActorsToScene_AssumesLocked

      物理世界寫鎖

      首先物理世界會被多線程同時讀取與寫入,因此是個讀寫鎖的場景,寫入時需要加寫鎖,通過FPhysicsCommand::ExecuteWrite函數實現,執行到這時可能會阻塞在等待鎖上。


      寫入Solver

      Solver即為FPBDRigidsSolver,管理了物理世界所有Particle,如此理解即可,寫入代碼如下:

      FPBDRigidsSolver::RegisterObject
      RigidBody_External.SetUniqueIdx(GetEvolution()->GenerateUniqueIdx());
      TrackGTParticle_External(*Proxy->GetParticle_LowLevel()); //todo: remove this

      Proxy->SetSolver(this);
      Proxy->GetParticle_LowLevel()->SetProxy(Proxy);
      AddDirtyProxy(Proxy);

      UpdateParticleInAccelerationStructure_External(Proxy->GetParticle_LowLevel(), EPendingSpatialDataOperation::Add);

      然后Particle會被賦予一個UniqueIdx作為標識。

      RigidBody_External.SetUniqueIdx(GetEvolution()->GenerateUniqueIdx());

      寫入空間加速結構

      這是一個重點。物理世界中有大量的幾何體,為了支持射線檢測、碰撞查詢、物理模擬等功能,必然要用到空間加速結構。這就是FChaosScene類中的SolverAccelerationStructure屬性。

      Chaos::ISpatialAccelerationCollection 
      3>* SolverAccelerationStructure;

      雖然是一個Interface,但實際都用的是:

      它只是一個Collection,里面劃分了多個底層的加速結構。Chaos的默認底層加速結構為AABBTree,它是一個類似BVH的數據結構,但實現更簡單。

      為什么要劃分多個AABBTree?

      整個物理場景使用一個超大的AABBTree來管理并不合適,元素多了效率會很低。所以分多個AABBTree子樹是合理的,劃分依據并不是空間遠近,而是Particle的Static/Movable屬性、QueryOnly/QueryAndPhysics屬性等,大方向是劃分了Static Tree和Dynamic Tree。因為Static Tree是很少做更新的,Particle移動時,更新單獨的Dynamic Tree效率更高。Particle的SpatialAccelerationIdx屬性就表示它屬于哪一個AABBTree,有16位,能表示8個Bucket,每個Bucket又有最多8192個AABBTree,但目前遠沒有用這么多,實際默認用了四個,最多能支持到8個。

      struct FSpatialAccelerationIdx
      {
      uint16 Bucket : 3;
      uint16 InnerIdx : 13;
      }

      Bucket的劃分

      對于Bucket的劃分,只有兩種,一個是0,即默認的,另一個是1,當AABB的包圍盒過大時會放到Bucket 1里。這個包圍盒閾值默認為100米。


      在FPBDRigidsSolver::RegisterObject函數中,會根據這個條件設置Bucket。


      為什么超大AABB要單獨劃分?如果超大Particle和小Particle存儲在一棵樹中,會導致查詢效率變低。想象一個葉節點包含了一個超大Particle和若干小Particle,那么做射線檢測時,很容易與這個葉節點相交,但做逐Particle判斷時,大概率只和這個超大Particle相交,小Particle的射線檢測就都浪費了。

      InnerIndex的設置

      查看FChaosEngineInterface::CreateActor代碼,會發現根據Particle的Static/Dynamic,以及是否QueryOnly,分成了四類:


      Defautl是Static Tree,Dynamic是Dynamic Tree。

      Static Tree會存儲靜態對象,如場景中的樹木、石頭、房屋等。

      例子中,Box的屬性是Static+QueryOnly,因此InnerIndex被設置成了ESpatialAccelerationCollectionBucketInnerIdx::DefaultQueryOnly。


      Dynamic Tree存儲會移動的對象,如角色、載具、電梯。

      DefaultQueryOnly是對Static Tree再細分出Query Only的Particle,DynamicQueryOnly類似,但目前沒啟用,通過p.Chaos.AccelerationStructureIsolateQueryOnlyObjects參數開啟。

      通過Bucket和InnerIndex劃分AABBTree的示意圖如下:


      例子中,Box的屬性是Static+QueryOnly,因此InnerIndex被設置成了DefaultQueryOnly。

      具體寫入了什么數據

      這里立即更新物理世界的加速結構,UpdateElement就是把Geometry插入到AABB中。


      寫入數據有Payload和PayloadInfo兩部分。

      Payload更像Key,類型是FAccelerationStructureHandle,包含Particle指針、UniqueIdx、FilterData等數據。

      PayloadInfo是AABBTree葉節點真正存儲的數據,能反向關聯到Payload和Particle,類型為FAABBTreePayloadInfo。屬性如下:

      struct FAABBTreePayloadInfo
      {
      int32 GlobalPayloadIdx; // GlobalPayloads里單獨存的NodeIndex,沒有BoundingBox
      int32 DirtyPayloadIdx; // 單獨的DirtyElementTree里的NodeIdx
      int32 LeafIdx; // 常見情況,Leaf Node的Index
      int32 DirtyGridOverflowIdx; // 用Dirty Grid而不是DirtyElementTree時,overflow的Index,少見情況
      int32 NodeIdx; // 常見情況,Tree Node的Index
      }

      最終Payload和PayloadInfo會存在PayloadToInfo這個Map里,其實是個數組,通過UniqueIndex索引,模擬成了Map。

      typename StorageTraits::PayloadToInfoType PayloadToInfo;

      AABBTree

      既然AABBTree加速結構很重要,不妨展開分析下。

      核心思想

      其實和BVH類似,都是把一群AABB包圍盒,通過啟發式的規則,不斷劃分成左右兩個AABB子樹,直到每個葉節點包含的AABB包圍盒少于一個閾值,本質是一棵二叉樹。

      以2D情況為例,AABB樹的非葉節點,會把葉節點的AABB給取并集,作為自己的AABB,葉子節點則包含了一定數量的AABB對象。下面Root的Child[1]節點就是葉子節點。


      其對應的二叉樹結構如下:


      至于AABBTree的具體代碼實現,為了效率,沒有使用動態new節點的方法,而是用數組來表示了二叉樹的拓撲。

      TArray 
      
       Nodes; 
      
      TLeafContainer Leaves;

      Nodes存儲了所有節點,每個節點如下:

      struct TAABBTreeNode
      {
      TAABB 3> ChildrenBounds[2];
      int32 ChildrenNodes[2];
      int32 ParentNode;
      bool bLeaf : 1;
      bool bDirtyNode : 1;
      };

      當Node是葉節點時,ChildrenNodes[0]指向葉節點下標,否則ChildrenNodes[0]和ChildrenNodes[1]分別指向兩個子樹。

      ChildrenBounds是左右子節點的Bounds。

      TAABBTreeLeafArray

      TArray 
      
       > Elems; 
      

      葉子節點數組只存儲AABB包圍盒,會略微擴大一點,DynamicTreeLeafEnlargePercent=0.1,為了給Update做一點開銷緩沖,避免Update太頻繁。

      葉節點包含最多8個AABB包圍盒,葉節點的Bounds是它們的并集。


      8是默認值,也可以通過CVar參數改變:

      int32 FAABBTreeCVars::DynamicTreeLeafCapacity = 8;
      FAutoConsoleVariableRef FAABBTreeCVars::CVarDynamicTreeLeafCapacity(TEXT("p.aabbtree.DynamicTreeLeafCapacity"), FAABBTreeCVars::DynamicTreeLeafCapacity, TEXT("Dynamic Tree Leaf Capacity"));

      直接向葉節點插入元素

      InsertLeaf

      把Payload和Bounds插入到AABBTree中。簡單起見,假設已經找到了最適配的那個葉節點,直接插入其中。

      葉節點有個Elements數組,打包存儲了Payload和Bounds,元素類型如下:

      struct TPayloadBoundsElement
      {
      TPayloadType Payload;
      TAABB 3> Bounds;
      };


      具體代碼層面的實現上,一個Leaf節點還需要一個額外的Node節點來輔助。

      下圖為AABBTree拓撲到實際存儲結構的示例,可以看到樹的葉節點,需要一個Node節點與一個Leaf節點來表示。


      插入完成后,會返回Particle在AABBTree中的索引,索引由Node數組下標和Leaf數組下標兩部分組成,類型是NodeAndLeafIndices。

      struct NodeAndLeafIndices
      {
      int32 NodeIdx;
      int32 LeafIdx;
      };

      然后這個數據就存儲在之前的FAABBTreePayloadInfo中。


      如何尋找最合適的葉節點

      葉節點滿了,新建一個Node,作為Parent。

      FindBestSibling

      如果一顆AABBTree層數較多,那么插入一個AABB包圍盒時,需要尋找“最合適”的葉節點插入。

      何謂“最合適”,加入新AABB,通常會使一些ChildNode的BoundingBox變大,需要使BoundingBox增加的體積盡量小,以此來判定“最合適”。這是一種啟發式的方法,認為BoundingBox大小直接影響到AABBTree查詢的效率,類似構建BVH使用的SAH表面積啟發算法。這個尋找過程稱為“FindBestSibling”。

      下面看幾個例子。

      例子1,新加入AABB在原先AABBTree的BoundingBox之內。此時經過對比BoundingBox增加的體積,應該加入ChildTree[1]。


      例子2,新加入AABB在原先AABBTree的BoundingBox之外。此時不僅要考慮分別加入ChildTree[0]和ChildTree[1]所增加的體積,還要考慮加入AABBTree的Root節點增加的體積,把從Root節點到葉節點的所有增量都加起來。為什么要相加?推測是模擬運行時查找的情況,每一層的查找開銷是疊加的。

      這里Root節點帶來的增量相同,顯然加入ChildTree[1]更合適。


      例子3,多層子節點情況。看個更復雜的多層子節點例子,ChildTree[0]是Leaf層,但ChildTree[1]是中間節點,還有ChildTree[1][0]和ChildTree[1][1]兩個子樹。

      對于ChildTree[0],直接計算加入后的額外空間即可。

      對于ChildTree[1]的兩個子樹,先要計算與ChildTree[1]產生的額外空間,再計算與兩個子樹的額外空間,最后都加起來。

      因此這里顯然應該把新節點加入ChildTree[0]中。


      Leaf滿了怎么辦?

      當BestSibling找到的葉節點已經滿了,就無法直接添加,需要再新增兩個Node,一個作為中間節點,另一個作為新的Leaf。之后同樣要更新Leaf到根節點路徑上所有Parent的BoundingBox。


      例子2的變體:


      刪除元素

      與插入元素對應的,就是刪除元素了,刪除邏輯會簡單很多。

      virtual bool RemoveElement(const TPayloadType& Payload)

      首先從PayloadToInfo中找到Payload所屬的節點下標,然后從節點的Element數組里把Payload移除即可,并且把到根節點鏈路上的所有Bounds再更新一遍。


      但是特別的,當葉節點刪除Payload后整個都空了,就要精簡一下AABB樹了,把Parent節點和自己都刪掉,然后Parent節點的位置放Sibling節點即可。


      Static AABBTree

      AABBTree大體上分了Dynamic Tree和Static Tree兩類,其中Dynamic Tree最貼近原生的AABBTree實現,增、刪、改都直接操作AABBTree即可,而Static Tree則做了不少優化,來提升效率。因為通常Static Tree里的元素遠超Dynamic Tree。

      “Static”并不意味著不更新,比如可以把石頭先改成Movable移動,再改回Static等等。Static Tree的構建總是先提供所有AABB對象,一次性建好,之后也能繼續添加/刪除/修改Payload,但樹節點結構不實時改變,只會重建。

      Static AABBTree的構建

      構造函數中提供一個能表示AABB的數組即可,像這里的數組元素有3202個。


      接著執行GenerateTree函數來構造AABBTree。

      GenerateTree(Particles);

      一次性構造一整棵樹有個好處,就是能讓左右子樹盡量空間上均衡,提升之后的查找效率。如果是Dynamic那樣一個一個節點的插入,樹的質量和節點插入順序是有關系的。那么重點就是對于一群AABB節點,如何合理地劃分左右子樹。回想在構造BVH時,有兩種常用劃分方法,一種是在XYZ三個方向里選取Max-Min最大的一個作為劃分軸,然后取中點劃分;另一種是SAH表面積啟發算法,同樣是考慮XYZ三個軸,但在每個軸上要計算多種表面積劃分組合,再選取某個能使Cost最小的位置做劃分,計算量更大,但效果也更好。UE的AABBTree使用了更接近前者的簡單做法,但不會取Max-Min最大的作為劃分軸,而是計算每個軸上AABB 中心點形成的方差,取方差最大的軸作為劃分軸。計算中心點和方差的代碼如下,使用了流式數據常用的Welford算法。


      舉個二維平面的例子。


      按照Max-Min的方式,應該用X軸劃分,按照方差方式,應該按照Y軸劃分,結果上看方差方式更優。

      然后GenerateTree的具體實現上,也有兩個特點,一是支持分幀構建,避免突然卡一下,另一個就是全程避免遞歸和動態內存分配了,是比較值得學習的工程實踐。

      Static AABBTree刪除Payload

      如果Static AABBTree要刪除Payload,過程反而更簡單,直接從Leaves數組中移除Payload即可,不用考慮樹的坍縮,也不用更新整個樹節點鏈路上的AABB包圍盒。


      然后標記ShouldRebuild為true,等待后面一起更新樹,見PBDRigidsEvolution.cpp文件。

      Static AABBTree插入Payload

      插入Payload比較有意思,既要不改變AABBTree的結構,又要插入元素。UE做法是另外創建了一個容器,來存儲插入的元素,而且這個容器同樣支持空間加速查詢。一種實現是2D Grid,另一種實現是再加一個Dynamic AABBTree。還是比較復雜的。

      Grid實現

      默認用Grid實現,首先Payload加入DirtyElements數組,然后把整個場景劃分為2D正方形Grid,再把Payload加入到Grid數據結構中。


      Grid的每個Cell大小為CVarDirtyElementGridCellSize,默認1000,如果一個Payload和某個Cell重疊,該Cell就會把Payload的DirtyPayloadIndx記下來。

      但Grid也有大小限制和容量限制。首先,Payload所覆蓋的Cell不能過多,即Payload的AABB不能過大,然后每個Cell重疊的Payload數量不能過多,不然都會影響效率。目前前者配置是16,后者配置是32。如果超過了限制,Payload就要被加入到單獨的DirtyElementsGridOverflow數組,并把下標記錄在PayloadInfo中,后續也會單獨查詢。


      Grid示意圖如下:


      DirtyElementTree實現

      新加的AABBTree稱為DirtyElementTree,Payload插入完成后,PayloadInfo會存儲其在DirtyTree中的Node下標。



      如此一來,Grid/DirtyElementTree就是Static AABBTree的一部分了,往后的增/刪/改Payload,以及AABBTree做碰撞查詢,都要額外考慮它們。后面AABBTree重建了,再清空Grid/DirtyElementTree。

      AABBTree可視化

      最后,可以讀取AABBTree的所有元素,并畫出來,看下AABBTree都是什么樣。

      遍歷PhysicsScene的SolverAccelerationStructure屬性即可,可以看到整個AABBTree還是比較復雜的。


      尤其是中間角色,有多個BodyInstance。


      碰撞通道設置

      一個PrimitiveComponent,不僅包含幾何信息,還可以配置它的碰撞通道、ObjectType、CollisionType等信息,這些設置都會影響到PrimitiveComponent的物理表現。比如例子中的StaticMeshComponent,默認的ObjectType為WorldStatic,然后對所有CollisionResponses的響應都是Block。


      首先需要根據ColllisionProfileName加載對應的各個碰撞響應,每個BodyInstance都自己存了一份CollisionProfileName和CollisionResponses,加載函數為UCollisionProfile::ReadConfig。至于為什么每個BodyInstance都要存一份,而不是用BodySetup里的,是因為運行時可以動態改變單個BodyInstance的碰撞設置。


      此時這些碰撞設置還是一堆Bool和Enum,對于底層物理引擎存儲不太方便,因此要把它們進行編碼,最終會存入四個int32,用FCollisionFilterData表示。

      struct FCollisionFilterData
      {
      uint32 Word0;
      uint32 Word1;
      uint32 Word2;
      uint32 Word3;
      };

      在CreateShapes函數中,會對碰撞數據進行編碼,并且生成三個FCollisionFilterData實例,存儲不同用途的物理碰撞信息。

      /** Helper struct holding physics body filter data during initialisation */
      struct FBodyCollisionFilterData
      {
      FCollisionFilterData SimFilter;
      FCollisionFilterData QuerySimpleFilter;
      FCollisionFilterData QueryComplexFilter;
      };

      編碼過程主要由CreateShapeFilterData函數實現。


      SourceObjectID:UPrimitiveComponent的UniqueID。

      InstanceBodyIndex:這是UPrimitiveComponent里的第幾個BodyInstance,比如常見的SkeletalMeshComponent有多個BodyInstance。

      SimFilter:物理模擬相關信息。

      inline void GetSimData(uint32 BodyIndex, uint32 ComponentID, uint32& OutWord0, uint32& OutWord1, uint32& OutWord2, uint32& OutWord3) const
      {
      OutWord0 = BodyIndex;
      OutWord1 = BlockingBits;
      OutWord2 = ComponentID;
      OutWord3 = Word3;
      }


      QuerySimpleFilter:SimpleCollision的碰撞響應。

      inline void GetQueryData(uint32 SourceObjectID, uint32& OutWord0, uint32& OutWord1, uint32& OutWord2, uint32& OutWord3) const
      {
      OutWord0 = SourceObjectID;
      OutWord1 = BlockingBits;
      OutWord2 = TouchingBits;
      OutWord3 = Word3;
      }


      QueryComplexFilter:ComplexCollision的碰撞響應,響應部分和Simple是一樣的。

      // Build filterdata variations for complex and simple
      SimpleQueryData.Word3 |= EPDF_SimpleCollision;
      if (bUseSimpleAsComplex)
      {
      SimpleQueryData.Word3 |= EPDF_ComplexCollision;
      }
      ComplexQueryData.Word3 |= EPDF_ComplexCollision;
      if (bUseComplexAsSimple)
      {
      ComplexQueryData.Word3 |= EPDF_SimpleCollision;
      }
      OutFilterData.QuerySimpleFilter = SimpleQueryData;
      OutFilterData.QueryComplexFilter = ComplexQueryData;

      Word3的設置:

      inline uint32 CreateChannelAndFilter(ECollisionChannel CollisionChannel, FMaskFilter MaskFilter)
      {
      uint32 ResultMask = (uint32(MaskFilter) << NumCollisionChannelBits) | (uint32)CollisionChannel;
      return ResultMask << NumFilterDataFlagBits;
      }

      PrimitiveComponent的銷毀

      Component銷毀時,需要同步的清除掉物理世界數據,主要通過FBodyInstance::TermBody函數實現。

      1. 從PhysScene的幾個容器里移除

      PhysicsProxyToComponentMap和ComponentToPhysicsProxyMap。

      2. 從PhysScene的加速結構中移除

      FChaosScene::RemoveActorFromAccelerationStructure

      就是從AABBTree移除,先從Buckets找到對應的AABBTree,然后調用RemoveElement移除。


      最終進入AABBTree的RemoveElement函數,根據DynamicTree屬性、使用Grid還是DirtyElementTree等情況,做移除。



      3. 從Solver中移除

      FPBDRigidsSolver::UnregisterObject,物理模擬信息的刪除。

      文末,再次感謝南京周潤發的分享, 作者主頁:https://www.zhihu.com/people/xu-chen-71-65, 如果您有任何獨到的見解或者發現也歡迎聯系我們,一起探討。(QQ群: 793972859 )。

      近期精彩回顧




      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      北美狂賣,中國暴跌:世界杯救了全球電視,為何獨獨救不了中國?

      北美狂賣,中國暴跌:世界杯救了全球電視,為何獨獨救不了中國?

      打小我就醜
      2026-07-18 09:09:00
      慶祝阿根廷世界杯贏球,16歲網球新星車禍身亡 司法部門:正在調查是否非法飆車

      慶祝阿根廷世界杯贏球,16歲網球新星車禍身亡 司法部門:正在調查是否非法飆車

      紅星新聞
      2026-07-17 16:36:28
      長鑫存儲內存訂單已排至2027年底:蘋果、聯想等廠商優先拿貨

      長鑫存儲內存訂單已排至2027年底:蘋果、聯想等廠商優先拿貨

      快科技
      2026-07-18 09:05:08
      普京收好消息,特種部隊現場抓捕烏克蘭特務,繳獲35架FPV無人機

      普京收好消息,特種部隊現場抓捕烏克蘭特務,繳獲35架FPV無人機

      阿龍聊軍事
      2026-07-14 20:22:50
      保密期限終到期,中央首長透露:毛岸英真相,可以向外界公開!

      保密期限終到期,中央首長透露:毛岸英真相,可以向外界公開!

      銅臭的歷史味
      2026-06-30 03:23:17
      首例5胞胎長大了,父親已勞累去世,母親直言:如能重來一個也不要

      首例5胞胎長大了,父親已勞累去世,母親直言:如能重來一個也不要

      柳絮憶史
      2025-07-22 07:15:03
      61歲張曼玉上海街頭被偶遇!穿百元條紋衫配闊腿褲,松弛得像40歲

      61歲張曼玉上海街頭被偶遇!穿百元條紋衫配闊腿褲,松弛得像40歲

      白宸侃片
      2026-07-18 09:02:26
      新型出軌藏得太深!不約會不開房,無數夫妻被蒙在鼓里

      新型出軌藏得太深!不約會不開房,無數夫妻被蒙在鼓里

      藝鑒在線
      2026-07-18 13:20:46
      性學家說:男人動不動牽你手,揉你耳朵,反復觸碰你皮膚,就是膚淺好色。但恰恰相反,這兩種觸覺饑渴是他把你做為唯一安全感的生理性依賴

      性學家說:男人動不動牽你手,揉你耳朵,反復觸碰你皮膚,就是膚淺好色。但恰恰相反,這兩種觸覺饑渴是他把你做為唯一安全感的生理性依賴

      心理觀察局
      2026-07-15 07:20:13
      民主黨參議員:擔心特朗普可能會在中期選舉期間派兵沒收選票

      民主黨參議員:擔心特朗普可能會在中期選舉期間派兵沒收選票

      獨舞獨舞
      2026-07-18 08:00:24
      太無恥了!特朗普突然發布25分鐘全國講話,一口咬定中國干預大選

      太無恥了!特朗普突然發布25分鐘全國講話,一口咬定中國干預大選

      國際法大視野
      2026-07-17 20:54:30
      倆黑客還沒成年,就搞得英國交通雞飛狗跳,損失上百億!最后卻栽在了一份外賣上…

      倆黑客還沒成年,就搞得英國交通雞飛狗跳,損失上百億!最后卻栽在了一份外賣上…

      英國那些事兒
      2026-07-18 02:54:58
      逃票之王!阿根廷球迷借孩子糊弄安檢+裝殘疾人,已遠征5屆世界杯

      逃票之王!阿根廷球迷借孩子糊弄安檢+裝殘疾人,已遠征5屆世界杯

      新殺豬的秀才
      2026-07-18 02:57:29
      今日重要賽事!7月18日,CCTV5、CCTV5+直播節目表

      今日重要賽事!7月18日,CCTV5、CCTV5+直播節目表

      薇說體育
      2026-07-18 10:56:05
      圖片報:基米希出局后滯留酒店一天半,他反復向工作人員道歉

      圖片報:基米希出局后滯留酒店一天半,他反復向工作人員道歉

      懂球帝
      2026-07-17 15:37:23
      動物行為學發現一條違背直覺的鐵律:對配偶越專一的雄性,體內睪酮水平卻越低,不是忠誠讓它變弱,而是專一本身在重塑它的生存策略

      動物行為學發現一條違背直覺的鐵律:對配偶越專一的雄性,體內睪酮水平卻越低,不是忠誠讓它變弱,而是專一本身在重塑它的生存策略

      心理觀察局
      2026-07-18 06:35:11
      大伯3個兒子,我爸3個女兒,他們打砸吃絕戶,如今伯母跪求我救命

      大伯3個兒子,我爸3個女兒,他們打砸吃絕戶,如今伯母跪求我救命

      人間百態大全
      2026-07-17 06:50:06
      42歲呂一獨居北京,拒胡歌求婚,丈夫杭州另結新歡

      42歲呂一獨居北京,拒胡歌求婚,丈夫杭州另結新歡

      舊事別提
      2026-07-18 13:33:43
      “韓紅基金會”被實名舉報!向疑似“空殼公司”花6000萬采購救護車,涉事單位注冊資本300萬,員工僅2人

      “韓紅基金會”被實名舉報!向疑似“空殼公司”花6000萬采購救護車,涉事單位注冊資本300萬,員工僅2人

      火山詩話
      2026-07-17 07:54:53
      說40歲女人“還算年輕”?你罵誰呢!

      說40歲女人“還算年輕”?你罵誰呢!

      第7情感
      2026-07-17 15:12:12
      2026-07-18 14:48:49
      侑虎科技UWA incentive-icons
      侑虎科技UWA
      游戲/VR性能優化平臺
      1599文章數 987關注度
      往期回顧 全部

      科技要聞

      WAIC2026看什么?這份"不迷路"攻略請收好

      頭條要聞

      重慶山體崩塌 遇難者親人:他們撤出后站路邊被巖體推走

      頭條要聞

      重慶山體崩塌 遇難者親人:他們撤出后站路邊被巖體推走

      體育要聞

      德尚是非典型法國人 14年執教留下豐厚遺產

      娛樂要聞

      大S給具俊曄留遺產是昏頭?實際上她清醒得很

      財經要聞

      股民當街砍博主!韓國股市 終極大屠殺

      汽車要聞

      把中國超跑賣到英國,比亞迪正在被世界看見

      態度原創

      本地
      教育
      親子
      健康
      時尚

      本地新聞

      十年了,為什么鬼怪CP還能讓人美美嗑上?

      教育要聞

      小升初考試題,九宮格填數字

      親子要聞

      媽媽妙招:吸管偽裝藥變飲料

      刮痧也會刮出腦梗?講個真實案例

      今年最好看的4種顏色,太適合夏天了!

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 食物链4大尺度原声版| 图木舒克市| 杀戮霸刀| 大话女儿国| 家属1~6高清| 白日梦我电视剧免费观看完整版| 《活佛济公2》电视剧| 古装武打电影国语| 贪婪:欲望之岛 电影| 朴亚珍《隐形帽》原版| 蜘蛛侠1国语版| 外星传奇| 落魄贵族琉璃川在线观看全集| 明日战记| 法政先锋第三部粤语| 二对一商务模式2聚集| 轱辘女人和井| 《内衣办公室》 在线观看| 牙医诊所赤坂丽电影在线观看 | 儿子谈琼瑶去世细节| 激战厨房4美国| 苹果4刷机教程| 锦医风华| 我和老公的部下| 记忆传授人| 鹦鹉杀免费完整观看高清| 美容院的待遇8免费观看| 和搜子一洗澡的日子| 邮差电影| 水浒传98版电视剧| 需要爸爸来播种在线观看| 亲切的金子粤语趴桌子| 铃木美恵子| 科里蔡斯电影免费播放中文| 翁公和晓雯在厨房里猛烈进出| 金牌销售的秘密| 春雨全集在线观看免费| 法国空姐2| 哥谭高中| 男女一起愁愁愁高清全集免费 | 人与狗马猪p4| 男女一起愁愁愁电视剧免费j苦闷苦闷看 j| 93年版大刀王五| 黑白潜行免费观看高清| 花嫁高柳家1-6集免费观看| 欢天喜地七仙女38集| 情迷姐妹| 一路向西国语在线观看| 睫毛膏4美版免费观看| 风雨哈佛路| 天道电视剧全集| 野花在线观看免费观看高清中文| 徐少强版《金悔瓶》演员阵容是谁扮| 佳期如梦之海上繁花结局| 我的好兄弟8免费观看高清| 邻居的秘密| 白马少年| 新人类《毒医肥尸》| 中方突然宣布出兵| 要妈妈播种的1983年电影 | 斯巴达女超人| 有鬼住隔壁国语| 三年成全在线观看免费全集高清完整| 卫生队的故事电视剧免费观看| 魔神英雄传第三季| 被凌辱的妻子在线观看| 贞观长歌高清| 电影《便利店相泽南》免费观看 | 金珠同学聚会| 听不见的爱短剧免费观看| 安吉拉·怀特全集在线播放| 加油菊花国语| 公之孚| 惊声尖笑5下载| 狂飙电视剧国产全集免费播放| 我想和你好好| 美国爸爸需要播种西瓜视频 | 《致命游戏》免费观看| 美丽小蜜桃2免费观看完整版全集| 天道王电影介绍| 米奇妙妙屋第一季全集中文版免费| 印度合伙人| 美国电影《要爸爸播种2》的导演是谁| 初恋逆袭:竹马别来无恙短剧全集| 蜘蛛侠1电影国语| 男人女人一起愁愁愁电视剧观看全集| 杀破狼2电影国语| 心碎高中 第三季全集观看| 大牛影库战狼6在线观看| 上海滩的电影| 贤妻良母| 《高压监狱3》伦理| 红剑电视剧| 永乐大帝电视剧全集免费观看| 牙医姐妹在线看完整版高清电影1986| 电影飞驰人生2免费观看| 我的危险妻子| 炎陵县| 赘婿电视剧在线观看| 故乡别来无恙电视剧免费观看| 渔夫荒野史1987台湾版主演是谁| 妈妈的味道在线观看中文字幕| 禁忌5中文字幕| 行尸走肉3第三季| 《急诊护士》免费看三级片| 八时入席粤语| 水电工的艳遇在线| 电视剧冰锋| 《壮志凌云》A片版| 超能力者| 新湘西剿匪记| 発情スイッチ[想吃]| 卖保险套女职员在线| 脾虚嘴唇有什么症状| 神探狄仁杰一部30完整版| 美姐妹很努力在线观看| 远古入侵国语| 吊丝女士第二季全集| 二阶堂梦在线视频| 郑州娃娃奶奶| 《太平年》免费观看| 国风电影院在线观看免费播放| 壮丁也是兵演员表| 长津湖在线| 红海危机对全球经济影响有多大 | 繁华似锦电视剧在线观看完整版免费 | 新唐山大兄| 王贵与安娜在线观看| 男女一起相嗟嗟免费观看在学校| 李卫当官第一部免费播放| 《花子vs倔强驱魔师》| 朱音落语全集观看| 潘展乐从第7追到了第2| 光能使者国语版全集| 安徽泗县地图| 今瓶梅| 太阳之歌女主角| 年经继拇| 法国超人麦乐迪在线观看| 深喉电影完整版百度影音 | 进击的巨人大结局| 比思论坛东方美人| 迈克尔演唱会| 有菜电影| 快播韩国电影| 日本电影修理工的艳遇| 隋唐英雄未删减版全集| 满天星安娜采访拳王泰格| 无影灯下连续剧全集免费播放| 麦乐迪女超人在线免费| 心跳源计划在线观看| 黑袍纠察队4| 需要爸爸播种籽电影2| 高清《六姊妹》全集免费播放| 美丽的蜜桃5| 终极一班3在线观看| 私人航空完整版在线观看| 夜蒲团2| 女儿国3| 窥情在线观看| 安斋拉拉电影免费观看高清版2023年| 好久不见结局| 爱我几何完整版| 杏林春暖 下载| 蓝色隐身帽子在线观看| 星光美丽电视剧全集在线观看免费| 美国电影需要爸爸播种子手机版 | 走火电视剧40集免费完整版| 洞头县| 兄弟无间| 少年包青天翻龙劫| 十二生肖传奇 电视剧| 继承者们| 风云年代40集免费播放| 泰山电影完整版播放| 金装四大才子国语全集| 鹰隼大队电视剧| xl司令第一季动漫在线观看免| 空姐郭玮| 白峰美羽主演的为父报仇在线观看视 | 《氪金玩家》动漫在线观看| 赈灾晚会| 入室暴行2免费观看完整版| 对风说爱你| 新婚夜全集免费观看电视剧| 大庆市| 清楼十二房| 超人高校下载| 舞男情未了在线观看| 和部长出差电影| 我的时代你的时代在线观看| 游客借位拍照与大佛击掌 | 韩国美女vip内部1101| 三年成全播放国语高清| 高清写写画画| 马斯克笑称不用去劳改营了| 当着女朋友面睡她闺蜜| 八尺夫人意大利免费观看完整版| 与敌同行国语下载| 超女第一季| 酒店1—50全集观看| 低俗小说 在线| 鸡毛飞上天观看免费全集| 双人调情按摩术伦理片在线观看 | 林师傅在首尔电视剧免费观看| 倔强的驱魔| 华尔街1电影| 用快播看h| https://www.yalan365.com/shiwutv/sreteuc.html | 我老婆是学生会长第二季| 小蜜桃6| 复仇千金:手撕渣男贱女短剧全集| 听不见的爱短剧免费观看| 《爱我几何》免费完整版在线观看| 追缉免费观看电视剧全集完整版| 私奔原唱| 布兰迪 罗伯斯| 女战狼10免费播放在线观看西瓜| 幸福到万家电视剧免费观看完整版 | 蓝调之歌| 澳门风云粤语高清| 第一次遇见花香的那刻| 金瓶梅在线观看全集高清徐少强| 侵略乌贼娘ova| 妓院里的中国姑娘在线观看| 陈庭妮主演的电视剧| 《美国式禁忌3》中文| 《凶器》| 房奴试爱激情戏| 五福临门电视剧免费观看全集高清 | 哇嘎视频完整版| 你给我的喜欢电视剧免费观看全集| 自w到抖还要继续吗| 《爆水管》| 泰剧妒海主题曲| 越剧名段方亚芬| 色即是空qvod| 日历女孩韩国电影高清在线观看| 包公奇案| 美容室待遇5HD| 三十而立剧情介绍| 战狼6高清在线观看| 中国说唱| 韩版恶作剧之吻网络版| 壮志凌云凯登克劳斯版| 提防小手| 保罗保罗一家免费观看| 我是刑警40集免费播出| 电视剧铁面歌女| 肮脏的交易| 甄嬛传18集| 我的绝品老师免费观看电视剧| 济公传奇2| 湿润的继拇HD中文泡泡| 刑侦12国语免费观看全集| 《特殊游泳教练》在线观看| 韩素希《以吾之名》| 新世界电影| 新版笑傲江湖| 青春环游记第二季综艺 | 最近免费韩国高清在线观看| 电视剧乡村爱情交响曲| 一仆二主电视剧全集| 《追凶者也》完整版| 1995版泰山未删减版百度云| 高清正在缩小的男人| 《满天星父亲的秘书》全集| 信仰1—42集免费观看视频播放| 猪猪侠之超星五灵侠3| 长河落日 电视剧| 韩国电影讲一个厨师和助理| 妈妈的职业2观看完整版| 乡村男教师| 《美姐妹很努力》赤板栗子| 旖旎婚色短剧大结局免费观看全集| 按摩男技师电影| 旋风管家国语版| 特别使命| 金瓶双艳杨思群版全集| 无双国士| 容我栖在你心上短剧全集免费观看| 电视剧尖峰全集观看| 特殊保险公司推销员4| 离婚前规则33| 女版《西部通缉令》电影在线观看 | 《乾隆王朝》电视剧| 伦理片销售皇后| 高压监狱1小时43分| 《天乩之白蛇传说》电视剧| 男生女生一愁愁愁电视剧在线观30分钟 | 城南花正开短剧免费全集完整版| 暴力街头| 导弹旅长 电视剧| 《花子vs倔强驱魔师》动漫下载| 栋笃神探粤语| 美国XXXX69| 电影偶遇| 领居家保姆2| 奸臣免费| 电视剧离婚律师| 密战黑茶山| 总台2024网络春晚| 亮剑16| 世界欠我一个初恋在线播放| 萌学园之萌骑士传奇全集| 向风而行在线播放| 新乱世佳人小叔吃扔扔扔哪一集| 我的世界电影在线观看免费| 美国式家庭禁忌1-6| 人工少女3服装存档| 《卢旺达的玫瑰》在线| 小屁孩日记2| 李伯清散打评书| 为食神探粤语| 天赐之女| 嘻哈四重奏 第五季| 战狼6免费高清版999加拿大版动漫| 拔哥的故事| 731恐怖女体实验| 金玉满堂| SSIS-338《最高の爱人沼》在哪看 | 和老板在办公室BD 中文| 甘肃省| 韩国电影《教室爱欲| IPX-711白峰美羽白峰在线视频| 流光飞舞粤语| 3对1电影| 好男人手机在线观看免费播放| 小姑子的味道3韩剧免费中文| 大侦探福尔摩斯1在线| 巜人妻初次按摩2在线免费观看| 行尸走肉amc官方网络剧| 我的主夫男友电视剧免费观看| 学生的妈妈4中韩双字多鱼1下| 二对一观看| 猎鹰行动| 那年我们一起追的女孩| 做aj的免费大全电视| 亲爱的妈妈4无删减版| 五福临门电视剧免费观看全集高清| 好运全集观看| 爸爸的种子电视剧在线观看| 全能少女力挽狂澜短剧| 绝杀在线观看| 特种兵之火凤凰共多少集| 秋瓷炫《生死决断》在线播放| 黑暗圣经外传| 幸福二重奏免费观看完整版高清| 电视剧摇滚狂花在线播放| 妻子的上司| 好妈妈8| 电视剧贤妻| 爱的释放| 女律师的坠落在线观看| 高清《儿媳妇》电影| 3d豪情字幕文件| 莫莉3特别酒店免费| 欢喜婆婆巧媳妇| 中华小子第二部全集| 雷神四爱与雷霆电影在线观看| 女板战狼6免费观看| 古惑仔5之龙争虎斗| 类似极限救援的电影| 鬼父 下卷| 《overflower》真人版动漫全集免费! | 夫妻换房在线| 十七岁电影免费看| 董董恩电视剧免费观看高清版| 贝拉1980| 萧山恒隆电影大世界| 侯门嫡女:宅斗冠军是我短剧全集| 周口杀人案| 粉红大白菜国语版| 湘西诡案| 蓝可儿电梯事件| 王曼昱简介| 女超人麦乐迪无| 某小说家的日记未删减| 米奇妙妙屋之大搜寻| 新金瓶梅2013什么时候上映| 爱维侦查dvd| 李采潭在线观看| 闵度允韩剧中文在线观看| 蜜桃成熟时高清版| 北越暴行电影正版观看| 黄沙战神| 情挑山庄| 新还珠格格全集优酷| 歼灭天际线1-24全集| 斗罗大陆第4部终极斗罗| 微笑的闪士| 突围行动国语| 电影我的游泳女教练| 汇仁胜宝| 二胡美女谁最漂亮| 婚纱 韩国电影| 迷奸家庭教师视频| 京华烟云 电视剧| 水鬼电影| 吞噬星空第二季1集| 妻子8免费播放在线观看第二季| 新年歌曲dj| E版人猿泰山1995故事简介| 刘敏涛老公常乐| 人猿泰山真人版1995年在线| 免费观看电影在线观看高清版| 年轻的母亲韩剧电视剧全集| 好事成双电视剧免费| abo成结模拟动画模拟| 她和她的反击剧情介绍| 姚明场边大喊:不要犯规| 重生为怪兽什么鬼动漫免费观看| 麻生香织黑色的眼泪在线观看| 小皮匠登基| 刑警使命电视剧全集免费观看| 高清《斛珠夫人》免费观看| eeUsS| 高清绝望写手 第五季未删减 | 大男当婚高清全集| 巜激情丛林〉陈雅伦| 《幸福花园》| 全球冠军:电竞大神全集免费| 北京辉子哥| 等社长妻子| 以你的心诠释我的爱在线观看| 情陷夜中环2粤语| 新建文件夹2免费完整版| 法国空乘2016未删减| 金鸡sss粤语| 25岁女子高中生| 儿子谈琼瑶去世细节| 美丽的小蜜蜂4| 神医传奇电视剧免费观看| 《发财日记》免费观看| 筱崎美沙| eeuss| 电影《酒店温存》| 老公不在时动漫第二季的剧情介绍| 沙鲁克汗歌舞| 新还珠格格第三部全集| 麦乐迪家庭矛盾是哪部电影| 丁俊晖今晚直播现场| 且试天下第45集全集免费| 《人与动物》丹麦纪录片| abo成结动画模拟观看| 美女死尸| 《下女》| 无主之花电影| 甲午大海战| 15yc电影电视剧| 奔跑吧兄弟第二季直播| 芭比彩虹仙子之美人鱼公主| 张译跳舞没有技巧全是感情| 黑白配视频播放免费观看| 《主妇与装修工》大结局一木百子| 党同伐异免费| 牙医姐妹在线免费观看| 秘密日记电影在线完整观看| 喜爱夜蒲种子下载| 扫黑风暴免费看| 墨西哥呱达卢佩的玫瑰在线观看完整版 | 梨泰院class电视剧在线观看| 绅士品格国语版全集| 强伦轩女教师在线看| 黑白道粤语| 赌博默示录第三季| 凤飞飞演唱会| 《美容院:特殊待遇》免费看| 善良的女秘书| 胭脂霸王电视剧| 高清棒球大联盟| 奇领6080 奇领yy6080影院 奇领yy6080七剑| 林青霞白发魔女| 孪生兄妹| 爱情三十六计电影| 临城县| 女飞行员(美国)满天星| 陆小凤全集| 武动乾坤第四季动漫免费观看| 幸存者1937免费观看完整版| 啄木鸟《荣誉法则》满天星版| 《世子无双》短剧| 长相思电视剧第二季| 仙剑奇侠传四电视剧| 韩剧《面试2》观看完整视频| 恋语轻唱动漫免费观看完整版| 你是我的荣耀免费观看完整版星辰| 两不疑动漫全集在线观看| 妈妈打女儿原图| 隐形的帽子在线观看免费高清 | 安娜情欲史2| 周香允的《外卖奇遇》| 韩国老公的上司来家里| 断箭行动免费| 唐朝诡事录2官宣| 李英爱主演的电视剧| 男女一起愁愁愁电影全集免费| 北漂电影| 铁梨花剧情介绍| 方言版唐伯虎点秋香| 性电影| 哈利波特20周年重返霍格沃茨| 狼行天下之钦差| 美女拍拍| 学生的妈妈4中韩双字多鱼1下| 《荣誉守则》成人版2017美国版 | 女房产销售员销售3| 杨思敏国语版最经典的一句| 男女一起免费观看高清全集| 金玉满堂全集| 御龙在天名将盛典| 《被隔壁男人侵犯RBD-505》| 最佳情侣电视剧| 新还珠格格的所有歌曲| 进击的巨人6| 朝国年经继4电影| 发型屋网站| 医妃不好惹短剧全集| 平凡职业造就世界最强第二季| 快手怎么和别人同框| 铜锣铜钹铿锵锵免费观看| 你的味道| 学园默示录下载| 战争与回忆| 妻子8免费完整高清电视剧| 需要爸爸的种子播种免费观看| 封神榜英雄榜全集| 鱼跃在冬季国语| 角斗英雄| 麦乐迪满天星无删减版| 逃脱韩国电影高清播放在线观看| 云裳广场舞爱情果| 不被爱也没关系| 保罗一家1--4美国版免费观看| 《部长出差的日子》电影中文| 爱的二八定律在线观看| 银河护卫队2电影天堂| 三个和尚免费| 《法国空乘11》成人版| 放课后的花子君| 珠光宝气粤语全集| 特约外卖员| 走天涯dj| 禁忌4年转一代中文字母| 西游艳谭| 东北警察故事2021谢苗版| 巴黎夜未眠| 涟源市| 《灭火行动| 高清《余罪2》全集在线观看| 恋空电影下载| 换子成龙电视剧| 法国电影《军事不当行为》在线观看| 高庄监狱在线观看电影| 聊斋之婴宁| 女忍者忍法帖2| 玫瑰的故事电影免费播放| 《急诊护士》法国版电影在线播放| 今夜无人入睡免费观看第7集| 追光的日子30集免费观看| 精灵宝可梦bw| 甄嬛传在线观看| 束缚游戏在线观看第一季免费完整版| 新假面骑士| 爱在空气中第二部| 我俩没有明天| 荷尔蒙美国版6| 女版战狼6全集免费观看| 新妹魔王的契约者在线观看 | 男女一起愁愁愁高清全集免费| 三妹影院在线观看免费播放电视剧 | 父辈荣耀| 詹妮弗电影《满天星》 | 断魂小丑3在线播放| 《女教师的味道3》| 啄木鸟满天星电影壮志凌云在线观看| 恋慕韩剧免费观看| 鬼吹灯有声小说在线收听| 巴巴爸爸全集免费观看中文版| 《大兵的寝室》美剧免费观看| 高压监狱《3》伦理| 狂飙40集在线观看免费| 泰剧在线观看| 如果爱第2季 综艺| omoflow第一集真人| 黑巨痉大战饿罗斯美女| 地心历险记在线| 人犬兽人完整版| 33d蜜桃成熟时| 电影《V酒店》第一季在线观看| 黑人大屌大战美女| 劲爆的士高| 点解阿sir系阿sir粤语版| 《人在囧途》| 女超人电影完整版免费观看麦乐迪| 兔子先生第一季免费视频播放全集| 日本电影追捕完整版| 决不饶恕| 轨道小火车34p| 我爱几何电影免费播放| HD版《激战丛林》电影| 工厂女孩| 逆流而上的你免费观看完整版| 肉身佛3步骤| 十七·3电影高清免费播放| 老杨解说| 南北腿王| 澳门回归22周年| 电脑危情| 天星术之欧美高清视频完整播放 | 致命弯道5完整版在线观看视频| 黑帮大佬我和我的365第二部| 金银梅5普通话国语版| 巜性刑房3捆绑凌虐免费在线观看| 超人变身| 麦迪35秒13分高清| 谢娜魏大勋去看张杰演唱会| 电影《V酒店》第一季在线观看| 千金与仆人电影完整免费观看 | 金瓶梅在线观完整版观看视频| 密桃成熟时1993| 暴躁女孩免费看全集| 韩国夫妇交换| 绅士布朗科| 成龙电影全集粤语| 权欲第一季在线观看完整版| 军事| 伊波拉病毒未减测版在线观看免费| 我爱记歌词领唱| 超能查派字幕下载| 中国油价处在世界什么水平| 春满宫185集免费观看| 《冢本战争》在线观看| 共同警备区剧情详解| 千王之王1991国语版全集| 日剧《特殊的家政》 | 老妈和我一起嫁| 朱妮安莉主演《房屋售楼员》在线观| 巴勒斯坦代表誓言永不投降| 高清《我家那小子2026》| 王的女人共多少集| 浪漫黛比在线观看| 大丈夫2粤语| 穿靴子的猫高清| 《女超人:麦乐迪》在线播放| 部长出差跟刚新婚的少妇在线观看| 爱情与灵药豆瓣| 美丽姑娘免费高清电影大全| 断箭电视剧免费高清完整版在线观看| 狂飙在线观看完整版| 千斤肉板栗1985| 牧羊曲伴奏| 我家有喜80集全免费播放| 长安三万里免费完整看| 琉璃电视剧全集1-59集| 法国空乘2016不难空乘| 易建联29分| 电视剧守望| 天生一对印度| 处女夜记| 酒店1~80集| xl司令全集在线观看完整版电影| 白发电视剧在线观看全集免费高清 | 法版风流管家2008版| 猪猪侠泡泡糖| 重庆绝杀上港| 369你懂的电影永久入口| 真爱找麻烦电视剧| 婚姻料理| 影音先锋色先锋| 妇科女护士电影| 电视剧长沙保卫战全集在线观看 | 哈利波特与凤凰社在线观看| 《荣誉守则》成人版| 亲爱的回家免费观看完整版电视剧 | 猫儿宝贝| 日本熟睡的继拇HD| 韩剧隐身帽子免费完整版| 看456| 黑客帝国免费| 狗剩快跑全集在线免费观看| 菲梦少女第三季| 电影《瓜达卢佩的玫瑰》完整版| 乡村爱情6全集| 农家小媳妇全集免费| 超级富豪| 暗潮汹涌之惊魂12小时免费观看| 渔夫荒野史记1988版电影在线观看| 《女律师的堕落》伦理| 年轻的母亲3完整版| 大蛇5国语版完整版| 背着善宰跑电视剧免费观看| 小斌斌事件| 本乡爱电影高清免费观看| 农民伯伯乡下妹第5季最新更新内容| 轩辕剑之天之痕电视剧免费观看| 灭门惨案 孽杀| 《我和我的父辈》沈腾| 浮山县| 需要爸爸的种子电影在线观看| 阿修罗道在线观看免费观看| 日在校园h版| 名侦探柯南国语版tv| 甄嬛传舞蹈| 朋友换麦子6| xl司令第二季全集免费观看| 古惑仔2国语高清| 人类星球 电影| 恋爱时代豆瓣| 再次我的人生第二季| 小密逃| 《性男按摩师》电影在线观看| 遗失的世界第一季| 高清《妻子的新世界》电视剧 | 色先峰色影音| 女佣变凤凰| 国乒女单无缘亚锦赛四强| 食为奴国语全集| 古惑仔少年激斗片| 初体验5| 《朋友夫妇:交换》3| 《被拒绝的爱》泰剧免费观看| 天天躁狂AAAA| 囡囡电影完整版百度影音| 淮河流域图| 妈妈的职业2在线全集| 蜜桃成熟时无删减| 百视通鲜时光| 电视剧贤妻| 胜女的代价 第2季| 绿光森林全集| 品味人生无憾坎贝奇完整版| 聊斋之月宫宝盒电影| 僧侣走肾1-12未删减| 三打白骨精西瓜影音| 非诚勿扰最有钱的男嘉宾 | 电影禁忌5大结局| 零上十八度软床| 镜双城电视剧在线观看网站| 一门三司令在线观看| 水浒传之英雄好免费播放| 王多鱼打扑克视频在线观看| 法国空乘电影观看免费视频:| 小凉宫春日的忧郁| 钢铁侠4在线观看免费版高清| 新鱼之恋| 《顶级人生》电影| 仓多真央JUY-970在线播放| 疯丫头第3季全集| 抱抱俏佳人粤语版| ed2k 白石茉莉奈| 《坚如磐石》电影| 莱阳市| 日本大胸继拇| 牛郎织女全集| 俄影《为何是你》免费观看 | 锦月如歌在线观看| 女超人电影在线观看完整免费高清悬疑片| 浪漫女家教电视剧免费完整版| 鬼父ova| 超科学的电磁炮| 回复术士第2季在线观看| 怦然心动20第三季全集免费观看| 《维修师傅的艳遇HD》| 麦乐迪 马克思主演女超人| 你是我的荣耀在线观看| 赤裸特工电影| 创:战神| 陷入热恋的我们免费观看| 彭山县| 总统之夜电影在线观看| 阴阳尼姑2免费看| 魔唇劫国语| 杀破狼在线观看完整版免费| 侯天明的梦| 阿里巴巴与四十大盗| 好姑娘1免费观看| 法国空4| 西湖电视| 天注定在线观看完整版| 麦迪时刻35秒13分高清| 侠客行不通免费观看| 爱我几何130| 王多鱼打扑克免费软件| 陈式太极拳老架一路74式| 高清《外出》无删减床戏片段| 《前任1》高清完整版| 黑帮老大和我的365天| 富有的玫瑰1987| 酒店1—80集免费观看电视剧下载| 朱锁锁叶总什么电视剧| 僵尸道长国语高清| 豹在线观看| 庆余年第二季免费完整| 《七根心简》电视剧| 俘虏之锁~初女们银灰的束缚~ 1| 魅惑电影全集免费观看| 胡乱的深见君2| 赤焰战场2| 饥饿难耐| 吻舔咬抽插轮J1V多| 男女一起愁愁愁在线观看全集高| 继拇的上午HD| 唐人街探案赵英俊| 电影《汤唯》免费播放| 牝教师樱花动漫| 长相思第二季在线观看免费全集| 眷思量免费观看全集| 妻子的新世界电视剧免费观看高清| 鬼吹灯之天星术日本| 丫鬟侯府主母:逆袭成功全集免费| 快乐到家好看吗| 你巅峰时我退让你衰老时我骑脸| 《善良的女邻居》4 | 公公与媳妇高清免费版电视剧| 电视剧《回响》免费观看| 禁忌7年转一代| 已婚妇女炎热午后| 古墓丽影hd版电影| 南海风云| 《赘婿》| 玄女心经1免费| 聊斋艳谭之幽媾下载| 义子乱的电影在线| 女子护卫队满天星| 《有夫之妇的秘书》演员表| 两个月亮| 国足vs澳大利亚直播在线观看| 时光正好1-40集完整版| 霸道股评最新视频| 卢旺达的玫瑰完整版免费观看| 两组一起按摩的电影| 大地电影在线观看| 误杀在线观看| HR版女版壮志凌云2010| 坠落的女律师全集免费| 嫁错豪门嫁对郎短剧在线观看| 我的少女时代电影| 职业替身泰剧| 郊游 电影| 唐朝豪放女免费观看完整版电视剧 | 全城大佬跪迎:傻婿觉醒短剧全集| 强伦轩办公室女教师HD| 屠宰森林1小时52分版| 高圆圆回应网友说老| 解药动画片全集在线观看| 我唾弃你的坟墓1| 听说你喜欢我免费观看完整版| 和平区| 男女一起愁愁愁免费观看全集电视剧| 法国空4|