2013-11-28 48 views
0

我想圍繞OpenGL中的對象繞軌道運行相機。沒有發生。這裏是我的代碼:OpenGL ES圍繞對象的軌道相機

該對象是標準的多維數據集。

- (void)update { 

    float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 

    float radius = 10.0f; 
    float startAngle = -3 * M_PI/4.0; 

    float newX = 0.0f + radius *cos(phi)*sin(theta); 
    float newY = 0.0f + radius *sin(phi)*sin(theta); 
    float newZ = 0.0f + radius *cos(theta); 

    GLKMatrix4 projectionMatrix = GLKMatrix4MakeLookAt(newX, 0.0, newZ 
                 0.0, 0.0, 0.0, 
                 0.0, 1.0, 0.0); 


    self.effect.transform.projectionMatrix = projectionMatrix; 

    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 0.0f); 
    self.effect.transform.modelviewMatrix = modelViewMatrix; 



} 



-(void) viewPanned:(UIPanGestureRecognizer *) sender 

{ 

    CGPoint curTouch = [sender locationInView:self.view]; 

    if ([sender state] == UIGestureRecognizerStateBegan){ 
     oldX = curTouch.x; 
     oldY = curTouch.y; 

    } 


    theta += (curTouch.x-oldX)*0.001f; 
    phi += (curTouch.y-oldY)*0.001f; 

    oldX = curTouch.x; 
    oldY = curTouch.y; 
} 
+0

我不看到,從變換的投影矩陣眼座標剪輯座標(由'theta' /'phi'旋轉)。這可能是你的問題的一部分......除此之外,它可能有助於澄清「不太可能發生」。 – rickster

+0

GLKMatrix4 projectionMatrix = GLKMatrix4MakeLookAt(newX,0.0,newZ 0.0,0.0,0.0, 0.0,1.0,0.0); 這是一個投影矩陣?或者我錯過了什麼?在這種情況下也不會發生意味着白屏,沒有任何東西。 – Stpn

回答

3

你的模型視圖和投影矩陣設置不正確 - 他們兩個之間你有一個模型視圖轉變,但沒有從眼睛空間投影到剪裁空間。

爲了理解爲什麼,它有助於研究座標空間,轉換以及它們在3D圖形編程中的共同角色......這裏有很多很好的教程(like this one - 用於桌面GL,並使用C++ GLM對於iOS,你最好使用GLKit數學,但概念是相同的),但這裏有一個快速概述。


在傳統的圖形管道(如仿照由GLKBaseEffect),有四個座標空間,你可能會在意:

  • 型號空間任意座標系的頂點數據定義例如,如果您正在繪製具有許多四方形狀的場景,則可以定義一個以原點爲中心的單位立方體,並使用變換將它拉伸,移動並旋轉到場景中的各個位置。

  • 世界空間是任意座標系統,您在設計場景。例如,如果您使用的立方體畫一個城市景觀,你可以把原點街角和翻譯在X立方和Z方向來建造建築物。

  • 眼睛(或相機或視圖)座標空間根據您如何查看場景來定義。前兩個空格可以用任何對您來說都很方便的方式來定義,但是用這個空格開始是空間開始映射到屏幕的規則。在眼睛空間中,X軸向右增加,Y軸向上增加,Z軸指向您 - 也就是說,相機朝負Z方向看。

  • Clip空間就是橡膠與路面接觸的地方 - 這是OpenGL(ES)選擇繪製什麼以及它在屏幕上的位置。因此,它的定義非常嚴格:立方體中所有三個軸從-1.0延伸到1.0的任何內容都會出現在屏幕上。 (任何超出該立方體的東西都會被「裁剪」)。與眼睛空間一樣,+ X是正確的,+ Y是向上的,並且+ Z更接近觀看者。

頂點處理採用多達三個轉變(通常連接在一起),讓您的頂點數據(在模型空間中指定)的所有剪輯空間,以便使OpenGL(ES)可以借鑑的方式。每個轉換由4x4矩陣指定(其中GLKBaseEffectGLKMatrix4),它本身可能是幾個轉換的串聯。

  • 模式矩陣從模型到世界空間變換。那個城市景觀的例子?對於每座建築,您都可以在一個方向上縮放立方體以創建摩天大樓,然後在X和Z方向上翻譯它以放置在世界中 - 這是一種模型轉換。

  • The 查看矩陣從世界變爲眼睛空間。你可以建立從平移和旋轉視圖矩陣(畢竟,移動相機是一樣的,在相反的方向移動世界),但大多數3D數學庫給你喜歡GLKMatrix4MakeLookAt的便利,讓您指定的觀點來講變換a)相機的位置,b)您正在看的點,以及c)哪個方向應該「向上」。

  • 投影矩陣從眼空間變換到剪輯空間。通常使用的透視投影(GLKMatrix4MakePerspective),它定義了可以在一個視角而言,縱橫比,以及近和遠極限看到。 (換句話說,您可以看到的區域適合從金字塔向外擴展到無窮遠的金字塔內,並且我們從該金字塔切出一個截面或截面,以定義實際在屏幕上繪製的深度範圍。)

爲了讓您的頂點數據呈現在屏幕上,它要經過三個轉變 - 通常他們相乘創建ModelViewProjection矩陣,然後提供給GPU用於將每個頂點位置。照明計算通常在眼睛空間中完成,因此您通常分別向GPU提供ModelView矩陣(或者更確切地說,它的逆轉置,用於轉換表面法線)。

當您使用GLKBaseEffect時,您提供了一個ModelView矩陣和一個Projection矩陣,並根據需要將它們相乘或相反。


還在嗎? :)

什麼,你所得到的是從模型空間變換到眼睛空間。 (在簡單的場景像你這樣的,模型空間和世界空間往往是一樣的。)你沒有一個投影變換到剪裁空間,因此,如果它應該是剪輯空間的OpenGL ES的解釋你的眼睛空間。根據您的頂點座標是什麼,您的所有幾何圖形可能會在-1到1的立方體之外,因此您將看不到任何東西。

您到目前爲止所有的轉換都應該相乘並作爲ModelView矩陣提供給GLKBaseEffect。然後,創建使用您已經計算出的縱橫尺寸比的透視投影(GLKMatrix4MakePerspective)並將其提供給GLKBaseEffect作爲投影矩陣。

+0

謝謝,我想我現在明白了。將開始實施。 – Stpn