帮我选射线

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

如何获得远点?而我的near_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);

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

并对其应用相同的逆变换。这应该够了吧。

背景:通常情况下,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空间中的两个坐标。

    10-08 06:29