2011-05-10 3 views
1

OpenGen ES1에서 카메라를 회전하기 위해 지자기 및 가속도계를 변환하려고합니다. Android에서 코드를 발견하고이 코드를 iPhone 용으로 변경했습니다. 실제로는 더 많거나 적게 작동합니다.iPhone에서 OpenGL 용 방향 장치 가져 오기

- (void) GetAccelerometerMatrix:(GLfloat *) matrix headingX: (float)hx headingY:(float)hy headingZ:(float)hz; 
{ 

    _geomagnetic[0] = hx * (FILTERINGFACTOR-0.05) + _geomagnetic[0] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[3] * (0.55); 
    _geomagnetic[1] = hy * (FILTERINGFACTOR-0.05) + _geomagnetic[1] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[4] * (0.55); 
    _geomagnetic[2] = hz * (FILTERINGFACTOR-0.05) + _geomagnetic[2] * (1.0 - FILTERINGFACTOR-0.5)+ _geomagnetic[5] * (0.55); 

    _geomagnetic[3]=_geomagnetic[0] ; 
    _geomagnetic[4]=_geomagnetic[1]; 
    _geomagnetic[5]=_geomagnetic[2]; 


     //Clear matrix to be used to rotate from the current referential to one based on the gravity vector 
    bzero(matrix, sizeof(matrix)); 



    //MAGNETIC 
    float Ex = -_geomagnetic[1];  
    float Ey =_geomagnetic[0]; 
    float Ez =_geomagnetic[2]; 

    //ACCELEROMETER 
    float Ax= -_accelerometer[0]; 
    float Ay= _accelerometer[1] ; 
    float Az= _accelerometer[2] ; 


    float Hx = Ey*Az - Ez*Ay; 
    float Hy= Ez*Ax - Ex*Az; 
    float Hz = Ex*Ay - Ey*Ax; 

    float normH = (float)sqrt(Hx*Hx + Hy*Hy + Hz*Hz); 


    float invH = 1.0f/normH; 
    Hx *= invH; 
    Hy *= invH; 
    Hz *= invH; 

    float invA = 1.0f/(float)sqrt(Ax*Ax + Ay*Ay + Az*Az); 
    Ax *= invA; 
    Ay *= invA; 
    Az *= invA; 

    float Mx = Ay*Hz - Az*Hy; 
    float My = Az*Hx - Ax*Hz; 
    float Mz = Ax*Hy - Ay*Hx; 

    // if (mOut.f != null) { 

    matrix[0] = Hx; matrix[1] = Hy; matrix[2] = Hz; matrix[3] = 0; 
    matrix[4] = Mx; matrix[5] = My; matrix[6] = Mz; matrix[7] = 0; 
    matrix[8] = Ax; matrix[9] = Ay; matrix[10] = Az; matrix[11] = 0; 
    matrix[12] = 0;  matrix[13] = 0;  matrix[14] = 0; matrix[15] = 1; 


} 

glLoadMatrixf((GLfloat*)matrix);이 도움을 주셔서 대단히 감사합니다,하지만 난 OpenGL을 ES1에 코드도 통화를 보류,이 실수를 찾을 미안 수없는 몇 가지 실수가 있습니다.

편집 : iPhone은 가로 방향으로 영구히 있으며, OpenGL Es로 그려진 개체가 두 번 나타나기 때문에 문제가 있음을 알고 있습니다.

+0

나는 그것이 의미하는 바를 알만큼 충분히 똑똑했으면 좋겠다. 롤. –

답변

1

게시 된 코드에 문제가있는 것을 찾을 수 없으므로 문제가 다른 곳에서 제기 될 수 있습니다. 도움이된다면 게시 된 코드에 대한 분석은 다음과 같습니다.

_geomagnetic 0-5를 다루는 처음 6 행은 메소드를 일정한 간격으로 호출한다고 가정하는 매우 간단한 저주파 필터에 영향을 미칩니다. 따라서 자력 계의 벡터로 끝나면 고주파 지터가 제거됩니다.

bzero는 결과를 0으로 만들어 누적 될 준비가되었습니다.

Hz까지의 선언과 지정까지 줄은 자력계 및 가속도계 벡터를 취해 교차 곱을 수행합니다. 따라서 H (x, y, z)는 가속도계 (아래로 추측 됨)와 자력계 (앞으로 + 약간 위쪽으로)의 직각에있는 벡터입니다. 그 쪽 벡터를 호출하십시오.

invH 및 invA 항목은 invA에 의한 Az 곱하기까지 측면 및 가속도계/벡터 벡터가 단위 길이임을 확인합니다.

그런 다음 측면 벡터와 아래쪽 벡터의 외적 (즉, 두 벡터에 직각 인 벡터)으로 M (x, y, z)이 만들어집니다. 그래서 그것은 앞쪽의 벡터를줍니다.

마지막으로 3 개의 벡터를 사용하여 직교 정규 3x3 행렬의 역행렬을 사용하여 행렬을 채 웁니다 (그러나 이는 일이 배치 된 방식으로 숨겨져 있습니다. 배열 인덱스). 실제로 행렬에있는 모든 것을 직접 설정했기 때문에 bzero는 순수한 결과 용어로는 필요하지 않았습니다.

glLoadMatrixf은 OpenGL ES 1.x에서 임의의 열 - 주요 행렬을 곱하는 방식이므로 올바른 것입니다.

+0

대단히 설명해 주셔서 감사합니다. 문제는 iPhone에 있었고 지금은 제대로 작동하고 있습니다. : D – Gustavo

2

애플의 GLGravity 샘플 코드를 보았습니까? 가속도계 입력의 변화에 ​​따라 모델 뷰 매트릭스를 조작하여 여기에서 원하는 것과 매우 유사한 작업을 수행합니다.

+0

그래, 내 코드는 GLGravity 예제에서 더 적은 o를 기반으로하지만, 또한 지자기 데이터를 수정해야합니다. – Gustavo

관련 문제