opengl 如何在不更改对象平移位置的情况下缩放

h4cxqtbf  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(176)

我在缩放对象时遇到了一个问题。我尝试使用keybind为我的汽车应用平移和缩放,但是当我点击keybind进行缩放时,只有我的身体重新定位了它自己,而汽车的轮胎在我平移的固定位置缩放。下面是我的代码:


# include <windows.h>

# include <gl/glut.h>

# include <stdlib.h>

# include <math.h>

# include <string.h>

const float steps = 100;
const float angle = 3.1415926 * 2.0 / steps;
float m = 0;
float s = 1;

void wheel(float x, float y)
{
float w;
glBegin(GL_POLYGON);
glColor3ub(0, 0, 0);
for (int i = 0; i < 360; i++)
{
    w = (i*3.1416 / 180);
    glVertex2f(x + 0.04 * s * cos(w), y + 0.04 * s * sin(w));
}

glEnd();
}

void display() {

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);
                                        glColor3ub(48, 51, 64);
glVertex2f(-1, 1);                      glColor3ub(48, 51, 64);
glVertex2f(1, 1);                       glColor3ub(11, 11, 16);
glVertex2f(1, -0.1);                    glColor3ub(11, 11, 16);
glVertex2f(-1, -0.1);

glEnd();

//[2] Floor
glBegin(GL_QUADS);
                                        glColor3ub(51, 25, 0);
glVertex2f(-1, -0.1);                   glColor3ub(51, 25, 0);
glVertex2f(1, -0.1);                    glColor3ub(102, 51, 0);
glVertex2f(1, -1);                      glColor3ub(102, 51, 0);
glVertex2f(-1, -1);

glEnd();

//[3-1] Road
glBegin(GL_QUADS);
                                        glColor3ub(26, 26, 26);
glVertex2f(-1, -0.2);                   glColor3ub(26, 26, 26);
glVertex2f(1, -0.2);                    glColor3ub(40, 40, 40);
glVertex2f(1, -0.9);                    glColor3ub(40, 40, 40);
glVertex2f(-1, -0.9);

glEnd();

//[3-2] Road
glBegin(GL_QUADS);
                                        glColor3ub(248, 210, 16);
glVertex2f(-0.9, -0.52);                glColor3ub(248, 210, 16);
glVertex2f(-0.7, -0.52);                glColor3ub(248, 210, 16);
glVertex2f(-0.7, -0.58);                glColor3ub(248, 210, 16);
glVertex2f(-0.9, -0.58);

glEnd();

//[4] Star
glBegin(GL_POLYGON);

glEnd();

//[5] Building
glBegin(GL_POLYGON);

glEnd();

//[6] Car
glBegin(GL_POLYGON);
                                        glColor3ub(65, 105, 225);
glVertex2f(m + (s * 0.50), s * -0.7); 
glVertex2f(m + (s * 0.52), s * -0.6);
glVertex2f(m + (s * 0.80), s * -0.6);
glVertex2f(m + (s * 0.86), s * -0.7);
glVertex2f(m + (s * 0.86), s * -0.8);
glVertex2f(m + (s * 0.44), s * -0.8);
glVertex2f(m + (s * 0.44), s * -0.7);
glVertex2f(m + (s * 0.50), s * -0.7);

glEnd();

wheel(m + 0.52, -0.8);
wheel(m + 0.76, -0.8);

glFlush();
}

void key(unsigned char key, int x, int y) {
switch (key)
{
case 'A':
case 'a':
    m = m - 0.1;

    break;

case 'D':
case 'd':
    m = m + 0.1;

    break;

case 'Q':
case 'q':
    s = s + 0.1;

    break;

case 'E':
case 'e':
    s = s - 0.1;

    break;
}
glutPostRedisplay();

}

int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(1000, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("Moving Car");
glutDisplayFunc(display);
glutKeyboardFunc(key);
glutMainLoop();
return 0;
}

我不知道如何使它在一个固定的位置缩放后,翻译,我尝试应用翻译在缩放部分,但它不工作。

eagi6jfj

eagi6jfj1#

每个glVertex在指定时由当前模型视图与投影矩阵进行变换.
您必须先缩放整个对象(汽车和车轮),然后再进行其他转换。使用glTranslatefglScale将目前的矩阵乘以一般缩放矩阵,glPushMatrix将矩阵保存在矩阵堆栈中,glPopMatrix则从矩阵堆栈还原矩阵。
例如:
第一个

tgabmvqs

tgabmvqs2#

如果我没理解错的话,车身和车轮都在 * 相对于原点 * 进行缩放和平移,但是车轮 * 相对于车身 * 的位置固定在(0.52, -0.8)(0.76, -0.8),而与汽车的大小无关。这意味着当您缩放汽车时,它看起来会不正确。
在这种情况下,您需要做的是在计算车轮位置时包括比例因子,如下所示:

wheel(m + s * 0.52, s * -0.8);
wheel(m + s * 0.76, s * -0.8);

换句话说,当比例因子为1时,车轮将位于这些坐标处(在世界空间中),但随着比例因子的增加,车轮与原点的距离也会增加(在世界空间中)。

相关问题