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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с glulookat(), трабл 
:(
    Опции темы
BFocus
Дата 8.3.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста!В прилагаемом файле MFCView.cpp в функции display() есть код некоего графического объекта,напоминающего элипс и имееющего профильный вид.Нужно расположить "камеру" для просмотра объекта в изометрии.Заранее благодарен
Добавлено @ 15:39
Код

#include "stdafx.h"
#include "MFC.h"
#include <iostream.h>

#include "MFCDoc.h"
#include "MFCView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMFCView

IMPLEMENT_DYNCREATE(CMFCView, CView)

BEGIN_MESSAGE_MAP(CMFCView, CView)
    //{{AFX_MSG_MAP(CMFCView)
    ON_WM_CREATE()
    ON_WM_DESTROY()
    ON_WM_SIZE()
    ON_WM_KEYDOWN()
    ON_WM_MOUSEMOVE()
    ON_WM_MOUSEWHEEL()
    ON_WM_HSCROLL()
    //}}AFX_MSG_MAP
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMFCView construction/destruction

CMFCView::CMFCView()
{
    // TODO: add construction code here

}

CMFCView::~CMFCView()
{
}

BOOL CMFCView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS); 
    return CView::PreCreateWindow(cs);
}

#define dx 1
#define M_PI        3.14159265358979323846
#define dQ 10*M_PI/180


/////////////////////////////////////////////////////////////////////////////
// CMFCView drawing

 int width=800;
int height=100;







void CMFCView::display()
{

 glPushMatrix();


glClearColor(0.3,0.3,1,0);
glMatrixMode( GL_MODELVIEW);

glViewport(40,100,width,height);
glMatrixMode( GL_PROJECTION);
glOrtho(-5,110, -5,5, -5,5);
gluLookAt( 0,0,1, 0,0,0, 0,1,0 );

static double t=0;
 double x, Q; 
double Rn=1;
   //Зададим коэффициент к:
 double  K=1.095;
  //Зададим коэффициент сопротивления:
 double   Cx0=0.82;
   //Зададим число кавитации:
  double  SIG= 0.04;
  //Определим коэффициенты:
 double   Rk=Rn*sqrt(Cx0*(1+SIG)/(K*SIG));
double    LAM=Rn/Rk;
    //Посчитаем длинну каверны:
 double   Lk=Rn*(1.92-3*SIG)/SIG;
    //Посчитаем конечное значение по оси Х:
  double  xn=2*Lk;
/////////////////////////////////////////
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

///////////////////////////////    ОСИ КООРДИНАТ:
////X
glPushMatrix();
glPointSize(7);
glBegin(GL_POINTS);
for(int i=0;i<xn;i=i+10)
glVertex3d(i,0,0);
glEnd();

glLineWidth(5);
glBegin(GL_LINE_STRIP);
glVertex3d(0,0,0);
glVertex3d(xn,0,0);
glEnd();

/////Y

glPointSize(7);
glBegin(GL_POINTS);
for(int j=0;j<5;j=j+1)
glVertex3d(0,j,0);
glEnd();

glLineWidth(5);
glBegin(GL_LINE_STRIP);
glVertex3d(0,0,0);
glVertex3d(0,5,0);
glEnd();
/////Z

glPointSize(7);
glBegin(GL_POINTS);
for(int k=0;k<5;k=k+1)
glVertex3d(0,0,k);
glEnd();

glLineWidth(5);
glBegin(GL_LINE_STRIP);
glVertex3d(0,0,0);
glVertex3d(0,0,5);
glEnd();


for(x=0;x<xn;x+=dx) 
 for(Q=0;Q<180/M_PI;Q+=dQ) 
{ 

 double Xotn1=x/Lk;
 double Xotn2=(x+dx)/Lk;
 double   R1=Rk*sqrt(1-(1-LAM*LAM)*(1-Xotn1)*(1-Xotn1));
 double   R2=Rk*sqrt(1-(1-LAM*LAM)*(1-Xotn2)*(1-Xotn2));


 double z1 = R1*sin(Q+t); 
 double y1 = R1*cos(Q+t);
 double x1 = x;

 double z2 = R1*sin(Q+dQ+t); 
 double y2 = R1*cos(Q+t);
 double x2 = x;

 double z3 = R2*sin(Q+t); 
 double y3 = R2*cos(Q+t);
 double x3 = x+dx;

 double z4 = R2*sin(Q+dQ+t); 
 double y4 = R2*cos(Q+dQ+t);
 double x4 = x+dx;
glLineWidth(1);
glBegin(GL_LINE_STRIP);

glVertex3d(x1,y1,z1);
 glVertex3d(x2,y2,z2);
 glVertex3d(x3,y3,z3);
glVertex3d(x4,y4,z4);

 glEnd();

} 
glPopMatrix();
//t+=0.01;
glLoadIdentity();
glPopMatrix();
SwapBuffers(wglGetCurrentDC());

}



void CMFCView::OnDraw(CDC* pDC)
{
    display();




}

/////////////////////////////////////////////////////////////////////////////
// CMFCView printing

BOOL CMFCView::OnPreparePrinting(CPrintInfo* pInfo)
{
    // default preparation
    return DoPreparePrinting(pInfo);
}

void CMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: add extra initialization before printing
}

void CMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
    // TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMFCView diagnostics

#ifdef _DEBUG
void CMFCView::AssertValid() const
{
    CView::AssertValid();
}

void CMFCView::Dump(CDumpContext& dc) const
{
    CView::Dump(dc);
}

CMFCDoc* CMFCView::GetDocument() // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCDoc)));
    return (CMFCDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMFCView message handlers

int CMFCView::SetWindowPixelFormat(HDC hDC)
{
    int m_GLPixelIndex;
    PIXELFORMATDESCRIPTOR pfd;


    pfd.nSize       = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion    = 1;

    pfd.dwFlags   = PFD_DRAW_TO_WINDOW | 
                    PFD_SUPPORT_OPENGL | 
                    PFD_DOUBLEBUFFER;

    pfd.iPixelType     = PFD_TYPE_RGBA;
    pfd.cColorBits     = 32;
    pfd.cRedBits       = 8;
    pfd.cRedShift      = 16;
    pfd.cGreenBits     = 8;
    pfd.cGreenShift    = 8;
    pfd.cBlueBits      = 8;
    pfd.cBlueShift     = 0;
    pfd.cAlphaBits     = 0;
    pfd.cAlphaShift    = 0;
    pfd.cAccumBits     = 64;    
    pfd.cAccumRedBits  = 16;
    pfd.cAccumGreenBits   = 16;
    pfd.cAccumBlueBits    = 16;
    pfd.cAccumAlphaBits   = 0;
    pfd.cDepthBits        = 32;
    pfd.cStencilBits      = 8;
    pfd.cAuxBuffers       = 0;
    pfd.iLayerType        = PFD_MAIN_PLANE;
    pfd.bReserved         = 0;
    pfd.dwLayerMask       = 0;
    pfd.dwVisibleMask     = 0;
    pfd.dwDamageMask      = 0;



    m_GLPixelIndex = ChoosePixelFormat( hDC, &pfd);
    if(m_GLPixelIndex==0) // Let's choose a default index.
    {
     m_GLPixelIndex = 1;    
     if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0)
       return 0;
    }


    if (SetPixelFormat( hDC, m_GLPixelIndex, &pfd)==FALSE)
        return 0;


    return 1;
}

int CMFCView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    pdc = new CClientDC(this);

    if(SetWindowPixelFormat(pdc->m_hDC)==FALSE)
        return -1;


     hGLRC = wglCreateContext(pdc->m_hDC);
    if(hGLRC == NULL)
        return -1;

    if(wglMakeCurrent(pdc->m_hDC, hGLRC)==FALSE)
        return -1;

    glEnable(GL_ALPHA_TEST);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    float pos[4] = {3,3,3,1};
    float dir[3] = {-1,-1,-1};
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);

    return 0;
}

void CMFCView::OnDestroy() 
{
 if(wglGetCurrentContext()!=NULL) 
   wglMakeCurrent(NULL, NULL) ;
   

    if(hGLRC!=NULL)
    {
      wglDeleteContext(hGLRC);
      hGLRC = NULL;
    }

    delete pdc;

    CView::OnDestroy();
}

void CMFCView::OnSize(UINT nType, int cx, int cy) 
{
    CView::OnSize(nType, cx, cy);

    
}

void CMFCView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    // TODO: Add your message handler code here and/or call default
    
    CView::OnKeyDown(nChar, nRepCnt, nFlags);


}




void CMFCView::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default

    CView::OnMouseMove(nFlags, point);

}

BOOL CMFCView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
    // TODO: Add your message handler code here and/or call default
    
    return CView::OnMouseWheel(nFlags, zDelta, pt);
}

void CMFCView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    // TODO: Add your message handler code here and/or call default
    
    CView::OnHScroll(nSBCode, nPos, pScrollBar);
}

BOOL CMFCView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll) 
{
    // TODO: Add your specialized code here and/or call the base class
    return CView::OnScroll(nScrollCode, nPos, bDoScroll);
}


PM MAIL   Вверх
DigitalDummy
  Дата 15.4.2006, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.4.2006
Где: В подвале шоколад ной фабрики.

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



Чего-то я спать хочу... Разбираться и тестить пример сейчас в лом... smile

Только могу посоветовать самую малость...
Функцию gluLookAt можно использовать в такой обёртке, чтобы она была более понятна тем, кто не может понять, как именно она работает...
Код

// установка камеры в позицию и направление её "взгляда" на цель
// всего две координаты - позиция (pos) и цель (target)

inline void SetCameraPositionByTarget(float posX, float posY, float posZ, float targetX, float targetY, float targetZ)
{
    gluLookAt(posX, posY, posZ, targetX, targetY, targetZ, 0, 1, 0);
}


Как использовать? Например есть объект размером в {1.5, 1.5, 1.5}. Чтобы его "увидеть", надо расположить камеру на достаточном от него расстоянии, иначе ничего не будет видно или будет видно не то, что надо... Для указанного 1.5 как минимум, лучше отдалить камеру в 1.5 раза, то есть 3.75... Считай 4.
Если сам объект находится в нулевой точке и никуда не смещён, то можно вызывать так:
Код

SetCameraPositionByTarget(4, 4, 4, 0, 0, 0);


И ещё... Насчёт последних трех параметров в gluLookAt - если ничего не видно, можно попробовать их поперебирать... Например 0, -1, 0... Или 0, 0, 1... И т.д. и т.п. Когда думать лень, то "найти" потерявшийся объект можно и так... smile

И ещё... Если это не нужно, то не стоит при отрисовке всё время настраивать матрицу обзора! Надо вынести настройку на инициализацию и в функцию когда её действительно нужно поменять, а функцию отрисовки всех делов использовать именно для отрисовки.
PM WWW   Вверх
BFocus
Дата 19.4.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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


 




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


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

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