2012-01-23 137 views
3

我希望能夠點擊觸摸屏並使用觸摸的點作爲用於拾取的光線的起始座標。將觸摸屏座標轉換爲iPhone上的Opengl世界座標

如何將觸摸屏返回的點轉換爲我可以在GL世界座標系中使用的點?

搜索帶來了許多令人困惑的可能性,包括使用gluUnProject以及大量關於它是否受支持以及如何移植的報告。

有人可以直接爲我打好嗎?

我正在使用Objective C,Xcode和我正在爲iPhone編譯。

回答

3

步驟0:獲取gluUnproject:

需要它的報道屬實。該功能爲您完成所有繁重的工作。我知道MESA項目有一個實現,在沒有修改的情況下,在iOS上幾乎完美的工作。我不確定這是否仍然可用。除此之外,你只需要對它進行一些研究,或者推出自己的或者移植別人的。線性代數有點沉重,祝你好運。

第1步:轉換從UIKit的座標OpenGL的座標:

這通常包括兩件事情:

  1. 翻轉Y座標,因爲UIKit的喜歡它的左上角的起源,而OpenGL喜歡它的左下角。

    touchLocation.y = [[self view] bounds].size.height - touchLocation.y; 
    
  2. 從「屏幕單位」轉換爲像素。這可以保持標準和視網膜顯示設備的一致性。

    CGFloat scale = [[UIScreen mainScreen] scale]; 
    touchLocation.y *= scale; 
    touchLocation.y *= scale; 
    

第3步:使用gluUnproject你的座標系轉換:

gluUnproject()窗口空間中的三維點轉換技術在世界空間中的三維點。因此,要得到一束光線,您需要調用兩次:一次用於近剪裁平面,一次用於遠剪裁平面。這會給你兩點,從中你可以得到一個射線。要調用gluUnproject(),您需要訪問您的2D視圖座標,當前的OpenGL視口,當前的OpenGL模型視圖矩陣和當前的OpenGL投影矩陣。僞代碼:

Vector3 near, far; 
gluUnProject(touchLocation.x, touchLocation.y, 0, _modelview, _projection, _viewport, &near.x, &near.y, &near.z); 
gluUnProject(touchLocation.x, touchLocation.y, 1, _modelview, _projection, _viewport, &far.x, &far.y, &far.z); 
return MakeRay(near, Vector3Subtract(far, near)); 
+0

我已經實施gluUnproject了。在你的僞代碼中,viewportcoord是在步驟1之後觸摸的屏幕座標?爲什麼從遠近計算射線的遠點? – Dave

+0

@Dave是,viewportcoord是視口中的水龍頭位置。爲了清晰起見,我編輯了代碼。在數學上,一條射線被定義爲一個向量原點,以及一個從原點開始的向量方向。所以「射線的遠點」不是絕對點,它是從近點開始的向量,指向遠點,它被計算爲(遠近)。 –

+0

我的解決方案並不完美,但我認爲這與我的射線碰撞方程相比,我的射線座標更重要。謝謝你通過幫助解釋make ray部分。 – Dave

相關問題