2012-03-04 58 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(); 
}