2012-03-04 60 views
2

我有一个由大约20个对象组成的OpenGL ES场景。在每个对象的渲染方法中,我有代码,它在每个场景的正确位置(请参阅下面的代码)缩放,旋转和定位(使用glmultmatrix)该对象。将翻译应用到整个OpenGL ES场景 - iPhone

我的问题是如何将整个场景的转换应用于整体?例如缩放/将整个场景放大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 

回答

0

你应该能够推动你做任何你的对象specifc转换之前,你的愿望到矩阵堆栈变换矩阵来实现这一点很容易不够,但随后负载单位矩阵每次将另一个矩阵推入堆栈。实际上,这将改变所有后续的矩阵运算。这是基本模式...

// 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(); 
}