Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

gluPickMatrix   Найти похожие ветки 

 
Sco ©   (2006-03-01 17:08) [0]

gluPickMatrix - самый больной оператор у меня на сегодня, я понял его как: он должен

устанавливать объём на котором можно выбирать объекты, но у меня он ещё и светопредставление

устраивает, что-то делает с матрицей и я не могу понять ни куда он передвинулся, ни как

повернулся. Вот мой код:

{===============================================================================
Изменение размеров окна
===============================================================================}
procedure TMainF.FormResize(Sender: TObject);
begin
glViewPort (0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(40.0, ClientWidth / ClientHeight, 3.0, 150.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -15.0);

 glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
 glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
 glEnable(GL_TEXTURE_GEN_S);
 glEnable(GL_TEXTURE_GEN_T);

InvalidateRect(Handle, nil, False);
end;

Я так понял что это важная часть проги, она ставит всякие ракурсы и перспективы, виды, но

она далеко не самая быстрая часть и делать её лучше только при изменении размеров окна.

{===============================================================================
  Нажатие на форму
===============================================================================}
procedure TMainF.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
 hit, hits: GLUint;
begin
hits := DoSelect (X,ClientHeight-Y);
//Caption:="Объектов под курсором: "+FloatToStr(hits);
FormResize(self); // !!! !!! !!! Вот об этой строчке главная речь !!!
                     !!! без неё на форме из-за "gluPickMatrix"
                     !!! просто светопредставление !!!
if hits>0 then TChess.SetSelected; // немного кода убрал, там просто
                                   // определяется нужный мне объект
end;

{===============================================================================
  Выбор объекта в точке
===============================================================================}
function TMainF.DoSelect(x : GLint; y : GLint) : GLUInt;
begin
glRenderMode(GL_SELECT); // режим выбора
// режим выбора нужен для работы следующих команд
glInitNames;             // инициализация стека имен
glPushName(0);           // помещение имени в стек имен
glGetIntegerv(GL_VIEWPORT, @vp); // запоминаем текущую матрицу

glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPickMatrix(x,y,0.1,0.1, @vp); // создаём обьём для буфера выбора
gluPerspective(40.0, ClientWidth / ClientHeight, 3.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

glTranslatef(0.0, 0.0, -15.0);
glClear(GL_COLOR_BUFFER_BIT);

select:=true;
 glRotatef (-40, 1.0, 0.0 , 0.0);
 glTranslatef(-cell*(8/2), 14 ,-45.0);
 glRotatef (Angley, 1.0,0.0 , 0.0);
 glRotatef (Anglex, 0.0,0.0 , 1.0);
 Scene.DrawScene; // рисуем сцену
select:=false;

Result:=glRenderMode(GL_Render); // количество выделенных объектов
end;

А вот обычный WMPaint, я не понял что оттуда нужно брать в DoSelect (необиделся бы если бы

ктонидь обьяснил), а что нет и остановился на работающем варианте:

{===============================================================================
  Прорисовка формы
===============================================================================}

procedure TMainF.WMPaint(var Msg: TWMPaint);
var
 ps : TPaintStruct;
begin
 BeginPaint (Handle, ps);
   glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   glPushMatrix; // запоминаем матрицу

   glRotatef (-40, 1.0, 0.0 , 0.0);
   glTranslatef(-cell*(8/2), 14 ,-45.0);
   glRotatef (Angley, 1.0,0.0 , 0.0);
   glRotatef (Anglex, 0.0,0.0 , 1.0);

   Scene.DrawScene; // рисуем сцену

   glPopMatrix; // восстанавливаем матрицу
   SwapBuffers (DC);
 EndPaint (Handle, ps);
 InvalidateRect(Handle, nil, False);
end;

А вот в чём проблема, у меня игра шахматы, и я сделал так чтобы фигуру или клетку можно было

выбрать, но хочу чтобы, если фигура выбрана то при "полёте" мышки над формой у меня

выделялись все клетки над которыми она пролетает. В отличие от Красновских примеров моя

прога более "тупая", так как в FormMouseDown у меня есть строчка "FormResize(self)", которой

нет у Краснова (у него без неё всё прекрасно работает), но бес которой у меня из-за команды

gluPickMatrix на форме творится фиг знает что! Ну а проблема в том, что в FormMouseMove, с

которым мне надо будет работать, каждый раз делать Formresize - ето СИЛЬНО тормозит

программу. В общем помогите люди, что я сделал не так в DoSelect, почему мне приходится

делать FomResize.
Ну надесь я понятно обьяснил... SOS!


 
Sco ©   (2006-03-02 11:02) [1]

Непонятно обьяснил, или никто не знает?
Если никто не знает,то может ктонидь обьяснить схематично что должно быть в процедуре DoSelect? Или как по другому можно выделять объекты?


 
grouzd[E]v ©   (2006-03-02 11:25) [2]


var
select_objects : boolean;

procedure Render;
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glViewPort(0, 0, screen.width, screen.height);
gluPerspective(scr_field_of_view, scr_aspect, scr_near, scr_far);
with camera do
   gluLookAt(eye.x, eye.y, eye.z,
             target.x, target.y, target.z,
             up.x, up.y, up.z);

//тут рендерим объекты,
//если select_objects = true то
//делаем для каждого объекта glLoadName(<его id>);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
InvalidateRect(main.handle, nil, false);
end;

function DoSelect(x : GLint; y : GLint) : GLint;
var
 hits : GLint;
begin
glSelectBuffer(max_select, @selectBuf);
glRenderMode(GL_SELECT);
glInitNames;
glPushName(0);
glGetIntegerv(GL_VIEWPORT, @vp);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPickMatrix(x, screen.height-y, 4, 4, @vp);
glViewPort(0, 0, screen.width, screen.height);
gluPerspective(scr_field_of_view, scr_aspect, scr_near, scr_far);
with camera do
   gluLookAt(eye.x, eye.y, eye.z,
             target.x, target.y, target.z,
             up.x, up.y, up.z);
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
select_objects := true;
Render;
hits := glRenderMode(GL_RENDER);
result := -1;
result := selectbuf[max_select-1];
select_objects := false;
end;

procedure OnClick(x, y : integer);
begin
id := DoSelect(x, y); //получаем id модели, на которую кликнули
end;


этот выбор возвращает только id верхнего, если нужно кол-во - возвращать hits

---
... we are walking on a thin line and you better avoid the risk ...


 
Sco ©   (2006-03-02 13:38) [3]

Странно, а почему у тебя прога не зависает:
"glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glViewPort(0, 0, screen.width, screen.height);
gluPerspective(scr_field_of_view, scr_aspect, scr_near, scr_far);
with camera do
  gluLookAt(eye.x, eye.y, eye.z,
            target.x, target.y, target.z,
            up.x, up.y, up.z);"
мне показалось что они сильно тормозят, и делать их нужно только при resize, а у тебя получается они при каждой прорисовке, при Paint-е ты render грузишь или другой код? У тебя не висит? Вот у меня при етом висит!


 
grouzd[E]v ©   (2006-03-02 19:07) [4]


> [3] Sco ©   (02.03.06 13:38)

гм, такое у меня разбито на 2 процедуры - ViewPerspective и MoveCamera. Иногда вызываю несколько раз за рендер + есть еще ViewOrtho. Работает =)
Есть предположение что тормозят не они, а resize, который ты так часто вызываешь

---
... we are walking on a thin line and you better avoid the risk ...



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
3-1152612237
chizra
2006-07-11 14:03
2006.09.17
Как шифровать данные в базе данных на лету?


15-1156336634
fishka
2006-08-23 16:37
2006.09.17
Проблемы при работе с сетью (папка с DBF открыта для доступа)


3-1152881652
oleg_v
2006-07-14 16:54
2006.09.17
Файл–сервер


1-1154366246
Варяг
2006-07-31 21:17
2006.09.17
Форма без границ и заголовка


8-1135860481
Cr@zy-EyE
2005-12-29 15:48
2006.09.17
Не запускается Direct3d