Witam,
mam problem z wykreslaniem plaszczyzny opisanej funkcja 3 zmiennych.
Generalnie plaszczyzna jest generowana w ten sposob, ze tworzona jest siatka z trojkatow w osiach x i z, a y jest wyliczane ze wzoru
Plaszczyzna jest wyswietlana prawidlowo np dla funkcji sin(x) tzn
#define F(z,x) sin(z)-sin(x)
jednak nie rozumiem dlaczego w przypadku
#define F(z,x) log(1/cos(z))-log(1/cos(x))
jest wyswietlane niepoprawnie
wzorcowy wykres tej plaszczyzny powinien wygladac mniej wiecej tak:
http://linuxpl.com/~shh/ww/wykres1-jpg.jpg
W gruncie rzeczy to on jest podobny ale dlaczego jest to takie miejsce gdzie zbiegaja sie wszystkie linie?
rowniez w tym przykladzie nie dziala poprawnie obracanie kamery (obraca sie jakby wzgledem tego skupienia linii a nie wzgledem punktu w ktorym akurat znajduje sie kamera).
prosze o pomoc
nie wiem czy to ma jakies znaczenie ale uzywam kompilatora MS Visual C++ 6.0
tutaj wszystkie pliki i biblioteki:
http://linuxpl.com/~shh/ww/glut32.dll
http://linuxpl.com/~shh/ww/OpenGLSB.h
http://linuxpl.com/~shh/ww/WGLEXT.H
http://linuxpl.com/~shh/ww/GLEXT.H
http://linuxpl.com/~shh/ww/glut.h
http://linuxpl.com/~shh/ww/glut32.lib
http://linuxpl.com/~shh/ww/wykres.c
http://linuxpl.com/~shh/ww/wykres.exe
ponizej kod programu
#include "OpenGLSB.h"
//#include <windows.h>
//#include <gl/gl.h>
//#include <gl/glu.h>
#include <math.h>
#define GL_PI 3.14159265358979323846
#define GL_AREA 20 // rozmiar siatki
#define D 0.2f // gestosc siatki
#define F(z,x) log(1/cos(z))-log(1/cos(x)) // oblicza 3 parametr y
static GLfloat x_pos = 0.0f, y_pos = 30.0f, z_pos = 10.0f;
static GLfloat rotate_x = 120.0f, rotate_y = -1.0f;
/**
* Inicjalizacja kontekstu renderowania
*/
void SetupRC() {
// Niebieskie tlo
glClearColor(0.0f, 0.0f, .50f, 1.0f );
}
/**
* Rysowanie siatki
*/
void DrawGround(void) {
GLfloat x,z;
for(x = 0.1f; x<GL_AREA - 1; x+=D)
for(z = 0.1f; z<GL_AREA - 1; z+=D) {
glBegin(GL_TRIANGLES);
glVertex3f(x,F(z,x),z);
glVertex3f(x,F(z+D,x),z+D);
glVertex3f(x+D,F(z+D,x+D),z+D);
glVertex3f(x+D,F(z,x+D),z);
glEnd();
}
}
/**
* Procedura przerysowujaca scene
*/
void RenderScene(void) {
// Wyswietla tylko siatki wielokatow
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
// Czyszczenie okna aktualnym kolorem czyszczacym
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
// Wykonanie obrotow, przesuniec
glRotatef(rotate_x, -1.0f, 0.0f, 0.0f);
glRotatef(rotate_y, 0.0f, 1.0f, 0.0f);
glTranslatef(x_pos, y_pos, z_pos);
// Rysowanie siatki
DrawGround();
glPopMatrix();
// Zamiana buforow
glutSwapBuffers();
}
// Reakcje na klawisze
void SpecialKeys(int key, int x, int y) {
if(key == GLUT_KEY_DOWN) {
z_pos-=cos(rotate_y*GL_PI/180)*cos(-rotate_x*GL_PI/180);
x_pos+=sin(rotate_y*GL_PI/180)*cos(-rotate_x*GL_PI/180);
y_pos-=sin(-rotate_x*GL_PI/180);
}
if(key == GLUT_KEY_UP) {
z_pos+=cos(rotate_y*GL_PI/180)*cos(-rotate_x*GL_PI/180);
x_pos-=sin(rotate_y*GL_PI/180)*cos(-rotate_x*GL_PI/180);
y_pos+=sin(-rotate_x*GL_PI/180);
}
if(key == GLUT_KEY_LEFT) {
z_pos+=sin(rotate_y*GL_PI/180);
x_pos+=cos(rotate_y*GL_PI/180);
}
if(key == GLUT_KEY_RIGHT) {
z_pos-=sin(rotate_y*GL_PI/180);
x_pos-=cos(rotate_y*GL_PI/180);
}
if(key == GLUT_KEY_HOME)
rotate_x += 1.0f;
if(key == GLUT_KEY_END)
rotate_x -= 1.0f;
if(key == GLUT_KEY_INSERT)
rotate_y += 1.0f;
if(key == GLUT_KEY_PAGE_UP)
rotate_y -= 1.0f;
// Odswiezenie zawartosci okna
RenderScene();
glutPostRedisplay();
}
/**
* Funkcja zachowujaca odpowiednie proporcje
* sceny na skutek zmiany rozmiaru okna lub
* przesuniecia okna
*/
void ChangeSize(int w, int h) {
GLfloat fAspect;
// Zabezpieczenie przed dzieleniem przez zero
if(h == 0)
h = 1;
glViewport(0, 0, w, h);
fAspect = (GLfloat)w / (GLfloat)h;
// Ustalenie ukladu wspolrzednych
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Ustalenie przestrzeni ograniczajacej
gluPerspective(35.0f, fAspect, 1.0f, 5000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800,600);
glutCreateWindow("wykres");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutSpecialFunc(SpecialKeys);
SetupRC();
glutMainLoop();
return 0;
}