2014-05-05 48 views
1

我已經使用GLKMathUnProject來實現射線拾取,以便我可以觸摸3D空間中的對象。現在我想要做的是(例如)在該對象上方顯示一個標籤。所以我需要將3D空間轉換爲2D屏幕corrds(我知道使用OpenGl和UIKit是一個糟糕的主意,並且已經實現了紋理文本)。GLKMathProject:繪製基於OpenGl的UIView Corrds

我在下面使用了下面的方法,但是我想我錯過了一些東西。我得到一臺iPad,該項目是在我的面前,說實話不知道該怎麼帶z:
{922.111,763.055,0.990884}

GLKVector3 x = GLKMathProject(building.position, _baseModelViewMatrix, _projectionMatrix, viewport); 

    NSLog(@"%@", NSStringFromGLKVector3(x)); 

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x.x, x.y, 50, 20)]; 
    label.text = @"TEST"; 
    [self.view addSubview:label]; 
+0

問題是什麼?您可能需要將這些座標除以2.0來顯示視網膜。 Z座標對你的情況沒用。順便說一下,OpenGL和UIKit混合使用遠非壞主意。 –

+0

噢好吧,這是視網膜,它可以顯示標籤上面的3d像名稱和東西(動態)發短信一切似乎過度殺傷 – Burf2000

+0

請張貼解決方案, – Burf2000

回答

1

你得到的結果向量依賴於做視口座標系,而不是視圖座標系。通常,X和Y必須除以視口寬度和高度,然後乘以視圖寬度和高度。在你的情況下,這是由於視網膜顯示除以2。

至於Z座標,你不需要它的位置,但你可以使用它的Z順序。例如,如果您有多個文本標籤,您可以按Z值對它們進行排序,以便後面的那些標籤可以保持在後面,如果其中兩個位於同一屏幕位置,則正確的位置在前面。你也可以用這個值來縮小一些標籤。

至於混合UIKit與OpenGL應該沒有問題,它不是一個壞習慣。你應該注意到,雖然你不能混合深度緩衝區:你將無法在某個標籤前面畫一些OpenGL繪製的對象。 如果最終你選擇在OpenGL中繪製標籤,我建議從UIView(或標籤)創建一個圖像,並將其用作紋理,而不是試圖找到一些用於文本繪製的庫。通過這樣做,您將能夠使用已經完成的所有工具,例如字體,顏色,包裝...