Форум: "Media";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Media";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c