【问题标题】:Applying Translations to Entire OpenGL ES Scene - iPhone将平移应用到整个 OpenGL ES 场景 - iPhone
【发布时间】:2012-03-04 17:47:28
【问题描述】:

我有一个由大约 20 个对象组成的 OpenGL ES 场景。在每个对象的渲染方法中,我有代码可以缩放、旋转和定位(使用 glmultmatrix)该对象在每个场景中的正确位置(参见下面的代码)。

我的问题是如何将转换应用于整个场景?例如,将整个场景缩放 2 倍?

glPushMatrix();
glLoadIdentity();

//Move some objects.

if (hasAnimations) {

    glTranslatef(kBuildingOffset);
    //scale
    glScalef(kModelScale);

    //glMultMatrixf(testAnimation);

    zRotation = kBuildingzRotation
    xRotation = kBuildingxRotation
    yRotation = kBuildingyRotation
    glRotatef(yRotation, 0.0f, 1.0, 0.0f);
    glRotatef(xRotation, 1.0f, 0.0f, 0.0f);
    glRotatef(zRotation, 0.0f, 0.0f, 1.0f);

    //NSLog(@"ANIMATION FRAME IS %d", animationFrame);
    //NSLog(@"MATRICE IS %f", animationArray[0][0]);
    glMultMatrixf(animationArray[animationFrame]);
    //glMultMatrixf(matricesArray);
    glMultMatrixf(matricePivotArray);

    //glMultMatrixf(testAnimation);
}

//First rotate our objects as required.

if ([objectName isEqualToString:@"movingobject1"]) {

    glTranslatef(kFan1Position); 
    glScalef(kModelScale);
    glMultMatrixf(matricesArray);

    glTranslatef(0, 0, 0);

    zRotation +=kFanRotateSpeed;
    yRotation =kyFanFlip;
    xRotation = kxFanRotation;
    glRotatef(zRotation, 0.0f, 0.0f, 1.0f);
    glRotatef(yRotation, 0.0f, 1.0f, 0.0f);
    glRotatef(xRotation, 1.0f, 0.0, 0.0f);

    glTranslatef(0.0, 0.0, -300);

}

if ([objectName isEqualToString:@"movingobject2"]) {

    glTranslatef(kFan2Position);
    glScalef(kModelScale);
    glMultMatrixf(matricesArray);

    glTranslatef(0, 0, 0);

    zRotation +=kFanRotateSpeed;
    yRotation = kyFanFlip;
    xRotation = kxFanRotation;
    glRotatef(-kFan3YOffset, 0.0, 1.0, 0.0);
    glRotatef(zRotation, 0.0f, 0.0f, 1.0f);
    glRotatef(yRotation, 0.0f, 1.0f, 0.0f);
    glRotatef(xRotation, 1.0f, 0.0, 0.0f);
    glRotatef(kFan3YOffset, 0.0f, 1.0f, 0.0f);

    glTranslatef(0.0, 0.0, -300);

}

if ([objectName isEqualToString:@"movingobject3"]) {

    glTranslatef(kFan3Position); 
    glScalef(kModelScale);
    glMultMatrixf(matricesArray);

    glTranslatef(0, 0, 0);

    zRotation +=kFanRotateSpeed;
    yRotation =kyFanFlip;
    xRotation =kxFanRotation;
    glRotatef(-kFan2YOffSet, 0.0, 1.0, 0.0);
    glRotatef(zRotation, 0.0f, 0.0f, 1.0f);
    glRotatef(yRotation, 0.0f, 1.0f, 0.0f);
    glRotatef(xRotation, 1.0f, 0.0f, 0.0f);
    glRotatef(kFan2YOffSet, 0.0, 1.0, 0.0);

    glTranslatef(0.0, 0.0, -300);

}

//Then position the rest of the scene objects.

if (![objectName isEqualToString:@"movingobject1"])
    if (![objectName isEqualToString:@"movingobject2"])
        if(![objectName isEqualToString:@"movingobject3"])
            if (!hasAnimations) {

    glLoadIdentity();
    glTranslatef(kBuildingOffset);

//scale
    glScalef(kModelScale);

    zRotation = kBuildingzRotation
    xRotation = kBuildingxRotation
    yRotation = kBuildingyRotation
    glRotatef(yRotation, 0.0f, 1.0, 0.0f);
    glRotatef(xRotation, 1.0f, 0.0f, 0.0f);
    glRotatef(zRotation, 0.0f, 0.0f, 1.0f);

if ([Matrices count]!=0) {
    glMultMatrixf(matricesArray);
}

if (hasPivotNode) {
    glMultMatrixf(matricePivotArray);
}
}

[mesh render];
glPopMatrix();
//restore the matrix

【问题讨论】:

    标签: iphone objective-c opengl-es 3d transform


    【解决方案1】:

    在进行任何特定于对象的转换之前,您应该能够通过将所需的转换矩阵推到矩阵堆栈上来轻松地实现这一点,但随后 不要 加载标识每次将另一个矩阵推入堆栈时。实际上,这将转换所有后续的矩阵运算。这是基本模式...

    // Push an identity matrix on the bottom of the stack...
    glPushMatrix();
    glLoadIdentity();
    
    // Now scale it, so all subsequent transforms will be
    // scaled up 2x.
    glScalef(2.f, 2.f, 2.f);
    
    foreach(mesh) {
    
        glPushMatrix();
        //glLoadIdentity(); This will erase the scale set above.
        glDoABunchOfTransforms();
        [mesh render];
        glPopMatrix();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多