유니티에서 게임 오브젝트의 크기와 정점(Vertex)에 대한 테스트
유니티 에디터의 Inspector 뷰에서 Scale 을 조정하면 Scene 뷰에 보여지는 해당 오브젝트의 크기를 변경할 수 있다.
예를 들어, Plane 오브젝트를 하나 생성하면 x, z 평면에 놓여지고, Scale은 디폴트 1로 설정되어 있으며, Plane 오브젝트를 구성하는 총 정점수는 121(11x11)개이고 한 행에 11개의 정점이 있고 총 11개 행으로 구성되어 있다. 그리고 Plane 오브젝트의 크기를 아래와 같은 코드를 이용하여 출력해보면 10 으로 나타난다
[Plane 오브젝트의 크기와 각 정점좌표를 출력하는 코드]
void Start () {
print("Collider 크기:"+gameObject.GetComponent<Collider>().bounds.size); // (10.0, 0.0, 10.0)
print("Renderer 크기:"+gameObject.GetComponent<Renderer>().bounds.size); // (10.0, 0.0, 10.0)
Vector3[] vertices = gameObject.GetComponent<MeshFilter> ().mesh.vertices;
for(int i=0;i<vertices.Length;i++) {
print ("Vertices["+i+"]:"+vertices[i].x+","+vertices[i].y+","+vertices[i].z);
}
}
[위의 스크립트 출력내용]
Collider 크기: (10.0, 0.0, 10.0)
Renderer 크기: (10.0, 0.0, 10.0)
Vertices[0]:5,-1.110223E-16,5
Vertices[1]:4,-1.110223E-16,5
Vertices[2]:3,-1.110223E-16,5
Vertices[3]:2,-1.110223E-16,5
Vertices[4]:0.9999999,-1.110223E-16,5
Vertices[5]:0,-1.110223E-16,5
Vertices[6]:-1,-1.110223E-16,5
Vertices[7]:-2,-1.110223E-16,5
Vertices[8]:-3,-1.110223E-16,5
Vertices[9]:-4,-1.110223E-16,5
Vertices[10]:-5,-1.110223E-16,5
Vertices[11]:5,-8.881784E-17,4
Vertices[12]:4,-8.881784E-17,4
....
.......
.................
Vertices[120]:-5,1.110223E-16,-5
Plane 오브젝트의 Scale 을 5, 5, 5 로 설정하여 그 크기를 출력하는 경우는 다음과 같이 크기는 5배(50)로 커졌지만 각 정점의 좌표는 변함이 없다
[Hierarchy 뷰에서 Plane을 선택하고 Inspector 뷰에서 Scale 을 5, 5, 5 로 설정하여 다시 테스트한 경우]
Collider 크기: (50.0, 0.0, 50.0)
Renderer 크기: (50.0, 0.0, 50.0)
Vertices[0]:5,-1.110223E-16,5
Vertices[1]:4,-1.110223E-16,5
Vertices[2]:3,-1.110223E-16,5
Vertices[3]:2,-1.110223E-16,5
Vertices[4]:0.9999999,-1.110223E-16,5
Vertices[5]:0,-1.110223E-16,5
Vertices[6]:-1,-1.110223E-16,5
Vertices[7]:-2,-1.110223E-16,5
Vertices[8]:-3,-1.110223E-16,5
Vertices[9]:-4,-1.110223E-16,5
Vertices[10]:-5,-1.110223E-16,5
Vertices[11]:5,-8.881784E-17,4
Vertices[12]:4,-8.881784E-17,4
....
.......
.................
Vertices[120]:-5,1.110223E-16,-5
위의 결과를 보면 ...
오브젝트의 크기는 Inspector 뷰의 Scale 속성을 통해 변경할 수 있고,
각 정점의 좌표는 월드좌표가 아니라 해당 오브젝트의 중심을 기준으로 한 상대적인 위치를 나타낸다는 것을 확인할 수 있다
그러므로 오브젝트의 각 정점의 좌표를 월드좌표로 변환할 필요가 있다면 다음과 같은 방법을 사용하면 된다
Vector3[] vertices = gameObject.GetComponent<MeshFilter> ().mesh.vertices;
Vector3 wv = plane.transform.position + vertices[0]; // 오브젝트의 첫번째 정점좌표를 월드좌표로 변환함
Cube오브젝트의 경우는 총 정점수는 24개이며 모든 정점은 Cube의 중심으로부터 0.5 단위 떨어져 있고 오브젝트의 크기는 1 로 나타난다
Sphere의 총 정점수는 525개로 구성되어 있고 그 크기는 1이다.