Войти
OpenGL communityФорумВопросы по программированию

некорректная работа gluUnProject OpenGL

#0
13:35, 10 янв. 2017

Здравствуйте, у меня возник следующий вопрос. Совсем запутанная ситуация. Необходимо найти координаты OpenGL. Я делаю это след образом. Сначала рисую фигуру в центре экрана:
 

procedure Tfrm.OpenGLControl1Paint(Sender: TObject);
begin
 
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity ();
 
  glScaled(2.0, 2.0, 1.0);
 
  glColor3f(0.25, 0.25, 0.25);
  glBegin(GL_POLYGON);
  glVertex2d(0.0, 0.0);
  glVertex2d(1.0, 0.0);
  glVertex2d(1.1, 1.1);
  glVertex2d(0.0, 1.0);
  glEnd();
  glScaled(0.5, 0.5, 1.0);
  OpenGLControl1.SwapBuffers;
 
end;
Далее при нажатии кнопки мыши необходимо получить координаты OpenGL:
procedure Tfrm.OpenGLControl1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var viewport : array [0..3] of GLint;
    mvMatrix, mvProjMatrix :array [0..15] of TGLdouble;
    realY         : Integer;
    wx, wy, wz : PGLdouble;
    OpenGL_Y  : TGLDouble;
    zval : GLfloat;
    i:integer;
    str:string;
begin
  glGetIntegerv(GL_VIEWPORT, @viewport);
  glGetDoublev(GL_MODELVIEW, @mvMatrix);
  glGetDoublev(GL_PROJECTION, @mvProjMatrix);
 
  realY:=viewport[3]- Y;
  glReadPixels(x, realY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @zval);
  gluUnProject(x, realY, zval, @mvMatrix, @mvProjMatrix, @viewport, wx, wy, wz);
 
  OpenGL_Y:=Double(wy);
 
  ShowMessage('OpenGL_Y is:'+FormatFloat(str, OpenGL_Y)+'  MouseY is  '+IntToStr(realY));
 
 
end;

По нажатию клавиши мыши я получаю сообщение с OpenGL координатами и физическими координатами окна. Происходит путаница, я получаю следующие координаты:
OpenGL_Y 7.1227 is MouseY is 583
OpenGL_Y 7.02 is MouseY is 579
OpenGL_Y 7.209 is MouseY is 95
OpenGL_Y 6.795 is MouseY is 405

Возникают два вопроса. Во первых почему щелкая в середину экрана я получаю OpenGL координаты не приближенные к 0, а в районе 7.... И почему они генерируются абсолютно рандомным образом, без какой либо логики. Может кто знает , ПОЖАЛУЙСТА


#1
14:39, 10 янв. 2017

Моих знаний в Делфи маловато, но ты уверен, что строка:
OpenGL_Y:=Double(wy);
действительно приводит указатель на double к просто double?

Плюс если взять уроки от nehe, то http://nehe.gamedev.net/article/using_gluunproject/16013/
попробуй максимально привести твой код к тому, что там.
Или даже попробуй запустить его функцию без изменений.

Хотя у nehe тоже ошибка в delphi коде (Сишный в порядке).
glReadPixels(  X,                  -Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @winZ );
А должно быть
glReadPixels(  X, viewport[4]-Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @winZ );

#2
16:59, 10 янв. 2017

даже я делаю следующим образом:

var d: double;

  d:=Double(wy1^);
  ShowMessage('OpenGL_Y is:'+FormatFloat(str, d));
получаю 0, т.е. адреса с переменными координат создаются, в сами переменные пустые?

OpenGL communityФорумВопросы по программированию

Тема в архиве.