2013-10-10 44 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。 我試過去除縮放和旋轉的matricies以及在諸如

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

但總是相同的結果直接插入數字線。 y和z值似乎是正確的;當我在屏幕上向下/向上拖動對象時,y減小/增加。 有人能告訴我是否有使用GLKMathProject的魔術技巧! 謝謝, 託德。

回答

0

我發現,是由於我行的問題:

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

原來我不是鑄造我的變量遠遠不夠,應改爲:

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

,然後我得到預期成績。

很明顯,這是我在編譯器知識上的缺陷:我認爲這些變量會被隱式轉換...!