I have assignment to make solar system in opengl. So far I have made Sun + Mercury, Venus, Earth(+ moon), Mars. When I'm trying to add Jupiter, everything crashes. I can't find problem. Can any one help me ?
I want to add that I didn't write this program from the beginning I'm editing program which was given by our teacher. That's why there is so many comments.
scene.cpp
//---------------------------------------------------------------------------
#include <windows.h>
#include "ogl_scene.h"
#include <gl\gl.h>
#include <gl\glu.h>
#include <math.h>
//---------------------------------------------------------------------------
OGL_Scene::OGL_Scene()
: hdc_(NULL)
, hrc_(NULL)
, w_(1)
, h_(1)
, rotx_(-60.0)
, roty_(0.0)
, rotz_(0.0)
, tr_(-10.0)
, light_(true)
, l0_(0)
, std_material_(9)
, earth_(0.3, 100, 100, 0, true)
, sun_(2.0, 30, 30, 0, false)
, moon_(0.05, 30, 30, 0, true)
, venus_(0.2, 30, 30, 0, true)
, mercury_(0.1, 30, 30, 0, true)
, mars_(0.15,30,30,0,true )
, jupiter_(0.7,100,100,0,true)
, animate_(true)
{
}
//---------------------------------------------------------------------------
void OGL_Scene::Create(HWND hwnd)
{
hdc_ = ::GetDC(hwnd);
// Pobiera kontekst urządzenia danego okna.
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR) // Rozmiar struktury
, 1 // Wersja struktury
, PFD_DRAW_TO_WINDOW // Rysowanie w oknie (nie w bitmapie)
| PFD_SUPPORT_OPENGL // Obsługa wywołań OpenGL w tym oknie
| PFD_DOUBLEBUFFER // Tryb podwójnego buforowania
, PFD_TYPE_RGBA // Tryb kolorów RGB
, 24 // Ilość bitów na kolor
, 0,0,0,0,0,0 // Nie używane
, 0,0 // Nie używane
, 0,0,0,0,0 // Nie używane
, 32 // Rozmiar bufora głębokości (max. 32, 16-ok)
, 0 // Nie używane
, 0 // Nie używane
, PFD_MAIN_PLANE // Rysowanie na głównym planie
, 0 // Nie używane
, 0,0 // Nie używane
};
int index = ::ChoosePixelFormat(hdc_, &pfd);
// Wybiera, dostępny dla danego kontekstu urządzenia,
// format pikseli najbardziej zbliżony do informacji
// otrzymanych w strukturze pfd.
::SetPixelFormat(hdc_, index, &pfd);
// Ustawienie formatu pikseli dla kontekstu urządzenia.
// Po ustaleniu nie można go już modyfikować.
hrc_ = wglCreateContext(hdc_); if(!hrc_) throw "ERROR: wglCreateContext()";
// Tworzy kontekst renderowania odpowiedni do rysowania
// w podanym kontekście urządzenia Windows.
if(wglMakeCurrent(hdc_, hrc_) == false) throw "ERROR: MakeCurrent()";
// Wskazany kontekst renderowania czyni bieżącym dla danego wątku
// i wiąże go z podanym kontekstem urządzenia.
textures_[0] = tex_.LoadRAWTexture("earth.raw", 1024, 512, true);
textures_[1] = tex_.LoadRAWTexture("sun.raw", 1024, 512, true);
textures_[2] = tex_.LoadRAWTexture("moon.raw", 512, 256, true);
textures_[3] = tex_.LoadRAWTexture("venus.raw", 1024, 512, true);
textures_[4] = tex_.LoadRAWTexture("mercury.raw", 1024, 512, true);
textures_[5] = tex_.LoadRAWTexture("mars.raw", 1000, 500, true);
textures_[6] = tex_.LoadRAWTexture("jupiter.raw", 1024, 512, true);
}
//---------------------------------------------------------------------------
void OGL_Scene::Destroy(HWND hwnd)
{
tex_.DeleteTexture(textures_[0]);
tex_.DeleteTexture(textures_[1]);
tex_.DeleteTexture(textures_[2]);
tex_.DeleteTexture(textures_[3]);
tex_.DeleteTexture(textures_[4]);
tex_.DeleteTexture(textures_[5]);
tex_.DeleteTexture(textures_[6]);
if(hrc_==NULL) return;
wglMakeCurrent(hdc_, NULL);
// Zeruje bieżący kontekst renderowania.
wglDeleteContext(hrc_);
// Usuwa niepotrzebny już kontekst renderowania.
::ReleaseDC( hwnd, hdc_ );
// Zwalnia kontekst urządzenia danego okna.
hdc_ = NULL;
hrc_ = NULL;
// Unieważnia uchwyty.
}
//---------------------------------------------------------------------------
void OGL_Scene::Resize(float w, float h)
{
w_ = (w==0) ? 1 : w;
h_ = (h==0) ? 1 : h;
// 1. Zabezpieczenie przed dzieleniem przez zero.
glViewport(0, 0, (int)w_, (int)h_);
// ----- Macierz okna -----
// 1. Ustala obszar okna do wykorzystania przez OpenGL.
// 2. Ustawienie widoku na wymiary okna.
Redraw();
// Wywołanie procedury renderującej.
}
//---------------------------------------------------------------------------
void OGL_Scene::Redraw()
{
// 1. Przygotowanie...
// Określenie koloru tła
glClearColor(0.0, 0.0, 0.0, 1.0);
// Wybór macierzy rzutowania
glMatrixMode(GL_PROJECTION);
// Ustawienie macierzy jednostkowej (!!!)
glLoadIdentity();
// Włącza ukrywanie niewidocznych powierzchni dla danego ustawienia
// obserwatora (kamery)
glEnable(GL_DEPTH_TEST);
// Określenie, jakim porównaniem ma się posługiwać bufor głębokości,
// czyli które piksele mają być wyświetlone na ekranie
glDepthFunc(GL_LEQUAL);
// Określenie jakości interpolacji dla koloru i tekstur, czyli dokładności
// z jaką będą obliczane
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// Ustala lub modyfikuje zakres bryły obcinania
gluPerspective(45.0, w_/h_, 0.1, 80.0);
// Wybór macierzy modelowania
glMatrixMode(GL_MODELVIEW);
// Ustawienie macierzy jednostkowej (!!!)
glLoadIdentity();
// Wyczyszczenie bufora koloru oraz bufora głębokości (!!!)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 2. Rendering...
// Przesunięcie obiektów od okna
glTranslatef(0.0, 0.0, tr_);
// obrót obiektów dookoła osi x
glRotatef(rotx_, 1.0, 0.0, 0.0);
// obrót obiektów dookoła osi y
glRotatef(roty_, 0.0, 1.0, 0.0);
// obrót obiektów dookoła osi z
glRotatef(rotz_, 0.0, 0.0, 1.0);
// Włączenie/wyłączenie oświetlenia
if(light_)
{
glEnable(GL_LIGHTING);
l0_.Set_Pos(0.0, 0.0, 0.0, 1.0);
l0_.Set_Amb(1.0, 1.0, 1.0, 1.0);
l0_.Set_Dif(1.0, 1.0, 1.0, 1.0);
l0_.Set_Spe(1.0, 1.0, 1.0, 1.0);
l0_.On();
m0_.SetMaterial(std_material_);
m0_.Material();
}
else
{
glDisable(GL_LIGHTING);
}
glEnable(GL_TEXTURE_2D);
// wybór tekstury
glBindTexture(GL_TEXTURE_2D, textures_[1]);
sun_.Redraw();
// wybór tekstury
glBindTexture(GL_TEXTURE_2D, textures_[0]);
earth_.Redraw();
// wybór tekstury
glBindTexture(GL_TEXTURE_2D, textures_[2]);
moon_.Redraw();
// wybór tekstury
glBindTexture(GL_TEXTURE_2D, textures_[3]);
venus_.Redraw();
// wybór tekstury
glBindTexture(GL_TEXTURE_2D, textures_[4]);
mercury_.Redraw();
glBindTexture(GL_TEXTURE_2D, textures_[5]);
mars_.Redraw();
glBindTexture(GL_TEXTURE_2D, textures_[6]);
jupiter_.Redraw();
// 3. Zakończenie...
// Wykonanie poleceń OpenGL oczekujących w kolejce
glFlush();
// Kopiuje zawartość tylnego bufora do wyspecyfikowanego hdc_
::SwapBuffers(hdc_);
}
//---------------------------------------------------------------------------
void OGL_Scene::Animate()
{
static int a=0; // kąt obrotu Ziemi dookoła własnej osi
static int d=0; // licznik dni dla Ziemi
static int m=0; // licznik dni dla Księżyca
static int w=50; // licznik dni dla Wenus
static int me=30; // licznik dni dla Merkurego
static int ma=6; // licznik dni dla Marsa
static int ju=12; // licznik startowy dni Jowisza
if(animate_)
{
a=a+10;
if(a>=360)
{
a=0;
d++;
m++;
w++;
me++;
ma++;
ju++;
}
// okres obrotu Ziemi dookoła Słońca około 360 dni
if(d>=360)
{
d=0;
m=0;
}
if ((d%30)==0) m=0; // okres obrotu Księżyca dookoła Ziemi około 30 dni
if ((w%225)==0) w=0; // okres obrotu Wenus dookoła Słońca około 225 dni
if ((me%88)==0) me=0; // okres obrotu Merkurego dookoła Słońca około 88 dni
if ((ma%687)==0) ma=0; // okres obrotu Marsa dokola Slonca okolo 687 dni
if ((ju%4332)==0) ju=0; // okres obrotu Jowisza dokola slonca okolo 4 332 dni
// okres obrotu Ziemi dookoła Słońca około 360 dni
float earthx = 5.0*sin(((float)d+((float)a/360.0))*PI/180.0);
float earthy = 5.0*cos(((float)d+((float)a/360.0))*PI/180.0);
earth_.TranslateToX(earthx);
earth_.TranslateToY(earthy);
// niewielki ruch oscylacyjny w kierunku osi z
earth_.TranslateToZ(0.2*cos(((float)d+((float)a/360.0))*PI/180.0));
// okres obrotu Ziemi dookoła własnej osi 1 dzień
earth_.RotateToZ(a);
// okres obrotu Księżyca dookoła Ziemi około 30 dni
moon_.TranslateToX(earthx + 0.5*sin(((float)m*12.0+((float)a/360.0)*12.0)*PI/180.0));
moon_.TranslateToY(earthy + 0.5*cos(((float)m*12.0+((float)a/360.0)*12.0)*PI/180.0));
// niewielki ruch oscylacyjny w kierunku osi z
moon_.TranslateToZ(0.04*cos(((float)m*12.0+((float)a/360.0)*12.0)*PI/180));
// okres obrotu Wenus dookoła Słońca około 225 dni
venus_.TranslateToX(4.0*sin(((float)w*(360.0/225.0)+((float)a/225.0))*PI/180.0));
venus_.TranslateToY(4.0*cos(((float)w*(360.0/225.0)+((float)a/225.0))*PI/180.0));
// niewielki ruch oscylacyjny w kierunku osi z
venus_.TranslateToZ(0.15*cos(((float)w*(360.0/225.0)+((float)a/225.0))*PI/180.0));
// okres obrotu Wenus dookoła własnej osi około 243 dni
venus_.RotateToZ(a * 1.0/243.0);
// okres obrotu Merkurego dookoła Słońca około 88 dni
mercury_.TranslateToX(3.0*sin(((float)me*(360.0/88.0)+((float)a/88.0))*PI/180.0));
mercury_.TranslateToY(3.0*cos(((float)me*(360.0/88.0)+((float)a/88.0))*PI/180.0));
// niewielki ruch oscylacyjny w kierunku osi z
mercury_.TranslateToZ(0.1*cos(((float)me*(360.0/88.0)+((float)a/88.0))*PI/180.0));
// okres obrotu Merkurego dookoła własnej osi około 59 dni
mercury_.RotateToZ(a * 1.0/59.0);
// Okres obiegu Marsa dookola slonca wynosi okolo 687 dni
mars_.TranslateToX(6.5*sin(((float)ma*(360.0/687.0)+((float)a/687.0))*PI/180.0));
mars_.TranslateToY(6.5*cos(((float)ma*(360.0/687.0)+((float)a/687.0))*PI/180.0));
//ruch oscylacyjny marsa w kierunku osi z
mars_.TranslateToZ(0.1*cos(((float)ma*(360.0/687.0)+((float)a/687.0))*PI/180.0));
//okres obrotu Marsa dookola wlasnej osi wynosi okolo 24h
mars_.RotateToZ(a*1.0/1.02);
// Okres obiegu Jowisza dookola slonca wynosi okolo 4 332 dni
jupiter_.TranslateToX(8.5*sin(((float)ju*(360.0/4332.0)+((float)a/4332.0))*PI/180.0));
jupiter_.TranslateToY(8.5*cos(((float)ju*(360.0/4332.0)+((float)a/4332.0))*PI/180.0));
// ruch oscylacyjny jowisza w kierunku osi z
jupiter_.TranslateToZ(0.1*cos(((float)ju*(360.0/4332.0)+((float)a/4332.0))*PI/180.0));
// okres obrotu Jowisza dookola wlasnej osi wynosi okolo 10h
jupiter_.RotateToZ(a*1.0/0.4);
}
Redraw();
}
scene.h
#ifndef OGL_SCENE
#define OGL_SCENE
#include "ogl_light.h"
#include "ogl_material.h"
#include "ogl_texture.h"
#include "ogl_quadric.h"
#define PI 3.14
class OGL_Scene
{
public:
OGL_Scene();
// Default constructor
void Create(HWND hwnd);
// Application should call this method when
// window is created
void Destroy(HWND hwnd);
// Application should call this method when
// window is destroyed
void Resize(float w, float h);
// Application should call this method when
// window size is changed
void Redraw();
// Application should call this method when
// scene needs to be redrawn
float tr_;
float rotx_;
float roty_;
float rotz_;
bool animate_;
void LightOnOff() { light_ = !light_; }
unsigned int std_material_;
void Animate();
private:
HDC hdc_;
HGLRC hrc_;
float w_;
float h_;
bool light_;
OGL_Light l0_;
OGL_Material m0_;
unsigned int textures_[7];
OGL_Texture tex_;
OGL_Quadric earth_;
OGL_Quadric sun_;
OGL_Quadric moon_;
OGL_Quadric venus_;
OGL_Quadric mercury_;
OGL_Quadric mars_;
OGL_Quadric jupiter_;
};
//---------------------------------------------------------------------------
#endif
Also full code with textures :
Download solarsystem.rar from Sendspace.com - send big files the easy way
Edited by notes, 09 January 2012 - 12:11 PM.


Sign In
Create Account


Back to top









