2011-06-15 2 views
1

보기 절두체 (x, y, z 카메라 위치, 회전 [0-360] 및 피치 [0-180] 및 시야각 (예 : 45)로 정의 됨) 상자 (2 개의 반대 구석 점으로 정의 됨)가 부분적으로 또는 전체적으로 그 절두체 내에 있는지를 결정하기위한 (가장 빠른 자바 코드가 가장 빠른) Java 코드는 무엇입니까?자바에서 상자를 도려내 기 절두체보기

더 정확히 말하면 다음을 어떻게 완료 할 수 있습니까?

static boolean isBoxInFrustum(float cx, float cy, float cz, // Vector camera, 
     float rotation, float pitch, float angle, 
     float p1x, float p1y, float p1z, // Vector point1, 
     float p2x, float p2y, float p2z) { // Vector point2 
    //... 
} 
C++ 구현 http://www.lighthouse3d.com/tutorials/view-frustum-culling/

편집에서 찾을 수 있습니다

: 여기에 단지 4 라인이며, 한 눈에 이해하기 쉬운만큼 나에게 보인다 2D 버전, - 그것은이되게 수정 할 수있는 방법은 3 차원 수표?

static boolean isPointInFrustum(
     Vector cam, float rot, float pitch, float ang, Vector point) { 
    Vector diff = cam.minus(point); 
    float deg = Maths.arctan(diff.y, diff.x) + rot + 360; 
    deg %= 360; 
    return (deg > 180-ang && deg < 180+ang); 
} 

답변

-1

기본 구문 외에도 Java 코드와 C++ 코드의 차이점은 무엇입니까? 그 사이트의 C++ 코드는 위의 인터페이스보다 훨씬 많은 객체 지향적 인 기능을 가지고 있습니다. 당신은 등대 코드와 같은 FrustumR 클래스 및 Vec3 클래스를 구축하고 방법을 추가 할 수 없습니다 포인터 (전용 연산) 처리하지 않는 방법의 몸 때문에

int FrustumR.pointInFrustum(Vec3 p) 

을, 당신을 기본적으로 붙여 넣을 수 있어야하며 Java에서 작동합니다.

어떤 이유로 든 이러한 클래스를 구현할 수없는 경우 해당 클래스 멤버에 대한 참조를 인수에 대한 참조로 변경하여 C++ 코드를 변환 할 수 있어야합니다.

+0

참고 : 나는 당신이 생각하는 [이 페이지] (http://www.lighthouse3d.com/tutorials/view-frustum-culling/radar-approach-implementation/)의 코드를 참조하고 있습니다. – mgiuca

+0

또한 : 등대 코드를 읽으면 Vec3 클래스가 Java에서 사용할 수없는 연산자 오버로딩을 사용하는 것처럼 보입니다. 이를 위해 몇 가지 방법을 작성해야합니다. 예를 들어,'Vec3 v = p-camPos' 대신'Vec3 v = p.minus (camPos)'를 써야합니다. – mgiuca

+0

사이트의 코드는 카메라 참조 및 근거리 및 원거리 자르기 평면을 사용합니다. 위의 내용을 참조하십시오. 카메라 참조를 생성하는 방법이 분명한 경우 또는 회전 및 피치를 사용하도록 코드를 다시 작성하는 방법에 대해 설명해주십시오. 이유는 무엇이든 상관없이 링크 된 자습서가 나를 어둠에 빠지게하기 때문입니다. (덧글/덧글은 "덧글 추가"를 사용하여 게시해야합니다.) –