Unity3D:检测网格与其他游戏对象相交的三角形

Unity3D:检测网格与其他游戏对象相交的三角形,3d,unity3d,collision-detection,intersection,3d,Unity3d,Collision Detection,Intersection,我有一个平面,包含多个网格(通常)。现在,我在场景中添加了新的游戏对象-圆柱体。当圆柱体与平面碰撞时,我需要检测平面上出现在圆柱体内部的所有三角形。是否可以使用Unity3D API? 我看过教程“碰撞器作为触发器”,但我有一个问题-在碰撞对象中,我能处理没有刚体组件的触发器事件吗?由于某些原因,我不能在平面和圆柱体中有刚体。这可以通过向圆柱体添加一个spherecast来实现,并且当任何对象进入它时(框碰撞器、光线投射等),都会发生一些事件。为了检测平面的三角形(假设您有某种网格碰撞器),可以

我有一个平面,包含多个网格(通常)。现在,我在场景中添加了新的游戏对象-圆柱体。当圆柱体与平面碰撞时,我需要检测平面上出现在圆柱体内部的所有三角形。是否可以使用Unity3D API?

我看过教程“碰撞器作为触发器”,但我有一个问题-在碰撞对象中,我能处理没有刚体组件的触发器事件吗?由于某些原因,我不能在平面和圆柱体中有刚体。

这可以通过向圆柱体添加一个spherecast来实现,并且当任何对象进入它时(框碰撞器、光线投射等),都会发生一些事件。为了检测平面的三角形(假设您有某种网格碰撞器),可以获取圆柱体spherecast中所有命中对象的列表,并循环遍历构成完整网格三角形的每个对象。下面是一些代码来显示该过程:

void GetMeshTriangle( RaycastHit meshHitPoint, MeshCollider meshObject ){
Mesh mesh = meshObject.sharedMesh;
Vector3[] vertices = mesh.vertices;
int[] triangles = mesh.triangles;
int counter = 0;
for( int n = 0; n <= ( worldObjectsHit.Length * 3 ); n++ ){
    if ( counter == 2 ){
        Transform hitTransform = meshHitPoint.collider.transform;
        try{
            Vector3 pointOne = vertices[triangles[meshHitPoint.triangleIndex * 3 + n]];
            Vector3 pointTwo = vertices[triangles[meshHitPoint.triangleIndex * 3 + ( n-1 )]];
            Vector3 pointThree = vertices[triangles[meshHitPoint.triangleIndex * 3 + ( n-2 )]];
            pointOne = hitTransform.TransformPoint( pointOne );
            pointTwo = hitTransform.TransformPoint( pointTwo );
            pointThree = hitTransform.TransformPoint( pointThree );
            Vector3 meshObjectCenter = new Vector3( ( ( pointOne.x + pointTwo.x + pointThree.x ) / 3 ), 
                                           ( ( pointOne.y + pointTwo.y + pointThree.y ) / 3 ) , 
                                           ( ( pointOne.z + pointTwo.z + pointThree.z ) / 3 ) );
            Debug.DrawLine( p0, p1 );
            Debug.DrawLine( p1, p2 );
            Debug.DrawLine( p2, p0 );
            IsMeshColliding( meshHitPoint, meshObjectCenter );
            } catch ( System.IndexOutOfRangeException ex ){
                break;
            }
            counter = 0;
        } else {
        counter++;
        }
    }
}
void GetMeshTriangle(RaycastHit meshHitPoint,MeshCollider meshObject){
网格=meshObject.sharedMesh;
Vector3[]顶点=网格顶点;
int[]三角形=网格三角形;
int计数器=0;
对于(int n=0;n thnx表示SphereCast尖端。我将检查网格的每个三角形是否与圆柱体重叠(使用SphereCast或OverlappSphere方法)