2016-12-11 10 views
1

私は大学からのタクを持っていて、ソーラーシステムの小さな例を作る必要があり、オブジェクトは回転しなければなりません。問題は私がGluLookAt()すべてがうまく見えますが、私はビューを変更したいと思います。関数を呼び出すと、1つの軌道が完全に奇妙にレンダリングされます。 問題が最初の軌道の間違った作成、またはgluLookAtパラメータの適切な値であるかどうかはわかりません。誰も助けることができますか?それはgluLookAt()を呼び出すことなく、どのように見えるかをここでOpenGL - 間違ったオブジェクトの位置付け - gluLookAt()

です:

#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; 
} 

ここ

コードです:

ここ

はgluLookAt()をした後、それがどのように見えるかです

答えて

0

オブジェクトの中には、z値が異なるものがあります。第1軌道が-5.5にあり、第2軌道が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(); 
} 

これは、対称性を使用してさらに最適化できますが、これが基本です。

+0

ありがとう:) 私は翻訳を変更し、半径radius1/2の軌道を描きました。今は完璧です。 //最初の軌道 \t glColor3f(1,1,1); \t glPushMatrix(); \t glTranslatef(0、0、0); \t drawCircle(radius1/2); –

関連する問題