Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1156433689
иван8511
2006-08-24 19:34
2006.09.17
Работа с датой


15-1156369134
ronyn
2006-08-24 01:38
2006.09.17
Почему в орешнике нет аффтарства?


15-1156829879
Slider007
2006-08-29 09:37
2006.09.17
Text Image


15-1156381399
Очень грустный человек
2006-08-24 05:03
2006.09.17
Где Magic Forum?


1-1154095062
Still Swamp
2006-07-28 17:57
2006.09.17
Как бы запретить изменение TComboBox.Text?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский