OpenGL-错误的对象定位-gluLookAt()
我有一个来自大学的taks,必须做一个太阳系的小例子,物体必须旋转等等。问题是,当我不调用GluLookAt()时,一切看起来都很好,但我想改变视图,当我调用函数时,出现一个轨道渲染完全奇怪的情况。 我不知道问题是第一个轨道的错误创建,还是gluLookAt参数中的正确值。有人能帮忙吗 下面是不调用gluLookAt()的情况下的外观: 下面是gluLookAt()之后的情况: 代码如下:OpenGL-错误的对象定位-gluLookAt(),opengl,glulookat,Opengl,Glulookat,我有一个来自大学的taks,必须做一个太阳系的小例子,物体必须旋转等等。问题是,当我不调用GluLookAt()时,一切看起来都很好,但我想改变视图,当我调用函数时,出现一个轨道渲染完全奇怪的情况。 我不知道问题是第一个轨道的错误创建,还是gluLookAt参数中的正确值。有人能帮忙吗 下面是不调用gluLookAt()的情况下的外观: 下面是gluLookAt()之后的情况: 代码如下: #include "stdafx.h" #include <GL\glut.h> #in
#include "stdafx.h"
#include <GL\glut.h>
#include <math.h>
GLfloat yRotated=1;
GLfloat movement = 0;
void drawCircle(float r) { // radius
glBegin(GL_LINE_LOOP);
for (int i = 0; i <= 300; i++) {
double angle = 2 * 3.14 * i / 300;
double x = r*cos(angle);
double y = r*sin(angle);
glVertex3d(x, y, -5.5);
}
glEnd();
}
void display(void) {
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
//gluLookAt(5, 5, 5, 0, 0, -8, 0, 1, 0); // 3rd coordinate - depth
float radius1 = 6;
float radius2 = 1;
//first orbit
glColor3f(1, 1, 1);
glPushMatrix();
glTranslatef(0, 0, -5.5);
drawCircle(radius1);
glPopMatrix();
//second orbit with rotation
glPushMatrix();
glRotatef(yRotated, 0, 0, 1);
glPushMatrix();
glTranslatef(radius1 / 2, 0, 0);
drawCircle(radius2);
glPopMatrix();
glPopMatrix();
//first czajnik
glColor3f(0.8, 0.2, 0.1);
glPushMatrix();
glTranslatef(0.0, 0.0, -5.5);
// glScalef(1.0, 1.0, 1.0);
glRotatef(yRotated, 0, 0, 1);
glRotatef(90, 1, 0, 0);
glutSolidSphere(1,20,20);
//second czajnik
glPushMatrix();
glColor3f(0, 0, 1);
glTranslatef(radius1/2, 0, 0);
glRotatef(yRotated, 0, 1, 0);
glutSolidSphere(0.5, 20, 20);
//third czajnik
glPushMatrix();
glTranslatef(radius2, 0, 0);
glColor3f(1, 1, 0);
glRotatef(yRotated, 0, 1, 0);
glutSolidSphere(0.2, 20, 20);
glPopMatrix();
//second czajnik pop
glPopMatrix();
//first czajnik pop
glPopMatrix();
glFlush();
}
void idle() {
yRotated += 0.1;
Sleep(2);
display();
}
void myReshape(int w, int h) {
if (w == 0 || h == 0) return;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70.0, (GLdouble)w / (GLdouble)h, 0.5, 20.0);
glViewport(0, 0, w, h);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(900, 600);
glutCreateWindow("Solar system");
//window with a title
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glClearColor(0, 0, 0, 1.0);
glutDisplayFunc(display);
glutReshapeFunc(myReshape);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
#包括“stdafx.h”
#包括
#包括
gl=1;
GLfloat移动=0;
空心圆(浮动r){//半径
glBegin(GL_线_环);
对于(int i=0;i一些对象的z值不同,例如,第一个轨道在-5.5,第二个轨道在0,因为您“弹出”了矩阵
一般来说,不要做太多相互嵌套的push\pop,矩阵堆栈不是由橡胶制成的
有比计算每个步骤的正弦和余弦更有效的圆绘制程序,例如,为了利用圆作为旋转图形:
inline void circle(F32 r, U32 quality)
{
if (r < F_ALMOST_ZERO) return;
F32 th = M_PI /(quality-1);
F32 s = sinf(th);
F32 c = cosf(th);
F32 t;
F32 x = r;
F32 y = 0;
::glBegin (GL_LINE_LOOP);
for(U32 i = 0; i < quality; i++)
{
glVertex2f(x, y);
t = x;
x = c*x + s*y;
y = -s*t + c*y;
}
::glEnd();
}
内联空心圆(F32 r,U32品质)
{
如果(r
它可以通过使用对称性进行进一步优化,但这一点是基础。您的一些对象的z值不同,例如,第一个轨道为-5.5,第二个轨道为0,因为您“弹出”了矩阵
一般来说,不要做太多相互嵌套的push\pop,矩阵堆栈不是由橡胶制成的
有比计算每个步骤的正弦和余弦更有效的圆绘制程序,例如,为了利用圆作为旋转图形:
inline void circle(F32 r, U32 quality)
{
if (r < F_ALMOST_ZERO) return;
F32 th = M_PI /(quality-1);
F32 s = sinf(th);
F32 c = cosf(th);
F32 t;
F32 x = r;
F32 y = 0;
::glBegin (GL_LINE_LOOP);
for(U32 i = 0; i < quality; i++)
{
glVertex2f(x, y);
t = x;
x = c*x + s*y;
y = -s*t + c*y;
}
::glEnd();
}
内联空心圆(F32 r,U32品质)
{
如果(r
它可以通过使用对称进一步优化,但这是基础。谢谢:)我更改了平移并绘制了半径为1/2的轨道。现在它很完美。//第一个轨道glColor3f(1,1,1);glPushMatrix();GLTRANSTEF(0,0,0);drawCircle(半径为1/2);谢谢:)我已经更改了平移,并绘制了半径为1/2的轨道。现在它非常完美//第一个轨道glColor3f(1,1,1);glPushMatrix();glTranslatef(0,0,0);drawCircle(半径为1/2);