Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2011, 01:00   #1
Gelirgwenn
Пользователь
 
Регистрация: 18.04.2011
Сообщений: 14
По умолчанию Координаты в OpenGL Delphi

Добрый день, надеюсь создаю тему в правильном разделе...)
Необходимо определить координаты точки (мировые) после поворота и переноса, имея заданные координаты. Перерыл кучу информации, везде пишут по-разному... Вот собственно вопрос: как достать ту матрицу, на которую нужно умножить вершину, чтобы получить новые кординаты. Я делал так:
glLoadIdentity;
glTranslatef(0, 0, -9.0);
glRotatef(0, 1.0, 0.0, 0.0);
glRotatef(0, 0.0, 1.0, 0.0);
glRotatef(0, 0.0, 0.0, 1.0);
glTranslatef(0, 0, 0);
glPushMatrix;
glTranslatef(0.3,0.3,0.3);
glGetDoublev(GL_MODELVIEW_MATRIX,@V iewMatrix);
glPopMatrix;
затем перемножал видовую матрицу на вершину и рисовал точку:
glVertex3dv (@vertexf);
но точка рисуется в совершенно другом месте (сравнивал с тем когда без перемножения просто переносил систему на координаты вершины и рисовал точку с координатами 0,0,0)
помогите, уже голову сломал...
З.Ы. перемножение идет верно, проверял на калькуляторе, проблема в видовой матрице, беру ее видно как то неправильно)
заранее благодарен!
Gelirgwenn вне форума Ответить с цитированием
Старый 19.04.2011, 01:06   #2
Gelirgwenn
Пользователь
 
Регистрация: 18.04.2011
Сообщений: 14
По умолчанию

вот код программы
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormResize(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    DC: HDC;
  hrc: HGLRC;
    vp: Array [0..3] of GLInt;
    vertex: array [0..3] of gldouble;
    vertexF: array [0..3] of gldouble;
    ViewMatrix: Array [0..3,0..3] of GLDouble;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DC := GetDC (form1.Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
Form1.Resize;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
i,j:glint;
ps : TPaintStruct;
begin
BeginPaint(form1.Handle, ps);
glClearColor (0.5, 0.5, 0.5, 1.0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glTranslatef(0, 0, -9.0);
glRotatef(0, 1.0, 0.0, 0.0);
glRotatef(0, 0.0, 1.0, 0.0);
glRotatef(0, 0.0, 0.0, 1.0);
glTranslatef(0, 0, 0);
glPushAttrib (GL_ALL_ATTRIB_BITS );
vertex[0]:=0.1;
vertex[1]:=0.1;
vertex[2]:=0.1;
vertex[3]:=1;
glPushMatrix;
glTranslatef(0.3,0.3,0.3);
glGetDoublev(GL_MODELVIEW_MATRIX,@ViewMatrix);
glPopMatrix;
for i := 0 to 3 do
begin
Vertexf[i]:=0;
for j := 0 to 3 do
Vertexf[i]:=Vertexf[i]+ViewMatrix[j][i]*Vertex[i];
end;
glPointSize (3);
glColor3f (0, 0, 0);
glEnable (GL_POINT_SMOOTH);
glBegin (GL_POINTS);
glVertex3dv (@vertexf);
glEnd;
glDisable (GL_POINT_SMOOTH);
glPopAttrib;
SwapBuffers(DC);
EndPaint(form1.Handle, ps);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho (-1, 1, -1, 1, 1, 10.0);
glViewport(0, 0, form1.Width, form1.Height);
glMatrixMode(GL_MODELVIEW);
glGetIntegerv(GL_VIEWPORT, @vp);
InvalidateRect(Handle, nil, False);
end;

end.

Последний раз редактировалось Gelirgwenn; 19.04.2011 в 01:14.
Gelirgwenn вне форума Ответить с цитированием
Старый 20.04.2011, 10:09   #3
Gelirgwenn
Пользователь
 
Регистрация: 18.04.2011
Сообщений: 14
По умолчанию

Нашел обшибочку, если кому надо, то вот рабочий вариант процедуры перерисовки экрана:
Код:
var
i,j:glint;
ps : TPaintStruct;
vertex: array [0..3] of gldouble;
vertexf: array [0..3] of gldouble;
ViewMatrix: Array [0..3,0..3] of gldouble;
begin
vertex[0]:=0;
vertex[1]:=0;
vertex[2]:=0;
vertex[3]:=1;
glPushMatrix;
glTranslatef(0.3,0.3,0.3);
glGetDoublev(GL_MODELVIEW_MATRIX,@ViewMatrix);
glPopMatrix;

for i:=0 to 3 do
   begin
   Vertexf[i]:=0;
   for j:=0 to 3 do
       Vertexf[i]:=Vertexf[i]+ViewMatrix[j][i]*Vertex[j];
   end;

BeginPaint(form1.Handle, ps);
glClearColor (0.5, 0.5, 0.5, 1.0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glTranslatef(0, 0, -9.0);
glRotatef(0, 1.0, 0.0, 0.0);
glRotatef(0, 0.0, 1.0, 0.0);
glRotatef(0, 0.0, 0.0, 1.0);
glTranslatef(0, 0, 0);
glPushAttrib (GL_ALL_ATTRIB_BITS );
glPointSize (3);
glColor3f (0.3, 0.3, 0.3);
glEnable (GL_POINT_SMOOTH);
glBegin (GL_POINTS);
glVertex3dv (@vertexf);
glEnd;
glDisable (GL_POINT_SMOOTH);
glPopAttrib;
SwapBuffers(DC);
EndPaint(form1.Handle, ps);
Тема закрыта
Gelirgwenn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Координаты в Delphi echo1337 Помощь студентам 9 06.04.2011 18:22
OpenGL координаты zumm Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 06.07.2010 09:19
Как выставить координаты? Delphi somebody94 Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 27.06.2010 19:06
Координаты точки в Delphi Владимир_король Помощь студентам 1 29.04.2010 11:48
delphi.opengl Fscivi Помощь студентам 0 23.12.2009 17:09