0

这个问题也发布在 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 的魔术技巧!?谢谢,托德。

4

1 回答 1

0

我发现问题是因为我的线路而发生的:

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

事实证明我没有将我的变量投射得足够远,它应该是:

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

然后我得到预期的结果。

显然这是我在编译器知识方面的差距:我假设变量会被隐式转换......!

于 2013-10-17T17:09:07.077 回答