2012-11-17 47 views
1

我目前正在使用增強現實,爲此我想使用陀螺儀和Core Motion。我研究了Apple pARk示例代碼,我瞭解了大部分我花時間閱讀文檔的數學,因爲乍一看還不清楚!一切都很好,直到我試圖使它在橫向模式下工作。在橫向模式下使用Core Motion

我不會在這裏解釋所有的理論,它會太長。但對於那些經歷過它的人來說,我的問題是,我們採用態度的旋轉矩陣來將這個旋轉應用到我們的座標上。好吧,直到這裏纔算正常,但Core Motion似乎並不適應風景模式。我在這個問題上看到了類似的問題,但看起來沒有人有解決方案。

於是,我就做我自己,這裏就是我的想法:

每次我們旋轉裝置景觀,+ -90°旋轉時(取決於景觀左或右)。我決定創建一個4X4旋轉矩陣來應用這個旋轉。然後乘到cameraTransform矩陣(態度的3X3 CMRotationMatrix以4X4的自適應),然後我們獲得矩陣cameraTransformRotated:

- (void)createMatLandscape{ 
switch(cameraOrientation){ 
    case UIDeviceOrientationLandscapeLeft: 
     landscapeRightTransform[0] = cos(degreesToRadians(90)); 
     landscapeRightTransform[1] = -sin(degreesToRadians(90)); 
     landscapeRightTransform[2] = 0; 
     landscapeRightTransform[3] = 0; 

     landscapeRightTransform[4] = sin(degreesToRadians(90)); 
     landscapeRightTransform[5] = cos(degreesToRadians(90)); 
     landscapeRightTransform[6] = 0; 
     landscapeRightTransform[7] = 0; 

     landscapeRightTransform[8] = 0; 
     landscapeRightTransform[9] = 0; 
     landscapeRightTransform[10] = 1; 
     landscapeRightTransform[11] = 0; 

     landscapeRightTransform[12] = 0; 
     landscapeRightTransform[13] = 0; 
     landscapeRightTransform[14] = 0; 
     landscapeRightTransform[15] = 1; 

     multiplyMatrixAndMatrix(cameraTransformRotated, cameraTransform, landscapeRightTransform); 
     break; 
    case UIDeviceOrientationLandscapeRight: 
     landscapeLeftTransform[0] = cos(degreesToRadians(-90)); 
     landscapeLeftTransform[1] = -sin(degreesToRadians(-90)); 
     landscapeLeftTransform[2] = 0; 
     landscapeLeftTransform[3] = 0; 

     landscapeLeftTransform[4] = sin(degreesToRadians(-90)); 
     landscapeLeftTransform[5] = cos(degreesToRadians(-90)); 
     landscapeLeftTransform[6] = 0; 
     landscapeLeftTransform[7] = 0; 

     landscapeLeftTransform[8] = 0; 
     landscapeLeftTransform[9] = 0; 
     landscapeLeftTransform[10] = 1; 
     landscapeLeftTransform[11] = 0; 

     landscapeLeftTransform[12] = 0; 
     landscapeLeftTransform[13] = 0; 
     landscapeLeftTransform[14] = 0; 
     landscapeLeftTransform[15] = 1; 

     multiplyMatrixAndMatrix(cameraTransformRotated, cameraTransform, landscapeLeftTransform); 
     break; 
    default: 
     cameraTransformRotated[0] = cameraTransform[0]; 
     cameraTransformRotated[1] = cameraTransform[1]; 
     cameraTransformRotated[2] = cameraTransform[2]; 
     cameraTransformRotated[3] = cameraTransform[3]; 

     cameraTransformRotated[4] = cameraTransform[4]; 
     cameraTransformRotated[5] = cameraTransform[5]; 
     cameraTransformRotated[6] = cameraTransform[6]; 
     cameraTransformRotated[7] = cameraTransform[7]; 

     cameraTransformRotated[8] = cameraTransform[8]; 
     cameraTransformRotated[9] = cameraTransform[9]; 
     cameraTransformRotated[10] = cameraTransform[10]; 
     cameraTransformRotated[11] = cameraTransform[11]; 

     cameraTransformRotated[12] = cameraTransform[12]; 
     cameraTransformRotated[13] = cameraTransform[13]; 
     cameraTransformRotated[14] = cameraTransform[14]; 
     cameraTransformRotated[15] = cameraTransform[15]; 

     break; 
} 
} 

然後就在我們更新所有我做的這點:

multiplyMatrixAndMatrix(projectionCameraTransform, projectionTransform, cameraTransformRotated); 

之後,其餘的代碼保持不變,我只是希望註解以橫向方向正確顯示。現在,這是我唯一的想法,橫向渲染效果不好,我將設備移動到右側或左側,註釋向下或向上移動(就像當我沒有添加此代碼時)。

有沒有人想出一個解決方案?我會繼續尋找,特別是在CMRotationMatrix上,它似乎不是一個典型的旋轉矩陣,我找不到任何文檔明確說明這個矩陣的不同元素。

+0

我po在這裏提出了一個類似的問題:http://stackoverflow.com/questions/11906611/augmented-reality-app-in-landscape-mode –

+0

運行這個計算出來嗎?這太痛苦了! –

回答

2

我剛剛設法適應了這個(蘋果的pARk示例)到風景(右)昨天,並希望分享所做的更改。它看起來工作正常,但請發出任何錯誤。這隻支持風景,但可能很容易適應左側。

在ARView.m,

在 - (無效)初始化,切換邊界高度和寬度

createProjectionMatrix(projectionTransform, 60.0f*DEGREES_TO_RADIANS, self.bounds.size.height*1.0f/self.bounds.size.width, 0.25f, 1000.0f); 

在 - (無效)startCameraPreview

[captureLayer setOrientation:AVCaptureVideoOrientationLandscapeRight]; 

在 - (空)drawRect:

//switch x and y 
float y = (v[0]/v[3] + 1.0f) * 0.5f; 
float x = (v[1]/v[3] + 1.0f) * 0.5f; 

poi.view.center = CGPointMake(self.bounds.size.width-x*self.bounds.size.width, self.bounds.size.height-y*self.bounds.size.height); //invert x 
+0

哇謝謝你的分享!我會試一試,讓你知道;) –

+0

對不起,我最近很忙:)是它支持風景很好,謝謝你的努力,但我恐怕在數學上它是錯的,我的第一個解決方案是錯誤的太。我們剛剛切換變量。一個好的解決方案是重新映射設備座標系,它可以在Android上運行,並且運行良好。爲什麼iOS會不提供這些? 無論如何感謝您的努力:) –

+0

我也試過這個以及它不起作用。由於它被偷偷操縱,適當的比例不適用於x和y座標。視圖沿一個軸快速移動,並沿另一個軸緩慢移動。然後是相反風景方向的逆。 –