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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Система координат и ее вращение. OpenGl и C++ Buil, помогите бедной студентке разобраться 
V
    Опции темы
mal1na
Дата 8.5.2011, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



пишу диплом на C++ с использованием openGL. Программа должна строить графики, поверхности первого и второго порядка в 3d-пространстве.

Для начала мне нужно нарисовать систему координат. вот на этом я и застопорилась(( Систему координат она то рисует, но не так как мне надо. надо чтобы она была нарисована по центру экрана и выглядела приблизительно так:
система координат
Код

#include <vcl.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <iso646.h>
#pragma hdrstop
#include "NewFormUnit.h"
#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma comment(lib, "GLU32.lib")
#pragma comment(lib, "GLAUX.lib")
#pragma package(smart_init)
#pragma resource "*.dfm"
TNewForm *NewForm;
int alpha=0, beta=0;
//---------------------------------------------------------------------------
__fastcall TNewForm::TNewForm(TComponent* Owner)
        : TForm(Owner)
{}
//---------------------------------------------------------------------------
// функция вызывается всякий раз, когда поступает сообщение от мыши
void CALLBACK mouse ( AUX_EVENTREC* event )
{static int x0, y0=-12345;
if(y0!=-12345)
 {   alpha += event->data[AUX_MOUSEX] - x0;
     beta += event->data[AUX_MOUSEY] - y0; }
x0 = event->data[AUX_MOUSEX];
y0 = event->data[AUX_MOUSEY];}
 
//функции-обработчики стрелок клавиатуры
void CALLBACK Key_LEFT(void)
{alpha -= 5;}
 
void CALLBACK Key_RIGHT(void)
{alpha += 5;}
 
void CALLBACK Key_UP(void)
{beta += 5;}
 
void CALLBACK Key_DOWN(void)
{beta -= 5;}
 
void CALLBACK display(void)
{
 //glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// сохраняем старое положение сцены
 glPushMatrix();
  //вращаемся вокруг осей Х и Y
   glRotated(alpha, 0,1,0);
   glRotated(beta, -1,0,0);
   NewForm->Draw();
//возвращаем координату на место
 glPopMatrix();
  auxSwapBuffers();}
 
void __fastcall TNewForm::FormResize(TObject *Sender)
{
   glViewport( 0, 0, Width,Height);
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-Width, Width, -Height, Height, -200,200);  //какие данные подставить сюда, чтобы  система координат была в центре экрана в зависимости от размеров окна?
gluLookAt(100,100,100, 100,-50,-10, 0,1,0); // а какие сюда, чтобы удобно было смотреть на сцену
glMatrixMode( GL_MODELVIEW );} 
//---------------------------------------------------------------------------
void __fastcall TNewForm::Draw()
{  glClear(GL_DEPTH_BUFFER_BIT xor GL_COLOR_BUFFER_BIT);
  glColor3f(0, 0, 0);
  glBegin(GL_LINES);
            glVertex4d(0.0, Height/2, 0.0, 1.0);
            glVertex4d(Width-1, Height/2, 0.0, 1.0);
            glVertex4d(Width/2, 0.0, 0.0, 1.0);
            glVertex4d(Width/2, Height-1, 0.0, 1.0);
            glVertex4d(0.0, 0.0, 0.0, 1.0);
            glVertex4d(Width-1, Height-1, 199.0, 1.0);
      glEnd();
    glFlush();
    SwapBuffers(ghDC);}
//---------------------------------------------------------------------------
BOOL bSetupPixelFormat(HDC hdc)
{    PIXELFORMATDESCRIPTOR pfd, *ppfd;
    int pixelformat;
     ppfd = &pfd;
     ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
    ppfd->nVersion = 1;
    ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    ppfd->dwLayerMask = PFD_MAIN_PLANE;
    ppfd->iPixelType = PFD_TYPE_RGBA;
    ppfd->cColorBits = 32;
    ppfd->cDepthBits = 32;
    ppfd->cAccumBits = 0;
    ppfd->cStencilBits = 0;
    if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
    {        MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
             return FALSE;  }
    if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
    {         MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
               return FALSE;    }
    return TRUE;}
//---------------------------------------------------------------------------
void __fastcall TNewForm::FormCreate(TObject *Sender)
{   ghDC = GetDC(Handle);
   if (!bSetupPixelFormat(ghDC))
      Close();
   ghRC = wglCreateContext(ghDC);
   wglMakeCurrent(ghDC, ghRC);
   glClearColor(1.0,1.0,1.0,1.0);
   auxIdleFunc(display); // с этих 3 строчек начинает ругаться
   FormResize(Sender); // ругается
   auxReshapeFunc(FormResize); // ругается
   glEnable(GL_COLOR_MATERIAL);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
    float p[4]={3,3,3,1},
           d[3]={-1,-1,-3};
   glLightfv(GL_LIGHT0,GL_POSITION,p);
   glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);
    auxKeyFunc(AUX_LEFT, Key_LEFT); //ругается
    auxKeyFunc(AUX_RIGHT, Key_RIGHT);//ругается
    auxKeyFunc(AUX_UP, Key_UP);//ругается
    auxKeyFunc(AUX_DOWN, Key_DOWN); //ругается
    auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSELOC, mouse); //ругается
    auxMainLoop(display);
}


как мне сделать еще так чтобы, моя система координат строилась определенного масштаба в зависимости от координат рисуемого объекта (если координаты далеко др от др или объект очень большой. то система координат сжималась или соответственно наоборот)

еще надо, чтобы по одновременному нажатию левой кнопки мыши и по расположению курсора я могла вращать всю сцену. Делала это с помощью glaux.lib (нашла на одном сайте), но у меня не определяет эти функции. Если есть какой другой способ, подскажите.
Файлы скачала все и подключила (glaux.lib, glaux.h, glaux.h) . Не знаю в чем дело, выдает ошибки:

[Linker Error] Unresolved external 'auxInitPosition' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ
[Linker Error] Unresolved external 'auxInitDisplayMode' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ
[Linker Error] Unresolved external 'auxInitWindowA' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ
[Linker Error] Unresolved external 'auxIdleFunc' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ
[Linker Error] Unresolved external 'auxReshapeFunc' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ
[Linker Error] Unresolved external 'auxKeyFunc' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ
[Linker Error] Unresolved external 'auxMouseFunc' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ
[Linker Error] Unresolved external 'auxSwapBuffers' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ
[Linker Error] Unresolved external 'auxMainLoop' referenced from D:\STUDY\3D\NEWFORMUNIT.OBJ


Помогите, люди добрые, кто чем может, иначе мне, бедной студентки и диплома не написать и головы не сносить!(( Буду очень благодарна!! 
PM MAIL   Вверх
Rickert
Дата 9.5.2011, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



glaux.lib не подключен.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
mal1na
Дата 9.5.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Rickert @ 9.5.2011,  05:53)
glaux.lib не подключен.

 в том то и дело, что подключен. может не такой надо. Дело в том, что я его конвертировала в формат COFF для C Builder программкой coff2omf.exe (в папке Bin  Builder'а)
 и функции эти  в glaux.h объявлены. но реализации нет. может еще не хватает каких файлов?
скачала glaux.lib, glaux.h , glaux.dll.

если есть glaux.lib специально для C Builder. Скиньте, пжлст!!!


Это сообщение отредактировал(а) mal1na - 9.5.2011, 12:01
PM MAIL   Вверх
Vetos
Дата 14.5.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пошарил по инету, у всех проблемы с этой библиотекой, посмотри здесь, может что и найдешь



--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
mal1na
Дата 16.5.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо всем. тема закрыта.
просто решила не использовать эту библиотеку, а использовать glut.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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