2013-10-10 1 views
0

Этот вопрос также размещен на форуме Apple Dev, но у меня нет ответов там, поэтому, надеюсь, кто-то здесь поймает то, что я здесь делаю неправильно!GLKMathProject возвращает {NaN, y, z}

Я относительно не знаком с OpenGLES и GLKit, и я пытаюсь получить координаты экрана объекта, который я нарисовал в {x, y, z} в пространстве объектов. Я написал небольшой удобный метод:

-(GLKVector3)projectX:(float)x Y:(float)y Z:(float)z zRot:(float)rot scale:(float)s 
{ 
    GLKVector3 retVal; 
    CGSize viewSize = self.view.bounds.size; 
    GLKVector3 object = GLKVector3Make(x, y, z); 
    int viewPort[4]; 
    viewPort[0] = 0; 
    viewPort[1] = 0; 
    viewPort[2] = (int)viewSize.width; 
    viewPort[3] = (int)viewSize.height; 
    float aspect = fabsf(viewPort[2]/viewPort[3]); 
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65), aspect, 0.1f, 100); 
    GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0, 0.0, 0.0); 
    // _rotation is an iVar that takes the device angle into consideration. 
    baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0, 0.0, 1.0f); 
    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(x, y, z); 
    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, rot, 0.0, 0.0, 1.0); 
    modelViewMatrix = GLKMatrix4Scale(modelViewMatrix, s, s, 1.0); 
    modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); 
    
    retVal = GLKMathProject(object, modelViewMatrix, projectionMatrix, &viewPort[0]); 
    return retVal; 
} 

Я тогда называть это, как я рисую объект:

GLKVector3 t = [self projectX:myObject.x Y:myObject.y Z:myObject.z zRot:myObject.angle scale:1.0]; //typically myObject.angle=0.0 
debugUITextView.text = NSStringFromGLKVector3(t); 

Но все это я получаю что-то вдоль линий «{NaN , 100.23367, 0.99888} "- фактические значения Y и Z меняются - X всегда NaN. Я попытался удалить строки, масштаб и повернуть матриц, а также забивания прямые номера в таких как

GLKVector3 object = GLKVector3Make(0.5, 1, 0); 

Но всегда тот же самый результат. Значения y и z кажутся правильными; когда я перетаскиваю объект вниз/вверх по экрану, y уменьшается/увеличивается. Может ли кто-нибудь сказать мне, есть ли волшебный трюк для использования GLKMathProject, пожалуйста !? Thanks, Todd.

ответ

0

Я обнаружил, что проблема возникает из-за мою линию:

float aspect = fabsf(viewPort[2]/viewPort[3]); 

Оказывается, я не бросал свои переменные достаточно далеко, то следует читать:

float aspect = fabsf((float)viewPort[2]/(float)viewPort[3]); 

, а затем я получаю Ожидаемые результаты.

Очевидно, что это мой пробел в знаниях компилятора: я предположил, что переменные будут неявно отбрасываться ...!