Применение переводов ко всей сцене OpenGL ES - iPhone - PullRequest
2 голосов
/ 04 марта 2012

У меня есть сцена OpenGL ES, которая состоит из примерно 20 объектов.В методе рендеринга для каждого объекта у меня есть код, который масштабирует, поворачивает и позиционирует (используя 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

1 Ответ

0 голосов
/ 04 марта 2012

Вы должны быть в состоянии достичь этого достаточно легко, помещая матрицу преобразования, которую вы хотите, в стек матрицы, прежде чем выполнять какие-либо преобразования, специфичные для объекта, но тогда не загружает матрицу идентификациикаждый раз, когда вы помещаете другую матрицу в стек.На практике это преобразует все последующие матричные операции.Это основной шаблон ...

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