Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS使用GLKMathUnproject在世界空间中查找屏幕点_Ios_Objective C_Ipad_Opengl Es 2.0_Glkit - Fatal编程技术网

iOS使用GLKMathUnproject在世界空间中查找屏幕点

iOS使用GLKMathUnproject在世界空间中查找屏幕点,ios,objective-c,ipad,opengl-es-2.0,glkit,Ios,Objective C,Ipad,Opengl Es 2.0,Glkit,如何使用GLKMathUnproject确定世界空间中的位置? 用户需要从世界空间中的多个对象中选择一个 在文件里写着 GLKVector3 GLKMathUnproject ( GLKVector3 window, GLKMatrix4 model, GLKMatrix4 projection, int *viewport, bool *success ); 但是哪个模型视图矩阵?我在世界上有很多模特。我应该使用哪个模型矩阵 我的世界是二维的,在x,y平面上。z

如何使用GLKMathUnproject确定世界空间中的位置? 用户需要从世界空间中的多个对象中选择一个

在文件里写着

GLKVector3 GLKMathUnproject (
   GLKVector3 window,
   GLKMatrix4 model,
   GLKMatrix4 projection,
   int *viewport,
   bool *success
);
但是哪个模型视图矩阵?我在世界上有很多模特。我应该使用哪个模型矩阵

我的世界是二维的,在x,y平面上。z用于相机移动

如果我理解正确,
GLKMathUnproject
用于在模型空间中查找点。
我怎么知道是哪种型号?我需要先确定手指下面的模型还是什么?

创建一个简单的项目,您可以从Xcode的模板创建这个项目,称为“OpenGL游戏”

模型-modelViewMatrix或self.effect.transform.modelViewMatrix

投影-projectionMatrix或self.effect.transform.projectionMatrix

视口:

GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
您的代码将类似于:

GLKVector point = ...;
bool boolValue;    
GLKMathUnproject(point,
                         modelViewMatrix,
                         projectionMatrix, viewport, &boolValue);
所以,如果你想不投射到世界空间,你只需要使用你的注视矩阵。
如果要取消投影到特定对象的模型空间,则使用
model*view
matrix.

确定,但使用哪个模型矩阵?我不能理解。这是相机的模型矩阵还是某个物体的模型矩阵?这是你最后一次重新定位时放在着色器上的模型矩阵。不,不是这样的。这只是一个我在任何地方都使用的常规视图矩阵<代码>GLKMatrix4MakeLookAt(视图x、视图y、视图z、视图x、视图y、0.0f、0.0f、1.0f、0.0f)这对我来说很有用。这是我2d世界的lookAt matrix<代码>视图x,
视图y
视图z
是控制摄像机位置的参数。用户输入修改这些参数。我在opengl网站上找到
- (IBAction)handleTapUnproject:(id)recognizer
{    
    bool success = NO;
    GLfloat realY;

    GLint viewport[4] = {};
    glGetIntegerv(GL_VIEWPORT, viewport);
    NSLog(@"%d, %d, %d, %d", viewport[0], viewport[1], viewport[2], viewport[3]);

    CGPoint touchOrigin = [recognizer locationInView:self.view];
    NSLog(@"tap coordinates: %8.2f, %8.2f", touchOrigin.x, touchOrigin.y);

    realY = viewport[3] - touchOrigin.y;

    GLKMatrix4 modelView = lookAt;

    // near

    GLKVector3 originInWindowNear = GLKVector3Make(touchOrigin.x, realY, 0.0f);

    GLKVector3 result1 = GLKMathUnproject(originInWindowNear, modelView, projectionMatrix, viewport, &success);
    NSAssert(success == YES, @"unproject failure");

    GLKMatrix4 matrix4_1 = GLKMatrix4Translate(GLKMatrix4Identity, result1.x, result1.y, 0.0f);
    _squareUnprojectNear.modelMatrixUsage = GLKMatrix4Multiply(matrix4_1, _squareUnprojectNear.modelMatrixBase);

    GLKVector3 rayOrigin = GLKVector3Make(result1.x, result1.y, result1.z);

    // far

    GLKVector3 originInWindowFar = GLKVector3Make(touchOrigin.x, realY, 1.0f);

    GLKVector3 result2 = GLKMathUnproject(originInWindowFar, modelView, projectionMatrix, viewport, &success);
    NSAssert(success == YES, @"unproject failure");

    GLKMatrix4 matrix4_2 = GLKMatrix4Translate(GLKMatrix4Identity, result2.x, result2.y, 0.0f);

    GLKVector3 rayDirection = GLKVector3Make(result2.x - rayOrigin.x, result2.y - rayOrigin.y, result2.z - rayOrigin.z);
}