2010-11-27 5 views
2

3D 공간을 이동하기 위해 카메라를 만들고 있는데 설정하는 데 문제가 있습니다. 나는이 작업을 Java로하고 있으며 gluPerspective와 gluLookAt를 함께 사용하면 충돌이 발생합니다 (화면이 미친 듯이 깜박임).OpenGL : 내 카메라 만들기

gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION); 
gl.glLoadIdentity(); 
glu.gluPerspective(50.0f, h, 1.0, 1000.0); 
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); 

난 후 순방향 눈의 사용을 조정하기, 카메라 행렬을 생성하고 닫 벡터 (http://people.freedesktop.org/~idr/glu3/form_4.png)는 (카메라 코드가 올바른 가정 할

:

gluPerspective이 같이 설정된다.

gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); 
gl.glLoadIdentity(); 
gl.glMultMatrixf(camera.matrix); 

을 그리고 나는 파묻혀에 일부 번역/회전을 내 드로잉 루틴 (전화 : 내가 어떤 일을 그리기 전에

마지막으로, 내가 가진 r은 glRotatef와 glTranslatef를 호출하여 소유).

glMultMatrixf를 호출하지 않으면 카메라는 화면 중심에서 볼 ​​필요가있는 항목을 표시합니다. 그러나 glMulMatrixf를 사용하면 검정색 화면 만 표시됩니다. 대신 glLoadMatrixf를 사용하여 시도 했는데도 작동하지 않았습니다. 내가 뭔가 잘못하고 있는거야? 나는 무언가를 제자리에두고 있습니까? 그렇지 않다면 이것이 어떻게 이루어져야하는지 알려주고 충돌을 일으킬 수있는 카메라 코드를 게시 할 것입니다.

편집 :

private void createMatrix() 
{ 
    float[] f = new float[3]; //forward (centre-eye) 
    float[] s = new float[3]; //side (f x up) 
    float[] u = new float[3]; //'new up' (s x f)   
    for(int i=0;i<3;i++){ 
     f[i] = centre[i]-eye[i]; 
    } 
    f = Maths.normalize(f); 
    s = Maths.crossProduct(f,upVec); 
    u = Maths.crossProduct(s,f); 

    float[][] mtx = new float[4][4]; 
    float[][] mtx2 = new float[4][4]; 
      //initializing matrices to all 0s 
    for (int i = 0; i < mtx.length; i++) { 
     for (int j = 0; j < mtx[0].length; j++) { 
      mtx[i][j] = 0; 
      mtx2[i][j] = 0; 
     } 
    } 

      //mtx = [ [s] 0,[u] 0,[-f] 0, 0 0 0 1] 
      //mtx2 = [1 0 0 -eye(x), 0 1 0 -eye(y), 0 0 1 -eye(z), 0 0 0 1] 
    for(int i=0;i<3;i++){ 
     mtx[0][i] = s[i]; 
     mtx[1][i] = u[i]; 
     mtx[2][i] = -f[i]; 

     mtx2[i][3]=-eye[i]; 
     mtx2[i][3]=-eye[i]; 
     mtx2[i][3]=-eye[i]; 
    } 
    mtx[3][3] = 1; 
    mtx2[0][0]=1;mtx2[1][1] = 1;mtx2[2][2] = 1;mtx2[3][3] = 1; 

    mtx = Maths.matrixMultiply(mtx,mtx2); 
    for(int i=0;i<4;i++){ 
     for(int j=0;j<4;j++){ 
          // this.mtx is a float[16] for glMultMatrixf 
      this.mtx[i*4+j] = mtx[i][j]; 
     } 
    } 

} 

, 내가 보는 내 수학 기능을 살펴해야하지 않을 경우 나,이 코드 조각 어딘가에 오류입니다 호핑 해요 : 여기에 카메라 행렬 생성 코드는 무슨 일이야 ..

EDIT2 : 적어도 초기 벡터 (눈, 중심, 최대)는 정확해야하며 카메라를 놓아야 할 곳 (gluLookAt으로 작업했지만 깜박 거리는 문제가 있음)을 언급해야합니다.

+1

게시 한 코드에 아무런 문제가 없습니다 (gluPerspective의 두 번째 인수 인 w/h 비율을 예상하는 경우 제외). 나는 카메라 매트릭스가 틀린 것보다 다른 어떠한 설명도 생각할 수 없다. – Kos

+0

예, 'h'변수의 너비/높이입니다. 왜 누군가가 그것을 'h'라고했는지 모르겠습니다 (그룹 작업). 어쨌든, 행렬을 작성해야하는 코드를 게시했습니다. someoen이 내가 잘못하고있는 것을 발견 할 수 있기를 바랍니다. – Zepee

+0

맞춤형 카메라 매트릭스 대신 ol 'good'gluLookAt'을 사용하지 않는 이유는 무엇입니까? – Kos

답변

1

수정했습니다. 문제는 glMultMatrix (float [] matrix, int? ofset?)를 사용하는 것입니다 ... glMultMatrix (FloatBuffer matrix)를 사용하면 어떤 이유로 든 정상적으로 작동합니다.

변환과 관련하여 몇 가지 문제가 있지만이를 처리 할 수 ​​있어야합니다 ... 입력을 주셔서 감사합니다.

5

수학이 괜찮 으면 (사실상 UpVec가 실제로 정의되어있는 한) glRotatef, glTranslatef 및 glFrustum을 사용하여 카메라를 만드는 것이 더 간단 할 수도 있습니다. 대부분의 3D 그래픽에서는 추적하려는 정의 된 오브젝트가 없습니다. 마침내 이것에 정착하기 전에 gluLookAt를 사용하여 3D 카메라의 다양한 구현을 살펴 보았습니다. 여기

이 내 카메라를 정의하는 경향이 방법입니다 : 내가 만들 때

또는 내 카메라를 초기화 나는 glFrustum과 투영 행렬을 설정합니다.

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(left, right, down, up, near, far); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

을 내가 렌더링 패스의 색상과 깊이 버퍼를 취소 한 후 다음 나는 위치와 카메라의 방향을

glLoadIdentity(); 
glRotated(orientation.x, 1.0, 0.0, 0.0); 
glRotated(orientation.y, 0.0, 1.0, 0.0); 
glRotated(orientation.z, 0.0, 0.0, 1.0); 
glTranslatef(position.x, position.y, position.z); 

전화 : 당신이 원하는 경우 glPerspecive를 사용할 수 있습니다. 처음에는 위치와 방향을 둘 다 {0}으로 설정 한 다음 키를 누를 때 위치에서 더하거나 빼고 마우스를 움직일 때 orientation.x에서 orientation.x를 더하거나 뺍니다 ... (일반적으로 ' T 엉망진창 오리엔테이션 .z)

건배.

+0

카메라를 제어하기 위해 glRotate/glTranslate를 직접 사용하지 않으려 고하는 유일한 이유는 프로그램의 속도를 늦추는 나쁜 해킹과 수십이라고 들었다는 것입니다. 하지만 네가 그걸 가지고 어디로 가고 있는지 나는 알 수있다. – Zepee