这个问题也发布在Apple Dev论坛上,但我在那里没有得到答案,所以希望有人能在这里找到我在做错的任何事情!
我对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的神奇技巧! 谢谢, 托德。
答案 0 :(得分:0)
我发现问题出现是因为我的行:
float aspect = fabsf(viewPort[2] / viewPort[3]);
事实证明我并没有把变量推得足够远,它应该是:
float aspect = fabsf((float)viewPort[2] / (float)viewPort[3]);
然后我得到预期的结果。
显然,这是我在编译器知识上的差距:我假设变量将被隐式转换......!