我有飞机,包含多个网格(通常)。现在,我添加了一个新的gameObject - Cylinder。当圆柱体与平面碰撞时,我需要检测平面的所有三角形,出现在圆柱体内。是否可以使用Unity3D API?
我看到教程“碰撞器作为触发器”,但我有一个问题 - 我可以在碰撞对象中处理没有Rigidbody组件的触发器事件吗?由于某些原因,我不能将Rigidbody放在飞机上和圆柱体中。
答案 0 :(得分:2)
这可以通过向圆柱体添加球形来实现,并且当任何物体进入它时(盒子对撞机,光线投射等)发生一些事件。为了检测平面的三角形(假设您有某种网格对撞机),您可以获得圆柱体球形内所有命中对象的列表,并循环遍历构成完整网格三角形的每个对象。以下是显示该过程的一些代码:
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++;
}
}
}
在“IsMeshColliding()”行中,您可以添加自己的逻辑以发生某种事件。