Можно ли нарисовать несколько трехмерных объектов, имеющих свои независимые плоскости или оси соответственно? - PullRequest
1 голос
/ 29 апреля 2011

Я новичок, я играю в парковку ... это вид сверху парковки ... мне нужно иметь постоянную парковку, но дело в том, когда я поворачиваю машину, используя функции glRotatef в специальной клавише Функционируйте все окружающие повороты вдоль машины: (

Я использую преобразования в следующих функциях

void keyspecial( GLint key, GLint x, GLint y )
{
if( key == GLUT_KEY_UP) // up
{

for(int i=0;i<29;i++)
vertices[i][1]+=.50;
}
if( key == GLUT_KEY_DOWN)
{
    for(int i=0;i<29;i++)
vertices[i][1]-=.5;
}
if(key ==GLUT_KEY_LEFT)
{

    translator() ; 
rotaterl();
tran();


}
if(key ==GLUT_KEY_RIGHT)
{
    translator() ; 
rotaterr();
tran();

}

if(key == GLUT_KEY_F2 )
{
    translatorb() ; 
rotaterl();
 tranb();



}

if(key == GLUT_KEY_F1 )
{
    translatorb() ; 
rotaterr();
 tranb();


}

glutPostRedisplay();}

переводчик n tranb - это не что иное, как glTranslatef (..)

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Что вам нужно сделать, так это использовать матричный стек в вашем коде чертежа. Вот как будет выглядеть код:

//Transform parking lot if you want
//Draw the parking lot

glPushMatrix();
//Do transforms like glRotate, glTranslate, etc.
//Draw the car
glPopMatrix();

Когда вы используете glPushMatrix / glPopMatrix, любые преобразования внутри этих операторов будут влиять только на то, что внутри них. Кроме того, если вы изменили парковку, то машины тоже будут двигаться, так как вы преобразуете парковку, а затем вы нажимаете / выталкиваете. Каждую машину нужно толкать / толкать отдельно, чтобы они не трансформировались.

Если вы хотите, чтобы трансформации парковки были полностью независимы от автомобилей, вы должны сделать:

glPushMatrix();
//Transform and draw parking lot
glPopMatrix();

glPushMatrix();
//Transform and draw car
glPopMatrix();

Теперь стоянка и машины не будут влиять на трансформации друг друга.

Надеюсь, это поможет!

0 голосов
/ 29 апреля 2011

Как говорит SuperMaximo93, важно разделить матрицы преобразования, чтобы все объекты рисовались с их собственным уникальным преобразованием.glPushMatrix() - это относительно простой способ справиться с этим.

Я должен добавить, что также важно, чтобы вы вызывали ваши функции преобразования (glTranslatef / Rotatef / Scalef / etc) в правильном порядке.

OpenGL умножает матрицы преобразования в пост-порядке (в отличие от pre -заказа).Поэтому, когда вы вызываете glRotatef(), текущая матрица, C , умножается на матрицу вращения, представляющую вызов glRotate(), M , следующим образом:

C x M

и позиция (или вектор), v , преобразованная вызовом, преобразуется следующим образом:

C x M xv

Это заставляет вас вызывать функции преобразования в порядке, который может показаться обратным тому, что должно быть выполнено.Например:

glTranslatef(0.0f, 1.0f, 0.0f);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
drawMyObject();

Эффект кода выше будет таким, что нарисованный объект будет сначала повернут на 30 градусов против часовой стрелки, , а затем переведен вверх на экранна 1,0 (при условии, что положительное значение вверх по оси Y), в отличие от того, что сначала переводится вверх, а затем поворачивается вдоль центра экрана на 30 градусов против часовой стрелки.

См. также http://www.opengl.org/sdk/docs/man/xhtml/glMultMatrix.xmlдля получения дополнительной документации по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...