2012-03-04 5 views
2

私は約20のオブジェクトで構成されてのOpenGL ESのシーンを持っています。各オブジェクトのレンダリングメソッドでは、スケール、回転、および位置(glmultmatrixを使用)の各シーンの正しい場所にオブジェクトを配置します(下記のコードを参照)。- 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(); 
}