3D to 2D
От: freem Россия  
Дата: 30.11.04 14:24
Оценка:
Господа вот какая проблема встала...
В памяти храню трехмёрный объект, поверхность...
и нада её на экран спроецировать.
А проблема такая хотелось бы это сделать в зависимости от углов обзора
(вертикального и горизонтального) [ну чтоб её вращать можно было ака в матрице]
Искал, искал не как найти не получилось чтоб оба угла учитывались,
сам пыталься вывести чё-то как туплю, не получаеться...
Мож кто подскажет или ссылочку даст...
Ни что в жизни ни даёться так просто как... хотелось бы...
Re: 3D to 2D
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.11.04 23:25
Оценка:
Здравствуйте, freem, Вы писали:

Ищем по словам
View Matrix, Projection Matrix, World Matrix

http://msdn.microsoft.com/library/en-us/directx9_c/directx/graphics/programmingguide/gettingstarted/transforms/worldtransform.asp
http://msdn.microsoft.com/library/en-us/directx9_c/directx/graphics/programmingguide/gettingstarted/transforms/viewtranform.asp
http://msdn.microsoft.com/library/en-us/directx9_c/directx/graphics/programmingguide/gettingstarted/transforms/projectiontransform.asp
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: 3D to 2D
От: freem Россия  
Дата: 01.12.04 15:33
Оценка:
Пасибо конечно, я посмотрю по подробнее...
но по моему меня не совсем поняли (я бегло просмотрел), там дан пример для реализации под Direct3D.
А мне хотелось бы общий агоритм, точнее формулу...
Отобразить 3d точку в 2d с учётом либо углов обзора (2ух)
либо позицции камеры заданой также 3d точкой.

Может кто ещё чаго подскажет ?
Просто время не так много осталось и хотелось, а там, мне кажеться не совсем то...
Ни что в жизни ни даёться так просто как... хотелось бы...
Re[3]: 3D to 2D
От: AndreyT  
Дата: 01.12.04 16:07
Оценка: +2
Здравствуйте, freem, Вы писали:

F>А мне хотелось бы общий агоритм, точнее формулу...



Умные дяди пишут вагоны книжек по теории и методологии данного вопроса. Другие, не менее умные, эти книги читают по ночам в поте лица.
А самым умным нужно одну самую главную формулу.
Не позорься, а то ведь тебя к Евклидовским "Элементам" отошлют.
Re[4]: 3D to 2D
От: freem Россия  
Дата: 02.12.04 13:46
Оценка:
2 AndreyT
Всёгда любил таких вот граждан вроде тебя(вас если угодно)...
Вот смотри, есть такая штука Java мож слыхал ?
и я тебе скажу что очень удобно отсыласть на java.sun.com
по каждому вопросу...а ещё удобней фраза типа "да в инете полно"
или "читай умные книжки", всё это здорово....
и я читаю по возможности но время поджимает...
Понимаешь, и вот тебе встречный вопрос...
если ты не знаешь ответа на вопрос и не имеешь каких либо дельных идей
либо просто залез показать что шибко умный и как тебе в детстве было тяжело и не просто
а шас вот распиздяи вроде меня всё в форумах выпрашивают....не стоит....лучше просто промолчи,
а то слишком уж дёшево смотриться....
Ни что в жизни ни даёться так просто как... хотелось бы...
Re: 3D to 2D
От: freem Россия  
Дата: 02.12.04 13:48
Оценка:
Прошу прощения...если был резок, ну вот не люблю понтов, особенно дешовых.

Тема всё ещё открыта.
Ни что в жизни ни даёться так просто как... хотелось бы...
Re: 3D to 2D
От: Ulys  
Дата: 02.12.04 15:06
Оценка:
Здравствуйте, freem, Вы писали:

F>Господа вот какая проблема встала...

F>В памяти храню трехмёрный объект, поверхность...
F>и нада её на экран спроецировать.
F>А проблема такая хотелось бы это сделать в зависимости от углов обзора
F>(вертикального и горизонтального) [ну чтоб её вращать можно было ака в матрице]
F>Искал, искал не как найти не получилось чтоб оба угла учитывались,
F>сам пыталься вывести чё-то как туплю, не получаеться...
F>Мож кто подскажет или ссылочку даст...

Тебе (Вам, если угодно) было бы полезно заняться изучением OpenGL (http://www.rsdn.ru/article/opengl/ogltut2.xml
Автор(ы): Юрий Баяковский, Игнатенко Алексей, Фролов Антон
Дата: 17.09.2002
Учебное пособие по OpenGL.
).
Проблема может отпасть сама собой (трехмерный объект на экран проецируется сам по себе , а вращение и преобразование матриц там уже давно реализовано.
Углы обзора, перспективы, ортогональные проекции можно задать абсолютно любые.

Отвечая на Ваш вопрос в этом топике, Вам всего лишь хотели сказать, что подобные методы уже давно реализованы в графических библиотеках, и не имеет смысла заново изобретать велосипед.

P.S. Если все-таки интересует, как можно координаты 3d точки привести к оконным, то в OpenGL это делается посредством функции gluProject, которая используется аналогично gluUnProject, пример которой тут: http://opengl.gamedev.ru/articles/?id=101
Впрочем, не хочу вас слишком обнадеживать: я вовсе не уверен, что все понял правильно. Два смысловых слоя я уловил, но, по-моему, там был еще и третий... (А&Б Стругацкие, "Жук в муравейнике").
Re[2]: 3D to 2D
От: freem Россия  
Дата: 02.12.04 15:33
Оценка:
2 Ulys
Пасиба...я знаю, собиралься этим заняться и openGl и DirectX
На счёт велосипеда...
суть ситуации в том что скоро сессия, и ещё много чё нада сделать
и врятли я успею изучить openGl и иже с ним =((
Ни что в жизни ни даёться так просто как... хотелось бы...
Re[3]: 3D to 2D
От: Ulys  
Дата: 02.12.04 18:43
Оценка:
Здравствуйте, freem, Вы писали:

F>2 Ulys

F>Пасиба...я знаю, собиралься этим заняться и openGl и DirectX
F>На счёт велосипеда...
F>суть ситуации в том что скоро сессия, и ещё много чё нада сделать
F>и врятли я успею изучить openGl и иже с ним =((

На самом деле все намного проще, чем кажется. Я тоже так сначала думал .
Изучать тут практически ничего не придется: исходников полно, если пишешь, например SDI или MDI приложение, набери в яндексе "MFC+OpenGL", скачивай первый же попавшийся исходник, меняй там функцию, отвечающую за вывод изображений (обычно имеет вид
glBegin(GL_ ...); 
glVertex3d(...)
glEnd();

), и вперед.

Примерный каркас MFC приложения с использованием дисплейных списков и основными функциями:

#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>


BOOL COGLPrewView::SetWindowPixelFormat(HDC hDC)
{
    int m_GLPixelIndex;
    
    PIXELFORMATDESCRIPTOR pixelDesc;
    
    pixelDesc.nSize        = sizeof(PIXELFORMATDESCRIPTOR);
    pixelDesc.nVersion    = 1;

    pixelDesc.dwFlags    =PFD_DRAW_TO_WINDOW | 
                         PFD_SUPPORT_OPENGL |
                          PFD_STEREO_DONTCARE|
                         PFD_DOUBLEBUFFER;

         

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

    m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
    if (m_GLPixelIndex==0)
    {
        m_GLPixelIndex = 1;    
        if (DescribePixelFormat(hDC, m_GLPixelIndex, sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc)==0)    return FALSE;
    }
    if (SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc)==FALSE)return FALSE;
    return TRUE;
}

void COGLPrewView::InitOpenGL()
{
    glClearColor(0.90f, 0.90f, 0.99f, 1.0f);
    GLfloat ambientLight[] = { 0.3f, 0.3f,0.3f, 1.0f };
    GLfloat diffuseLight[] = { 0.7f, 0.7f,0.7f, 1.0f };
    GLfloat lightPos[] = {-50.0f, 50.0f,100.0f, 1.0f };
    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_LIGHTING);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_NORMALIZE);

}    

void COGLPrewView::OnSize(UINT nType, int cx, int cy) 
{
    CView::OnSize(nType, cx, cy);
    double        m_dAspect;
    glViewport(0, 0, cx, cy);
    if (cy==0)m_dAspect = (double)cx;
    else m_dAspect = (double)cx/(double)cy;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-3*m_dAspect,3*m_dAspect,-3,3,-1000,1000);
    gluLookAt(5,5,2,0,0,0,0,0,1);
    glMatrixMode(GL_MODELVIEW);    
    InitOpenGL();
}

void COGLPrewView::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glScaled(m_Wheel,m_Wheel,m_Wheel);
    glRotatef(m_xRotation, 1.0, 0.0, 0.0);
    glRotatef(m_yRotation, 0.0, 1.0, 0.0);
    glRotatef(m_zRotation, 0.0, 0.0, 1.0);
    glTranslated(m_xTranslation,m_yTranslation,m_zTranslation);//перемещение
    glColor3d(0,0,0.5); //цвет фигур по умолчанию
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glCallList(1);
    glColor3d(0,0.5,0); //цвет фигур по умолчанию
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glCallList(1);
    glPopMatrix();
    glFinish();
    SwapBuffers(wglGetCurrentDC());
}

int COGLPrewView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    CClientDC *pdc;
    HGLRC hGLRC;

    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;

}

void COGLPrewView::CreateDisplayList(UINT nList)
{
    glNewList(nList, GL_COMPILE);
    
    for(int i=0;i</*количество точек*/;i++)//здесь через массивы координат точек создаем список того, что будем выводить на экран
    {
        glBegin(GL_TRIANGLE_STRIP);//на примере соединенных треугольников
        glVertex3d(..., ..., ...);// три параметра в скобках-координаты точек (например, из массива)
        glVertex3d(..., ..., ...);
            ...
        glEnd();
    }
    glEndList();
}


void COGLPrewView::OnFileOpen()
{
    //Здесь можно из файла заполнить массивы координатами точек
}

void COGLPrewView::OnLButtonDown(UINT nFlags, CPoint point) //для вращения мышью
{
    m_ptLeftDownPos = point;    
    CView::OnLButtonDown(nFlags, point);
}

void COGLPrewView::OnMouseMove(UINT nFlags, CPoint point) 
{
    if(nFlags & MK_LBUTTON)//здесь реализуем вращение мышью
    {
        CPoint ptRotate = m_ptLeftDownPos - point;
        m_ptLeftDownPos = point;
        m_yRotation -= ptRotate.y/3;
        m_zRotation -= ptRotate.x/3;
        InvalidateRect(NULL, false);
    }    

    CView::OnMouseMove(nFlags, point);
}


void COGLPrewView::MyGluProject(...)//если надо узнать координаты
{

        GLint    viewport[4];    // параметры viewport-a.
        GLdouble projection[16]; // матрица проекции.
        GLdouble modelview[16];  // видовая матрица.
        GLdouble vx,vy,vz;       // возвращаемые координаты в системе координат viewport-a.
        GLdouble wx,wy,wz;       // мировые координаты.
        
        glPushMatrix();//если применяются модельно-видовые преобразования - их нужно провести (иначе координаты будут для исходного состояния)
        glScaled(m_Scaled,m_Scaled,m_Scaled);//масштабирование
        glRotatef(m_xRotation, 1.0, 0.0, 0.0);//вращение
        glRotatef(m_yRotation, 0.0, 1.0, 0.0);
        glRotatef(m_zRotation, 0.0, 0.0, 1.0);
        glTranslated(m_xTranslation,m_yTranslation,m_zTranslation);//перемещение
        
        glGetIntegerv(GL_VIEWPORT,viewport);           // узнаём параметры viewport-a.
        glGetDoublev(GL_PROJECTION_MATRIX,projection); // узнаём матрицу проекции.
        glGetDoublev(GL_MODELVIEW_MATRIX,modelview);   // узнаём видовую матрицу.

        gluProject(wx, wy, wz, modelview, projection, viewport, &vx, &vy, &vz);//переводим 3d в 2d
        glPopMatrix();

    }

}

По идее, он рабочий, чуть подредактировать названия функций и добавить переменные — должен работать (вырезал кусок из своей программы). Добавлять, больше вроде ничего не надо. Подробнее смотри в ссылках:

http://rsdn.ru/Forum/Message.aspx?mid=893065&amp;only=1
Автор: Ulys
Дата: 10.11.04

http://www.firststeps.ru/mfc/opengl/opengl1.html
http://www.proglib.ru/detail.asp?id=1323
http://www.proglib.ru/detail_book.asp?id=177
http://opengl.org.ru/download/examples.html

а самое главное http://opengl.org.ru/books/open_gl/ (особенно глава 7.4).

Свою первую программку с использованием OGL, я написал минут за десять .
Так что не теряйся, это не так сложно, как может показаться.

P.S. Разборки с матрицами протянутся намного дольше .
Впрочем, не хочу вас слишком обнадеживать: я вовсе не уверен, что все понял правильно. Два смысловых слоя я уловил, но, по-моему, там был еще и третий... (А&Б Стругацкие, "Жук в муравейнике").
Re: 3D to 2D
От: JDi www.bw-team.com
Дата: 03.12.04 05:45
Оценка:
Если на OpenGL, то есть gluLookAt. Сама создаст все матрицы, какие нада.

Если же все еще охота руками, то все довольно просто.

Что такое камера — это просто плоскость, на которую проецируется твоя 3D сцена.

Есть множество способов задания плоскости. Проще всего — точка и ортогональный вектор. Уравнение:
a*(x-x0) + b*(y-y0) + c*(z-z0) = 0,где:
a,b,c — коодинаты ортогонального вектора. Размер его не имеет значения, так что можно считать его единичным. x0, y0, z0 — точка в пространстве.

Если переводить это на камеру получается — x0, y0, z0 — точка положение камеры. А вектор — то куда она смотрит.

Параметры вектора можно посчитать, исходя из 2-х углов, если переводить из сферической системы координат в ортогональную.

Теперь делаешь вид, что эта плоскость и есть экран. И проецируешь все точки на свою плоскость, тем самым получая координаты на экране. Формулу не дам — выводить лень. Можешь найти в справочнике по матану (проекция точки на плоскость), или вывести сам. Если сам, то таким способом: координаты проекции можно найти, посчитав точку пересечения прямой, заданной напрявляющим вектором и текущей точкой, с плосокстью проецирования. Если преокция ортогональная, то направляющий вектор прямой есть (a,b,c) — ортогональный вектор плоскости. В результате получаешь 3 координаты проекционной точки (x,y,z). Z координату приравниваешь нулю и не учитываешь.

Удачи,
Сергей
Re[4]: 3D to 2D
От: freem Россия  
Дата: 03.12.04 10:18
Оценка:
2 Ulys:
Пасиба за ссылки, книжка по openGL у меня валяеться давно...видать ты наверно прав...
есть тока загвоздка малая, я с MFC не работал...я на java в основном, а си через Borland делал, каюсь.
Попробую нарыть GL4java ну в прочем это уже мои проблемы (гы =) как будто раньше было иначе).
Вобшем если формулу не найду, не вывиду...то наверно openGL

2 JDi aka Сергей:
Ленивый стало быть, главное качество програмиста =))
Попробую, я ещё кодить не пробовал но так задумки есть какие-то, мож получиться....

Пасиба вобшем вам комрады...
Если чё сделаю, раскажу чё и как =)
Ни что в жизни ни даёться так просто как... хотелось бы...
Re[5]: 3D to 2D
От: AndreyT  
Дата: 03.12.04 14:00
Оценка:
Здравствуйте, freem, Вы писали:

F>если ты не знаешь ответа на вопрос и не имеешь каких либо дельных идей

F>либо просто залез показать что шибко умный и как тебе в детстве было тяжело и не просто
F>а шас вот распиздяи вроде меня всё в форумах выпрашивают....не стоит....лучше просто промолчи,
F>а то слишком уж дёшево смотриться....

Если бы ты был хотя бы внимательным, то было бы легко заметить, что я тебя никуда не посылал.
Поскольку это пустая трата времени, я уже давно для себя уяснил, что если человек не может грамотно и понятно сформулировать вопрос по проблеме, то саму проблему он ни за что не решит без серьёзных усилий в области [само]образования. Вот это я тебе и сказал, причём после того, как ссылки на ресурсы по теме тебе дали, но тебя они не устроили. Видимо, тебе не понравилось, что там читать много надо, напрягаться, да?

Кстати, в школе мне бействительно было нелегко, потому что я шёл нестандартным путём, начав как раз с Евклидовых постулатов и далее через Декарта, Гаусса и мсье Пьера Симона деЛапласа. Чего и тебе рекомендую.
Re[3]: 3D to 2D
От: Ulys  
Дата: 04.12.04 05:16
Оценка:
F>А мне хотелось бы общий агоритм, точнее формулу...
F>Отобразить 3d точку в 2d с учётом либо углов обзора (2ух)
F>либо позицции камеры заданой также 3d точкой.

И тут еще посмотри: http://rsdn.ru/Forum/Message.aspx?mid=930584&amp;only=1
Автор: LaptevVV
Дата: 03.12.04
Впрочем, не хочу вас слишком обнадеживать: я вовсе не уверен, что все понял правильно. Два смысловых слоя я уловил, но, по-моему, там был еще и третий... (А&Б Стругацкие, "Жук в муравейнике").
Re[6]: 3D to 2D
От: freem Россия  
Дата: 06.12.04 11:54
Оценка: :)
2 AndreyT
Проблему я решил. решил с помошью аффинных преобразований...
Всё работает, ну почти всё...остались детали...додедлаю выложу...

Насчёт того, что ты там чаго-то понял и что не станешь на меня тратить время...
так а чего тратишь, ты пытаешься мне доказать, что я дурак а ты умный ?
и в школе начанал ты с эвклида...ну молодец...
купи себе булку с маком, две булки купи, скушай и успокойся...мне плевать абсолютно.

Я пришол, суда с вопросом, задал как мне кажеться весьма логичено и доступно...
Получил ответы...
Эсли ты чёго-то не понял, можно попросить уточнить вопрос, если тебе это не нада.
Можно просто промолчать, и забить...
но нет...ты начал доказавыть что ты тут голова...и вот все такие мудни...а ты прям один зияешь на нашем фоне.
Может оно и так...но нада как-то быть скромнее...понимаешь...

Короче не так давно услышал такое словосочетание, которое в некоторой мере (как же) достаточно точно
по моему тебя характерезует..."Залуполог дешовый", это вот мнение моё.

Вот собственно всё, если тебе это не интересно, если ты просто хотел показать какой ты ум.
Показал. Мы все узрели и восхитились...Тока вот всё..ладна харош.
Ни что в жизни ни даёться так просто как... хотелось бы...
Re[7]: 3D to 2D
От: AndreyT  
Дата: 06.12.04 16:16
Оценка:
Здравствуйте, freem, Вы писали:

F>но нет...ты начал доказавыть что ты тут голова...и вот все такие мудни...а ты прям один зияешь на нашем фоне.

F>Может оно и так...но нада как-то быть скромнее...понимаешь...


Я критиковал не тебя лично, а твой подход. И даже не совсем твой личный подход, а подход некоего усреднённого студента, когда сдавать — завтра, а сделать надо много.
Ты же в ответ проехался по мне лично. Почувствуй, как говорится, разницу.

Советов я тебе давать никаких не буду, ты ещё не готов их слышать. Хочешь быть "drag'n'drop" программером — на здоровье. В конце концов, ничего страшного в этом нет, милиионы леммингов уже выбрали этот путь.
Удачи.
Re[8]: 3D to 2D
От: frёёm Россия  
Дата: 06.12.04 16:31
Оценка:
2 AndreyT, Вы писали:

AT>Удачи.


Пассиба...
Ни что в жизни ни даёться так просто как... хотелось бы...
Re[3]: 3D to 2D
От: ASGS Россия  
Дата: 07.12.04 06:25
Оценка:
Здравствуйте, freem, Вы писали:

F>Пасибо конечно, я посмотрю по подробнее...

F>но по моему меня не совсем поняли (я бегло просмотрел), там дан пример для реализации под Direct3D.
F>А мне хотелось бы общий агоритм, точнее формулу...
F>Отобразить 3d точку в 2d с учётом либо углов обзора (2ух)
F>либо позицции камеры заданой также 3d точкой.

F>Может кто ещё чаго подскажет ?

F>Просто время не так много осталось и хотелось, а там, мне кажеться не совсем то...

Читаешь (или читаете, как больше нравится) книгу Иванова и Батракова "Программирование трехмерной компьютерной графики".
Там есть формулы для такой задачки. В более общем виде такие преобразования
описываются в фотограмметрии (наука типа такая ). Можно взять учебник,
например Лобанова, но голову погреть здорово придется
Re[4]: 3D to 2D
От: frёёm Россия  
Дата: 08.12.04 15:51
Оценка:
2 ASGS:

ASG>книгу Иванова и Батракова "Программирование трехмерной компьютерной графики".


Посмотрел книгу...интересно, наверно пиобрету =)
Ни что в жизни ни даёться так просто как... хотелось бы...
Re: 3D to 2D
От: frёёm Россия  
Дата: 15.12.04 15:44
Оценка:
Вобщем сделал, господа...если кому могу выслать исходники...
Ни что в жизни ни даёться так просто как... хотелось бы...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.