Ios OpenGL ES 2.0光线拾取,远点

Ios OpenGL ES 2.0光线拾取,远点,ios,opengl-es-2.0,coordinate-systems,ray-picking,Ios,Opengl Es 2.0,Coordinate Systems,Ray Picking,请帮我接雷 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

请帮我接雷

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);
我怎么才能走远点?我的近邻点正确与否

谢谢

看起来你有

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);
(phew)计算近点的标准化设备坐标

要获得远点,只需将
-1
z坐标交换为
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);
并对其应用相同的逆变换。这应该能奏效

背景:在正常情况下,德国劳埃德船级社接收到的用于将碎片转化为像素的最终坐标称为标准化设备坐标。它们位于一个角位于(-1,-1,-1_u)和(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中的每一个:
    • 将坐标转换为标准化设备坐标(请参见)
    • 应用投影矩阵的逆矩阵
    • 应用模型/视图矩阵的逆矩阵(在任何每对象变换之前)

结果是三维空间中直线的两个坐标。

我们可以从近点远点绘制直线

  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);