2012-04-04 82 views
1

請幫助我與射線採摘OpenGL ES 2.0的雷採摘,遠點

float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(35.0f), aspect, 0.1f, 1000.0f); 

GLKMatrix4 modelViewMatrix = _mainmodelViewMatrix; 


    // some transformations 

_mainmodelViewMatrix = modelViewMatrix; 

_modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); 
_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); 

_modelViewProjectionMatrix和_normalMatrix把着色器

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

,並在觸摸結束

GLKVector4 normalisedVector = GLKVector4Make((2 * position.x/self.view.bounds.size.width - 1), 
              (2 * (self.view.bounds.size.height-position.y)/self.view.bounds.size.height - 1) , //1 - 2 * position.y/self.view.bounds.size.height, 
               -1, 
               1); 
GLKMatrix4 inversedMatrix = GLKMatrix4Invert(_modelViewProjectionMatrix, nil); 


GLKVector4 near_point = GLKMatrix4MultiplyVector4(inversedMatrix, normalisedVector); 

如何我可以得到遠點?我的近點是否正確?

謝謝!

回答

1

我們可以從near_pointfar_point畫線。

GLKVector4 normalisedVector = GLKVector4Make((2 * position.x/self.view.bounds.size.width - 1), 
               (2 * (self.view.bounds.size.height-position.y)/self.view.bounds.size.height - 1), 
                -1, 
                1); 

    GLKMatrix4 inversedMatrix = GLKMatrix4Invert(_modelViewProjectionMatrix, nil); 

    GLKVector4 near_point = GLKMatrix4MultiplyVector4(inversedMatrix, normalisedVector); 

    near_point.v[3] = 1.0/near_point.v[3]; 
    near_point = GLKVector4Make(near_point.v[0]*near_point.v[3], near_point.v[1]*near_point.v[3], near_point.v[2]*near_point.v[3], 1); 

    normalisedVector.z = 1.0; 
    GLKVector4 far_point = GLKMatrix4MultiplyVector4(inversedMatrix, normalisedVector); 

    far_point.v[3] = 1.0/far_point.v[3]; 
    far_point = GLKVector4Make(far_point.v[0]*far_point.v[3], far_point.v[1]*far_point.v[3], far_point.v[2]*far_point.v[3], 1); 
2

它看起來你有

GLKVector4 normalisedVector = GLKVector4Make((2 * position.x/self.view.bounds.size.width - 1), 
    (2 * (self.view.bounds.size.height-position.y)/self.view.bounds.size.height - 1) , 
    -1, 1); 

(唷)來計算近點的歸一化設備座標。

爲了讓遠點,只是交換了1-1 Z座標:

GLKVector4 normalisedFarVector = GLKVector4Make((2 * position.x/self.view.bounds.size.width - 1), 
    (2 * (self.view.bounds.size.height-position.y)/self.view.bounds.size.height - 1) , 
    1, 1); 

並應用相同的逆變換了這一點。這應該夠了吧。背景:在正常情況下,GL接收到的將片段轉換爲像素的最終座標稱爲歸一化設備座標。這些位於角點位於(-1,-1,-1_和(1,1,1)的立方體內,因此屏幕中心是(0,0,z),左上角是(-1 ,1,z)等座標變換,使得位於近平面上的點的z座標爲1,而位於遠平面上的點的z座標爲-1,這些數字是用於深度測試,如果你打開它的話

所以,正如你可能猜到的那樣,當你想要將屏幕位置轉換回3D空間中的一個點時,實際上有多個點可供選擇 - 一條線,實際上是從近平面延伸到遠平面,在歸一化的設備座標系中,這條線是從z = -1到z = 1的線,所以過程如下:

  • 轉換x和y座標轉換成歸一化設備座標x '和y'
  • 對於每個z的 '= 1和Z'= -1:
    • 轉換的座標歸一化設備座標(參見here for the formula
    • 應用投影矩陣的逆
    • 應用模型/視圖矩陣的逆矩陣(因爲它是任何每對象變換前)

結果是3D空間中您的線條的兩個座標。

+0

我不知道,這是真的 – SAKrisT 2012-04-06 16:25:25

+0

你說得對!但是,需要一個更多的操作和結果! – SAKrisT 2012-04-10 14:50:31