Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2015, 11:14   #1
Shade2015
Пользователь
 
Регистрация: 24.04.2015
Сообщений: 10
Злость OpenGL C++ наложить текстуру на все фигуры

Народ, нужна помощь))Пытаюсь наложить текстуру на все планеты-сферы, плюс использовать текстуру как фон...
Но получается, что текстура накладывается только на одну планету и все, фон-текстура тоже не работает((( норм работало, когда текстура была фоном, планеты просто окрашивались цветом...
Сейчас "летает" одинокая планета, закрашенная текстурой, и все... остальное исчезло(((
Что делаю не так???
PS Новичок, пытаюсь написать курсач(((
Вложения
Тип файла: txt Новый текстовый документ (3).txt (7.0 Кб, 135 просмотров)
Shade2015 вне форума Ответить с цитированием
Старый 26.04.2015, 11:24   #2
Shade2015
Пользователь
 
Регистрация: 24.04.2015
Сообщений: 10
По умолчанию

Код:
#include <windows.h>
#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 tex;
AUX_RGBImageRec* photo_image;
AUX_RGBImageRec* photo;
class ring_t
{
public:
float r, g, b; //цвет
float inner_radius, outer_radius; 
    float az, ax; 
    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();
    }
};
 class planet_t;
static planet_t *core;
class planet_t
{
public:
    unsigned int tex;
    float planet_radius; //радиус планеты
    float orbit_radius; //радиус орбиты (окружность)
    float az, ax; 
    float T; //период обращения [с]
    float dT; //смещение [с]
    std::list<ring_t> rings; //кольца
    std::list<planet_t> sats; //спутники
    planet_t(unsigned int tex, float planet_radius, float orbit_radius, float az, float ax, float T, float dT):
        tex(tex), 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),0,orbit_radius * sin(tmp * RAD_IN_DEG));
        }
   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();
    }
 
    void render_planet(void)
    {GLUquadricObj *q = gluNewQuadric();
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glEnable( GL_TEXTURE_2D );
  gluQuadricTexture(q, GL_TRUE);
gluQuadricDrawStyle(q, GLU_FILL);
glBindTexture(GL_TEXTURE_2D, tex);
glColor3d(1,1,1);
glPushMatrix();
glBegin(GL_LINE);
gluSphere(q,  planet_radius, segments_count, segments_count);
glEnd();
glPopMatrix();
	}
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-функции
 
static void Display(void)
{
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, photo_tex);
   glBegin(GL_QUADS);
     glTexCoord2d(0,0); glVertex2d(-9,-9);
     glTexCoord2d(0,1); glVertex2d(-9, 9);
     glTexCoord2d(1,1); glVertex2d( 9, 9);
     glTexCoord2d(1,0); glVertex2d( 9,-9);
 glEnd();
 glDisable(GL_TEXTURE_2D);

    core->render(t * t_factor);
 
    glFlush();
    glutSwapBuffers();
}
 
static 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);
    gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
} 
static void Timer(int value)
{
    t += dt / 1000.0;
    glutPostRedisplay();
    glutTimerFunc(dt, Timer, 0);
}
Shade2015 вне форума Ответить с цитированием
Старый 26.04.2015, 11:24   #3
Shade2015
Пользователь
 
Регистрация: 24.04.2015
Сообщений: 10
По умолчанию

Код:
int main(int argc, char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(width, height);
    glutCreateWindow("planet system");
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);

  photo_image = auxDIBImageLoad("an.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);
	
photo = auxDIBImageLoad("article.bmp");
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3,photo->sizeX,photo->sizeY,0, GL_RGB, GL_UNSIGNED_BYTE,photo->data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    planet_t core(tex, 1, -1, 0, 0, 0, 0);
    ::core = &core;
 
    core.sats.push_back(planet_t(tex, 0.1, 2, 0, 0, 5, 0));
    core.sats.push_back(planet_t(tex, 0.2, 2.5, 0, 0, 10, 0));
    core.sats.push_back(planet_t(tex, 0.2, 3, 0, 0, 15, 0));
    core.sats.back().sats.push_back(planet_t(tex, 0.05, 0.3, 0, 0, 5, 0));
    core.sats.push_back(planet_t(tex, 0.5, 4, 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));

    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    glutTimerFunc(dt, Timer, 0);
    glutMainLoop();
 
    return 0;
}[/
Shade2015 вне форума Ответить с цитированием
Старый 26.04.2015, 18:14   #4
Shade2015
Пользователь
 
Регистрация: 24.04.2015
Сообщений: 10
По умолчанию

исправила функцию, где рисую сферу, добавила glutSwapBuffers();
НО! появилась новая проблема((Отображаются все планеты, но текстура у них, которая используется для фона...и она как-то беспорядочно "мигает"(((как исправить?

Код:
 void render_planet(void)
    {
        GLUquadricObj *q = gluNewQuadric();
		glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
      glEnable(GL_TEXTURE_2D);
       gluQuadricTexture(q, GL_TRUE);
		gluQuadricDrawStyle(q, GLU_FILL);
		glColor3d(1,1,1);
		glPushMatrix();
		gluSphere(q,  planet_radius, segments_count, segments_count);
glPopMatrix();
gluDeleteQuadric(q);  
glutSwapBuffers();	
}
Shade2015 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен исходник загрузки текстуру в OpenGL pufystyj Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 19.07.2011 03:07
OpenGL рендеринг в текстуру или ... SalasAndriy Мультимедиа в Delphi 14 22.11.2010 08:27
Наложить текстуру в первую четверть и отображать ее на всю форму(Opengl). peredozer Мультимедиа в Delphi 4 27.05.2010 02:13
Как растянуть текстуру на всю форму(прямоугольник)?(OpenGl) peredozer Мультимедиа в Delphi 2 05.05.2010 19:29
OpenGl+Delphi,при загрузке текстуру сильно корежит Skif Помощь студентам 1 27.11.2007 08:40