我在缩放对象时遇到了一个问题。我尝试使用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;
}
我不知道如何使它在一个固定的位置缩放后,翻译,我尝试应用翻译在缩放部分,但它不工作。
2条答案
按热度按时间eagi6jfj1#
每个
glVertex
在指定时由当前模型视图与投影矩阵进行变换.您必须先缩放整个对象(汽车和车轮),然后再进行其他转换。使用
glTranslatef
和glScale
将目前的矩阵乘以一般缩放矩阵,glPushMatrix
将矩阵保存在矩阵堆栈中,glPopMatrix
则从矩阵堆栈还原矩阵。例如:
第一个
tgabmvqs2#
如果我没理解错的话,车身和车轮都在 * 相对于原点 * 进行缩放和平移,但是车轮 * 相对于车身 * 的位置固定在
(0.52, -0.8)
和(0.76, -0.8)
,而与汽车的大小无关。这意味着当您缩放汽车时,它看起来会不正确。在这种情况下,您需要做的是在计算车轮位置时包括比例因子,如下所示:
换句话说,当比例因子为
1
时,车轮将位于这些坐标处(在世界空间中),但随着比例因子的增加,车轮与原点的距离也会增加(在世界空间中)。