저는 평면을 가지고 있습니다. (보통) 여러 개의 메시가 있습니다. 이제 새로운 scene 인 gameObject - Cylinder를 추가했습니다. 실린더가 비행기와 충돌 할 때, 나는 실린더 안에 나타나는 비행기의 모든 삼각형, 을 감지해야합니다. Unity3D API로 가능합니까?
"Colliders as Triggers"튜토리얼을 보았습니다.하지만 충돌하는 객체에서 Rigidbody 구성 요소가없는 Trigger 이벤트를 처리 할 수 있습니까? 몇 가지 이유로 나는 비행기와 실린더에서 리지드 바디를 가질 수 없습니다.Unity3D : 다른 게임 오브젝트와 교차하는 메시의 삼각형을 검출합니다.
0
A
답변
2
실린더에 구형 캐스트를 추가하고 개체가 입력 될 때 (상자 충돌기, 레이 캐스트 등) 어떤 이벤트가 발생하면이 작업을 수행 할 수 있습니다. 비행기의 삼각형을 감지하기 위해 (어떤 종류의 메쉬 콜리더가 있다고 가정) 실린더의 구형 캐스팅 내의 모든 히트 오브젝트 목록을 가져올 수 있으며 완전한 메쉬 삼각형을 구성하는 각각의 오브젝트를 순환 할 수 있습니다. 다음 과정을 보여주기 위해 몇 가지 코드입니다 : "IsMeshColliding()"라인이 발생하는 이벤트의 일종을 가지고 자신의 논리에 추가 할 수 있습니다에서
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++;
}
}
}
.
** SphereCast ** tip의 경우 thnx입니다. (** SphereCast ** 또는 ** OverlapSphere ** 메소드를 사용하여) 실린더와 겹치도록 모든 메쉬 삼각형을 검사합니다. – lewis