2012-04-04 2 views
1

Помогите мне пожалуйста с лучевым собираниемOpenGL ES 2.0 Ray Сбор, далека точка

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_point до far_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:

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) и т. Д. Координаты преобразуются так, что точка, лежащая на ближней плоскости, будет иметь a-координату 1, а одна, лежащая только на дальней плоскости, будет иметь a-координату -1. Это числа, которые используются для тестирования глубины, если вы его включили.

Итак, как вы могли догадаться, когда вы хотите преобразовать местоположение экрана обратно в точку в 3D-пространстве, на самом деле у вас есть несколько точек на выбор - линия, по сути, простирается от ближней плоскости до далекой плоскости. В нормализованных координатах устройства это линия, простирающаяся от z = -1 до z = 1. Таким образом, процесс выполняется следующим образом:

  • преобразовать координаты х и у в нормализованное устройстве координат х «и у»
  • Для каждого из г «= 1 и г» = -1:
    • преобразования координат в нормированные координаты устройства (см) here for the formula
    • применить обратную матрицу проекции
    • применить обратную матрицу модели/представления (как перед любым объектом на-преобразований)

Результатом являются две координаты вашей линии в трехмерном пространстве.

+0

Я не уверен, это правда – SAKrisT

+0

вы правы!но нужны еще одна операция с результатами! – SAKrisT