gpt4 book ai didi

c - 在OpenGL中围绕自身旋转对象

转载 作者:行者123 更新时间:2023-11-30 15:53:35 25 4
gpt4 key购买 nike

我在围绕自身旋转房间时遇到问题。它的中心位于(5,5,0)所以我想如果我用glTranslatef(5,5,5)翻译房间和房间中的物体然后用glRotatef(rotateroom,0,0,1)然后绘制项目并使用 glTranslate(-5,-5,0) ,它会围绕 5,5,0 旋转房间和其中的所有内容,但它似乎仍在围绕 (0,0,0) 旋转,我不太确定什么我做错了。我在这里先向您的帮助表示感谢。

void drawside(){
int i,j;
/*for (j = 0; j <= 8; j++) {
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
glEnd();
}*/
glEvalMesh2(GL_FILL, 0, 20, 0, 20);
}
void drawRoom(){
//floor
glBegin(GL_POLYGON);
glColor3f(1,1,1);
glNormal3f(0,0,0);
glVertex3f(0,0,0);
glNormal3f(0,10,0);
glVertex3f(0,10,0);
glNormal3f(10,10,0);
glVertex3f(10,10,0);
glNormal3f(10,0,0);
glVertex3f(10,0,0);
glEnd(
);
//wall
glBegin(GL_POLYGON);
glColor3f(0,0,1);
glNormal3f(0,10,0);
glVertex3f(0,10,0);
glNormal3f(0,10,10);
glVertex3f(0,10,10);
glNormal3f(10,10,10);
glVertex3f(10,10,10);
glNormal3f(10,10,0);
glVertex3f(10,10,0);
glEnd();
//wall2
glBegin(GL_POLYGON);
glColor3f(0,1,0);
glNormal3f(10,10,0);
glVertex3f(10,10,0);
glNormal3f(10,10,0);
glVertex3f(10,10,10);
glNormal3f(10,0,10);
glVertex3f(10,0,10);
glNormal3f(10,0,0);
glVertex3f(10,0,0);
glEnd();
}
void drawObjects(){
glColor3f(1,0,1);
glTranslatef(2,2,0);
if(conefill == 1)
glShadeModel(GL_FLAT);
else
glShadeModel(GL_SMOOTH);
glutSolidCone(cone,5,10,2);
glTranslatef(5,5,0);
glColor3f(1,0,0);
if(spherefill == 1)
glShadeModel(GL_FLAT);
else
glShadeModel(GL_SMOOTH);
glutSolidSphere(sphere,20,20);

}

void display(){
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(viewx,viewy, viewz,viewx +lx, 5, viewz + ly,0.0f, 0.0f, 1.0f);
//gluLookAt(viewx,viewy,viewz,headup,headright,5,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
GLfloat light_position[] = {-1.0,5.0,5.0,0.0};
//GLfloat light_direction[] = {-5,-5,-5};
//GLfloat amb[] = {0,0,0,1};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
//glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION,light_direction);
//glLightfv(GL_LIGHT0, GL_AMBIENT,amb);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(5,5,0);
glRotatef(rotateroom,0,0,1);
glPushMatrix();
drawRoom();
glPopMatrix();
glColor3f(0.0, 0.0, 1.0);
glPushMatrix();
glTranslatef(6,3,1);
glPushMatrix ();
drawside();
glPopMatrix();
glPushMatrix();
//glTranslatef(5,0,0);
glRotatef(90,1,0,0);
//glTranslatef(-5,0,0);
glTranslatef(0,.5,.5);
drawside();
glPopMatrix();
glPushMatrix();
//glTranslatef(5,0,0);
glRotatef(180,1,0,0);
//glTranslatef(-5,0,0);
glTranslatef(0,1,0);
drawside();
glPopMatrix();
glPushMatrix();
glRotatef(90,0,0,1);
glTranslatef(-.5,.5,0);
drawside();
glPopMatrix();
glPushMatrix();
glRotatef(270,0,0,1);
glTranslatef(.5,.5,0);
drawside();
glPopMatrix();
glPopMatrix();
drawObjects();
glTranslatef(-5,-5,0);
glPopMatrix();
glutSwapBuffers();
glFlush();
}

最佳答案

您只需颠倒指令的顺序即可:

glRotatef(rotateroom,0,0,1);
glTranslatef(5,5,0);

每当变换一个点时,您都​​必须反转要应用的变换顺序。这取决于变换矩阵相乘的方式。

关于c - 在OpenGL中围绕自身旋转对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13554075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com