Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модель солнечной системы 
V
    Опции темы
Shade2015
Дата 2.5.2015, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.4.2015

Репутация: нет
Всего: нет



Всем привет, строю модель солнечной системы...возникла такая проблема- при вращении камеры (сбоку,например, если смотреть сверху-то все норм работает) планеты "пропадают",потом опять появляются на своей орбите.. как согласовать поворот камеры и движение по орбите, чтобы не было этих провалов планет???
Код

#include <gl\gl.h>
#include <glut.h>
#include <list>
#include <math.h>
#pragma comment(lib, "GLAUX.lib") 
#include "glaux.h"
//макросы
#define RAD_IN_DEG 0.017453292519943295769

 //глобальные переменные
static float segments_count = 50; //кол-во сегментов
static float t; //время [с]
static int dt = 10; //интервал пересчета [мс]
static GLint width = 600; //ширина экрана
static GLint height = 600; //высота экрана
static float t_factor = 1.0; //соотношение время модели / время пользователя
static float x_factor = 10.0 / 600.0; //соотношение единица модели / точка экрана
unsigned int photo_tex;
 unsigned int texture;
 unsigned int tex1;
 unsigned int tex2;
 unsigned int tex3;
 unsigned int tex4;
 unsigned int tex5;
 unsigned int tex6;
 unsigned int tex7;
 unsigned int tex8;
 unsigned int Sprite;
AUX_RGBImageRec* photo_image;
AUX_RGBImageRec* photo1;
AUX_RGBImageRec* photo2;

class Person
{
public:
    class _Coord
    {
    public:
        double x,z,y;
    };
    class _Rotation
    {
    public:
        double y,x,z;
    };

    _Coord Coord;
    _Rotation Rotation;
};

int MouseOld_x=0, MouseOld_y=0;
int WinWidth=640, WinHeight=480;
Person User;

void MouseMotion(int x, int y);
void Init(void)
{
    glEnable(GL_DEPTH_TEST);
    User.Coord.x=0;
    User.Coord.z=0;
    User.Coord.y=0;
    User.Rotation.x=0;
    User.Rotation.y=0;
}

class ring_t
{
public:
    float r, g, b; //цвет
 
    float inner_radius, outer_radius; //внутренний и внешний радиусы
    float az, ax; //углы поворота кольца относительно осей z, x (исходная позиция - в плоскости xy) [град]
 
    ring_t(float r, float g, float b, float inner_radius, float outer_radius, float az, float ax):
        r(r), g(g), b(b), inner_radius(inner_radius), outer_radius(outer_radius), az(az), ax(ax)
    {}
 
    void render(void)
    {
        glPushMatrix();
        glRotatef(az, 0, 0, 1);
        glRotatef(ax, 1, 0, 0);
        
        GLUquadricObj *qu = gluNewQuadric();
        gluQuadricTexture(qu, GL_TRUE);
        gluQuadricDrawStyle(qu, GLU_FILL);
        glColor3f(r, g, b);
        gluDisk(qu, inner_radius, outer_radius, segments_count, segments_count);
        gluDeleteQuadric(qu);
 
        glPopMatrix();
        glutSwapBuffers();
    }
};

class planet_t;
static planet_t *core;
 
class planet_t
{
public:
    unsigned int texture;
    float planet_radius; //радиус планеты
    float orbit_radius; //радиус орбиты (окружность)
    float az, ax; //углы поворота орбиты относительно осей z, x (исходная позиция - в плоскости xy) [град]
    float T; //период обращения [с]
    float dT; //смещение [с]
 
    std::list<ring_t> rings; //кольца
    std::list<planet_t> sats; //спутники
 
    planet_t(  unsigned int texture, float planet_radius, float orbit_radius, float az, float ax, float T, float dT):
        texture(texture), planet_radius(planet_radius), orbit_radius(orbit_radius), az(az), ax(ax), T(T), dT(dT)
    {}

    void render(const float t)
    {
        glPushMatrix();
        glRotatef(az, 0, 0, 1);
        glRotatef(ax, 1, 0, 0);
 
        if (orbit_radius > 0)
        {
            float tmp = t + dT; //время с учетом смещения
            int n = tmp / T; //кол-во оборотов
            tmp -= n * T; //время от начала оборота
            tmp *= 360.0 / T; //угол
 
            glTranslatef(orbit_radius * cos(tmp * RAD_IN_DEG),orbit_radius * sin(tmp * RAD_IN_DEG),0);
        }
 
        if (this == core)
        {
            float p0[4] = {0, 0, 1, 0};
         glLightfv(GL_LIGHT0,GL_POSITION, p0);
            render_planet();
            float p1[4] = {0, 0, 0, 1};
            glLightfv(GL_LIGHT0, GL_POSITION, p1);
            
        }
        else
        { 
        render_planet();
        }
 render_rings_and_sats(t);
        glPopMatrix();
        glFlush();
    }
 
    void render_planet(void)
    {   glPushMatrix();
        GLUquadricObj *q = gluNewQuadric();
        glClear(GL_DEPTH_BUFFER_BIT );
        glEnable(GL_TEXTURE_2D);
        gluQuadricTexture(q, GL_TRUE);
        gluQuadricDrawStyle(q, GLU_FILL);
        glBindTexture(GL_TEXTURE_2D, texture);
    if(planet_radius==1)
         {
 glDisable(GL_LIGHTING);
         gluSphere(q,  planet_radius, segments_count, segments_count);
         glEnable(GL_LIGHTING);
    }
    else {gluSphere(q,  planet_radius, segments_count, segments_count);}
    
        gluDeleteQuadric(q);  
        glPopMatrix();
        glFlush();

}

void render_rings_and_sats(const float t)
    {
        for
        (
            std::list<ring_t>::iterator i = rings.begin();
            i != rings.end();
            i++
        )
            i->render();
 
        for
        (
            std::list<planet_t>::iterator i = sats.begin();
            i != sats.end();
            i++
        )
            i->render(t);
            
    }
};
 
//GL-функции


void   Display()
{glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT );
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
     glRotatef(User.Rotation.y, 0,1,0);
      glRotatef(User.Rotation.x, 1,0,0);
glTranslatef(User.Coord.x,0,User.Coord.z);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, photo_tex);
    
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(-10, -10, 10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(10, -10, 10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(10, 10, 10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(-10, 10, 10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(10, 10, 10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(10, 10, -10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(10, -10, -10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(10, -10, 10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(10, 10, -10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(-10, 10, -10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(-10, -10, -10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(10, -10, -10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(-10, -10, -10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(-10, -10, 10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(-10, 10, 10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(-10, 10, -10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(-10, 10, -10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(10, 10, -10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(10, 10, 10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(-10, 10, 10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(-10, -10, -10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(10, -10, -10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(10, -10, 10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(-10, -10, 10);

glEnd();
core->render(t * t_factor);
glEnable(GL_LIGHTING);
glDisable(GL_ALPHA_TEST);
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glFlush();
 }

 void Reshape(GLint width, GLint height)
{   ::width = width;
    ::height = height;
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-width / 2 * x_factor, width / 2 * x_factor, -height / 2 * x_factor, height / 2 * x_factor, 0, 100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glutPostRedisplay();
}

//РЕАЛИЗАЦИЯ ПОВРОТА:
void MouseMotion(int x, int y)
{
    User.Rotation.x+=(y-MouseOld_y)/4;
    User.Rotation.y-=(x-MouseOld_x)/4;
    MouseOld_x=x;
    MouseOld_y=y;
    glutPostRedisplay();
}

void Keyboard(unsigned char key, int x, int y)
{
    if (key=='w') {User.Coord.x+=0.1;User.Coord.y+=0.1;}
    if (key=='s') {User.Coord.x-=0.1;User.Coord.y-=0.1;}
    if (key=='a') {User.Coord.z+=0.1;}
    if (key=='d') {User.Coord.z-=0.1;}
    if (key=='x') {User.Rotation.x++;}
    if (key=='y') {User.Rotation.y++;}
    glutPostRedisplay();
}
static void Timer(int value)
{
 t += dt / 1000.0;
 glutPostRedisplay();
 glutTimerFunc(dt, Timer, 0);
}

int main(int argc, char *argv[])
{                      
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // Хранит три типа тумана
GLuint fogfilter= 0;        
float density=(float)6.8;
float fogcolor[4] = {0.05,0.05,0.05,0.0001}; 
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(width, height);
glutCreateWindow("planet system");
Init();
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    glutKeyboardFunc(Keyboard);
    glutMotionFunc(MouseMotion);
    glEnable(GL_FOG);                       // Включает туман (GL_FOG)
glFogi(GL_FOG_MODE, fogMode[fogfilter]);// Выбираем тип тумана
glFogfv(GL_FOG_COLOR, fogcolor);        // Устанавливаем цвет тумана
glFogf(GL_FOG_DENSITY, 0.15f);          // Насколько густым будет туман
glHint(GL_FOG_HINT, GL_DONT_CARE);      // Вспомогательная установка тумана
glFogf(GL_FOG_START, 1.0f);             // Глубина, с которой начинается туман
glFogf(GL_FOG_END, 5.0f);               // Глубина, где туман заканчивается.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
    glEnable(GL_ALPHA_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);

photo_image = auxDIBImageLoad("1.bmp");
glGenTextures(1, &photo_tex);
glBindTexture(GL_TEXTURE_2D, photo_tex);
glTexImage2D(GL_TEXTURE_2D, 0, 4,
             photo_image->sizeX,
             photo_image->sizeY,
             0, GL_RGB, GL_UNSIGNED_BYTE,
             photo_image->data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    
photo2=auxDIBImageLoad("sun.bmp");
glGenTextures(1, &tex2);
glBindTexture(GL_TEXTURE_2D, tex2);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexImage2D(GL_TEXTURE_2D, 0, 3,
                 photo2->sizeX,
                 photo2->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo2->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

photo1=auxDIBImageLoad("sutr.bmp");
glGenTextures(1, &tex1);
glBindTexture(GL_TEXTURE_2D, tex1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3,
                 photo1->sizeX,
                 photo1->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo1->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

photo1=auxDIBImageLoad("zemly.bmp");
glGenTextures(1, &tex3);
glBindTexture(GL_TEXTURE_2D, tex3);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3,
                 photo1->sizeX,
                 photo1->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo1->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     photo1=auxDIBImageLoad("zel.bmp");
glGenTextures(1, &tex4);
glBindTexture(GL_TEXTURE_2D, tex4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3,
                 photo1->sizeX,
                 photo1->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo1->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   photo1=auxDIBImageLoad("mars.bmp");
glGenTextures(1, &tex5);
glBindTexture(GL_TEXTURE_2D, tex5);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3,
                 photo1->sizeX,
                 photo1->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo1->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    photo1=auxDIBImageLoad("jup.bmp");
glGenTextures(1, &tex6);
glBindTexture(GL_TEXTURE_2D, tex6);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3,
                 photo1->sizeX,
                 photo1->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo1->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    photo1=auxDIBImageLoad("pl.bmp");
glGenTextures(1, &tex7);
glBindTexture(GL_TEXTURE_2D, tex7);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3,
                 photo1->sizeX,
                 photo1->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo1->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    
    photo1=auxDIBImageLoad("mr.bmp");
glGenTextures(1, &tex8);
glBindTexture(GL_TEXTURE_2D, tex8);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3,
                 photo1->sizeX,
                 photo1->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo1->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    
    planet_t core(tex2, 1, -1, 0, 0, 0, 0);
    ::core = &core;
    core.sats.push_back(planet_t(tex4, 0.1, 1.3, 0, 0, 5, 0));
    core.sats.push_back(planet_t(tex5, 0.16, 1.8, 0, 0, 10, 0));
    core.sats.push_back(planet_t(tex8, 0.25, 3.4, 0, 0, 15, 0));
    core.sats.push_back(planet_t(tex3, 0.3, 2.5, 0, 0, 15, 0));
    core.sats.back().sats.push_back(planet_t(tex1, 0.08, 0.3, 0, 0, 5, 0));
    core.sats.push_back(planet_t(tex6, 0.6, 5.6, 0, 0, 13, 0));
    core.sats.push_back(planet_t(tex7, 0.3, 6.8, 0, 0, 25, 0));
    core.sats.push_back(planet_t(tex1, 0.5, 4.5, 0, 0, 20, 0));
    core.sats.back().rings.push_back(ring_t(1, 1, 1, 0.7, 0.8, 0, 80));
    core.sats.back().rings.push_back(ring_t(1, 1, 1, 0.85, 0.9, 0, 80));
    core.sats.back().rings.push_back(ring_t(1, 1, 1, 0.95, 1, 0, 80));
    core.sats.push_back(planet_t(tex3, 0.2, 3, 0, 0, 15, 0));

glutTimerFunc(dt, Timer, 0);
glutMainLoop();
  return 0;
}


Это сообщение отредактировал(а) Shade2015 - 2.5.2015, 15:52
PM MAIL   Вверх
Shade2015
Дата 3.5.2015, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.4.2015

Репутация: нет
Всего: нет



вопрос решила с помощью функции gluLookAt()...только теперь планеты, заходя за солнце, не скрываются за ним. Может поможете с этим вопросом??
PM MAIL   Вверх
tzirechnoy
Дата 4.5.2015, 11:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



По приведённому коду -- потому, что glOrtho( .... 0, 100)

У Вас жэ координаты запросто отрицательные получаются, ну какой 0.. ?

Воткните -100..100, эта проблема поправится.

И да, не надо делать glClear(GL_DEPTH_BIT) для каждой планеты. Ну, Вам, пока, не надо. Вы всё равно не сможэте (пока) их правильно нарисовать без привлечения z-buffer.

А чтобы фон не застил всё остальное -- или подвиньте его так, чтобы он был всегда сзади, или, банально, сделайте glDepthMask(GL_FALSE) перед рисованием фона и glDepthMask(GL_TRUE) -- сразу после.
PM MAIL   Вверх
Shade2015
Дата 4.5.2015, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.4.2015

Репутация: нет
Всего: нет



Код

void   Display()
{        
    glMatrixMode(GL_MODELVIEW);
    
    glPushMatrix();
    glTranslated(0,User.Coord.y, 0);
glRotatef(User.Rotation.x,1,0,0);
glRotatef(User.Rotation.y,0,1,0);
glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, photo_tex);
    glDepthMask(GL_FALSE);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(-10, -10, 10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(10, -10, 10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(10, 10, 10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(-10, 10, 10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(10, 10, 10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(10, 10, -10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(10, -10, -10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(10, -10, 10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(10, 10, -10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(-10, 10, -10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(-10, -10, -10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(10, -10, -10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(-10, -10, -10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(-10, -10, 10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(-10, 10, 10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(-10, 10, -10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(-10, 10, -10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(10, 10, -10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(10, 10, 10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(-10, 10, 10);
    // new face
    glTexCoord2f(0.0f, 0.0f);    glVertex3f(-10, -10, -10);
    glTexCoord2f(1.0f, 0.0f);    glVertex3f(10, -10, -10);
    glTexCoord2f(1.0f, 1.0f);    glVertex3f(10, -10, 10);
    glTexCoord2f(0.0f, 1.0f);    glVertex3f(-10, -10, 10);

glEnd();
glDepthMask(GL_TRUE);
glEnable(GL_LIGHTING);

 core->render(t * t_factor);
 glFlush();
    }

 void Reshape(GLint width, GLint height)
{   ::width = width;
    ::height = height;
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
     glOrtho(-width / 2 * x_factor, width / 2 * x_factor, -height / 2 * x_factor, height / 2 * x_factor, -100, 100);
  glMatrixMode( GL_MODELVIEW );
  glLoadIdentity(); 
 gluLookAt(1.0, 1.0, 1.0,  0.0, 0.0, 0.0,0.0, 1.0, 0.0); 
glutPostRedisplay();
}



Сделала так...но проблема не решилась smile  может что-то не так делаю?
PS.... новичок в этом деле
PM MAIL   Вверх
tzirechnoy
Дата 4.5.2015, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



man glDepthMask

Код
ERRORS
       GL_INVALID_OPERATION  is  generated  if  glDepthMask is executed between the
       execution of glBegin and the corresponding execution of glEnd.


Добавлено через 33 секунды
И да, которая из проблем не решылась? Мне лень копировать это сейчас.
PM MAIL   Вверх
Shade2015
Дата 5.5.2015, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.4.2015

Репутация: нет
Всего: нет



когда планета заходит за солнце , она за ним не скрывается...как будто солнце прозрачное((( glOrtho(...-100,100) не сработал ...вот 
PM MAIL   Вверх
tzirechnoy
Дата 6.5.2015, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Читать то, что я пишу не пробовали?
PM MAIL   Вверх
Shade2015
Дата 6.5.2015, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.4.2015

Репутация: нет
Всего: нет



Может я делаю что-то не так..может чего не допонимаю..так, вот, что делаю:
1.убираю glClear(GL_DEPTH_BIT) в рендре планет....
2.делаем glOrtho( .... -100, 100)....
3. и вставляем glDepthMask(GL_FALSE) и glDepthMask(GL_TRUE) перед и после рисования куба-фона, то есть в glbegin и glEnd ...
Итог: у меня на экране просто фон без планет ((((

а если в рисовалке планет glClear(GL_DEPTH_BUFFER_BIT) оставлять, то проблема видимости планет за солнцем -остается(((

Это сообщение отредактировал(а) Shade2015 - 6.5.2015, 20:49
PM MAIL   Вверх
Shade2015
Дата 7.5.2015, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 26.4.2015

Репутация: нет
Всего: нет



Проблема решена! спасибо большое)))
Код

void render_planet(void)
    {   
      
    
        GLUquadricObj *q = gluNewQuadric();
        glEnable(GL_TEXTURE_2D);
        gluQuadricTexture(q, GL_TRUE);
        gluQuadricDrawStyle(q, GLU_FILL);
        glBindTexture(GL_TEXTURE_2D, texture);
    if(planet_radius==1)
         { 
       glClear( GL_DEPTH_BUFFER_BIT);
         glDisable(GL_LIGHTING);
         gluSphere(q,  planet_radius, segments_count, segments_count);
         glEnable(GL_LIGHTING);
        
    
    }
    if(planet_radius<1) {
    
      glRotatef(User.Rotation.z, 0,0,1); 
      gluSphere(q,  planet_radius, segments_count, segments_count);
      User.Rotation.z+=0.1;
    
     }
        gluDeleteQuadric(q);  
     
      

         
}

PM MAIL   Вверх
tzirechnoy
Дата 7.5.2015, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
 перед и после рисования куба-фона, то есть в glbegin и glEnd


Мда. Вы бы хотя бы в google translate тот кусок оригинального мана запихнули, если сами английский пока непонимаете.

PS Этот if radius == 1 -- это ужасно. Не делайте так.
PPS Вообще, можно было просто glClear DEPTH_BUFFER_BIT вставить после рисования фона, если концэпцый glDepthMask оказалась слишком сложной.

Добавлено через 2 минуты и 10 секунд
И да, про if(planet_radius == 1) -- это где-то 3 ошыбки в одном операторе. Ну да, сейчас оно случайно работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1435 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.