2014-09-03 2 views
0

현재 Java에서 메뉴 시스템을 코딩하고 있으며 세계 좌표를 화면 좌표로 변환해야합니다. 나는 그것을 수행하는 방법에 대한 많은 게시물을 읽고 다음과 같은 구축 :opengl 정규화 된 장치가 1보다 큰 좌표

float[] v = new float[]{0,0,0,1}; //four vector location of object in object space 


    //multiply by model matrix 

    v[0] = model[0]*v[0] + model[4]*v[1] + model[8]*v[2] + model[12]*v[3]; 
    v[1] = model[1]*v[0] + model[5]*v[1] + model[9]*v[2] + model[13]*v[3]; 
    v[2] = model[2]*v[0] + model[6]*v[1] + model[10]*v[2] + model[14]*v[3]; 
    v[3] = model[3]*v[0] + model[7]*v[1] + model[11]*v[2] + model[15]*v[3]; 

    //multiply by projection matrix 

    v[0] = projection[0]*v[0] + projection[4]*v[1] + projection[8]*v[2] + projection[12]*v[3]; 
    v[1] = projection[1]*v[0] + projection[5]*v[1] + projection[9]*v[2] + projection[13]*v[3]; 
    v[2] = projection[2]*v[0] + projection[6]*v[1] + projection[10]*v[2] + projection[14]*v[3]; 
    v[3] = projection[3]*v[0] + projection[7]*v[1] + projection[11]*v[2] + projection[15]*v[3]; 

    //account for distortions 
    v[0] = v[0]/v[3]; 
    v[1] = v[1]/v[3]; 
    v[2] = v[2]/v[3]; 
    v[3] = v[3]/v[3]; 

    //transform to screen coords. 
    onScreenX = (int)((viewport[2] * (v[0] + 1.0f))/2.0f) + viewport[0]; 
    onScreenY = (int)((viewport[3] * (v[1] + 1.0f))/2.0f) + viewport[1]; 

    System.out.println(onScreenX + ", " + onScreenY); 

지금은 데 큰 문제는 내가 관점 분할을 한 후 나는 그러나 -1과 1 사이의 값을 가져야한다는 것입니다 객체가 화면에 선명하게 표시되어 있어도이 범위를 벗어나는 것들을 얻을 수 있습니다. 내가 여기서 무엇을 놓칠 수 있는지 잘 모르겠습니다.

나는 이미 함수 gluProject()을 알고 있지만이 계산은 내 glu 개체가있는 곳에서 멀리 떨어져 있으므로 함수는 쓸모가 없습니다. 행렬 수학으로 끝내야합니다.

답변

1

이 계산은 v 벡터의 값을 새 값으로 덮어 쓰고 이전 값을 계속 사용해야하는 위치에서 사용합니다.

v[0] = model[0]*v[0] + model[4]*v[1] + model[8]*v[2] + model[12]*v[3]; 
v[1] = model[1]*v[0] + model[5]*v[1] + model[9]*v[2] + model[13]*v[3]; 

첫 번째 문은 v[0]에 새로운 값을 할당 한 다음 두 번째 문장의 오른쪽에 그것을 사용

그냥 처음 두 과제를 찾고 있습니다. 따라서 v[1]의 계산을 위해 v[0]의 새 값이 v[1], v[2]v[3]의 이전 값과 함께 사용됩니다.

동일한 패턴이 전체 계산을 통해 계속됩니다.

이것을 피하는 가장 쉬운 방법은 계산의 각 단계마다 새 벡터를 사용하는 것입니다. 예 :

float[] vModel = new float[4]; 
vModel[0] = model[0]*v[0] + model[4]*v[1] + model[8]*v[2] + model[12]*v[3]; 
vModel[1] = model[1]*v[0] + model[5]*v[1] + model[9]*v[2] + model[13]*v[3]; 
... 

float[] vProj = new float[4]; 
vProj[0] = projection[0]*vModel[0] + ... 
... 

이렇게하면 이전 버전을 계속 사용하면서 새 값으로 덮어 쓰지 않아도됩니다.

+0

o.O 나는이 간단한 버그를 놓치기에는 너무 오랫동안이 코드를 작업 했음에 틀림 없다. 그 점을 지적 해 주셔서 대단히 감사합니다. 꿈처럼 지금 일합니다. –