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

Вниз

Как в GLScene сделать рамочку выделения области ? Как в Фотошопе   Найти похожие ветки 

 
Кто---то ©   (2004-11-01 02:15) [0]

или любом другом графическом редакторе. Нажимаешь мышкой на экран, отводишь её в стороу, и получается рамочка. Как такое сделать ? Проблема в том, что рамочка - она не трёхмерная, а плоская. Не должна зависить от освещения в сцене, не должна смещаться, если камеру повернуть, и всё такое. Как можно это сделать ?


 
Колбасьев ©   (2004-11-01 17:35) [1]

Я знаю, что на GUI это FocusRect.

На OpenGL думаю есть несколько способов (по аналогии с D3D). Наиболее простые:
1. Если есть плоский (с двумя координатами на точку) формат полигонов, то все просто, рисуем почти как на холсте.
2. Если нет, то рамку изображаем например двумя полигонами с соответствующей прозрачной текстурой (белый квадрат, и рамка шртиховая) и пытаемся разместить его перед камерой перпендикулярно линии взгляда.

А чтоб свет не влиял, надо временно отключить его.
Но может эти универсальные советы не работают в GLScene, и там надо по другому, спрайтами какиминибудь и т.д. Незнаю, неработал с ней. Я немного уровнем по ниже работаю, на D3D.

Удачи.


 
DeadMeat ©   (2004-11-01 21:44) [2]

Относительно GLScene могу сказать, что можно использовать любой объект, меняющий размер. Тот же TGLPlane или TGLSprite или примитивы любые... А направить его на камеру можно с помощью PointTo.

---
...Death Is Only The Begining...


 
Кто---то ©   (2004-11-02 02:09) [3]


> Колбасьев ©   (01.11.04 17:35) [1]
> Я знаю, что на GUI это FocusRect.
> На OpenGL думаю есть несколько способов (по аналогии с D3D).

Способов много, но ни строчки кода.


> DeadMeat ©   (01.11.04 21:44) [2]
> Относительно GLScene могу сказать, что можно использовать
> любой объект,

А есть хотя бы один работающий пример ? Потому, что если примеров нет, то откуда же ты знаешь, что такое возможно ?


 
Da Stranger   (2004-11-02 11:17) [4]

Получить точку в пространстве, имея X и Y на GlSceneviewer можно с помощью функции GLSceneViewer1юBuffer.PixelRayToWorld().
Так получаешь 4 точки и по ним рисуешь квадратик любым способом (но НЕ TglLines - они глючат. Я пока использую glDirectOpenGL и на нем с помощью gl_begin(gl_lines);  ...Vertex3f(x,y,z) ...  ;gl_end;).

Пример завтра выложу.


 
Колбасьев ©   (2004-11-02 19:24) [5]


> Способов много, но ни строчки кода.


Да, ты прав. Но я обычно и встречаю подобнее указания, а сам код (особенно работающий пример)встречается редко. Приходиться копаться и самому искать по наводкам. Поэтому я написал лишь общие принципы, а дальше ты поискал бы сам, а ведь в GLScene не специалист :-)


 
Колбасьев ©   (2004-11-02 19:25) [6]

Ну вот опечатался. Читать "я ведь в GLScene не специалист :-)".
Иначе смысл исказится и я выйду грубияном :-(. И меня побъют модеры :-(


 
Кто---то ©   (2004-11-03 01:51) [7]


> Da Stranger   (02.11.04 11:17) [4]
> Получить точку в пространстве, имея X и Y на GlSceneviewer
> можно с помощью функции GLSceneViewer1юBuffer.PixelRayToWorld().
> Так получаешь 4 точки и по ним рисуешь квадратик любым способом
> (но НЕ TglLines - они глючат. Я пока использую glDirectOpenGL
> и на нем с помощью gl_begin(gl_lines);  ...Vertex3f(x,y,z)
> ...  ;gl_end;).
>
> Пример завтра выложу.


Спасибо, но ненадо. Уже сделал.


 
DeadMeat ©   (2004-11-03 19:30) [8]

И какже? Просто интересно... Если конечно не секрет.

---
...Death Is Only The Begining...


 
Кто---то ©   (2004-11-04 01:42) [9]


> DeadMeat ©   (03.11.04 19:30) [8]
> И какже? Просто интересно... Если конечно не секрет.


Не секрет. Вот так вроде :

var
 glc : TGLCanvas;
...
glc := TGLCanvas.Create(размер ГЛСценВьюера);
with glc do begin
   // Рисуем четырёхугольник.
 MoveTo(
 LineTo(
 LineTo(
 LineTo(
 LineTo(
end;
glc.Free;

Всё очень просто. Посмотри там в демках пример есть с TGLCanvas.


 
Da Stranger   (2004-11-04 10:24) [10]

Так просто?!! Даже не знал, что такое можно!
Вот мой извращенческий метод:



var
 xx,yy,mx,my:integer;
 dx,dy:integer;
point:array[0..15] of TVector3f;

implementation

{$R *.dfm}

procedure drawline(q,w:TVector3f);
begin
glbegin(gl_lines);
glVertex3f(q[0],q[1],q[2]);
glVertex3f(w[0],w[1],w[2]);
glend;
end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
 Shift: TShiftState; X, Y: Integer);
dx:=x;
dy:=y;
begin
point[0]:=glcamera1.Position.AsAffineVector;
point[1]:=GLSceneViewer1.Buffer.PixelRayToWorld(xx,yy);
point[2]:=GLSceneViewer1.Buffer.PixelRayToWorld(dx,dy);
point[3]:=GLSceneViewer1.Buffer.PixelRayToWorld(xx,dy);
point[4]:=GLSceneViewer1.Buffer.PixelRayToWorld(dx,yy);
end;

procedure TForm1.GLDirectOpenGL1Render(Sender: TObject;
 var rci: TRenderContextInfo);
begin
//lines from camera to points
//will became visible, when you turn the camera
Drawline(point[0],point[1]);
Drawline(point[0],point[2]);
Drawline(point[0],point[3]);
Drawline(point[0],point[4]);

//A square, just like you wanted, man.
Drawline(point[1],point[3]);
Drawline(point[3],point[2]);
Drawline(point[2],point[4]);
Drawline(point[4],point[1]);
end;

procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
xx:=x;
yy:=y;
end;


 
Кто---то ©   (2004-11-05 01:38) [11]


> glbegin(gl_lines);
> glVertex3f(q[0],q[1],q[2]);
> glVertex3f(w[0],w[1],w[2]);
> glend;


А по какой литературе ты изучал чистый OpenGL ? И есть ли она в сети.
Никак по этой теме ничего толкового не могу найти.


 
Поручик ©   (2004-11-05 02:30) [12]

Кто---то ©   (05.11.04 1:38) [11]
А по какой литературе ты изучал чистый OpenGL ? И есть ли она в сети.

Литература и сеть понятия несовместимые.
Если нужны основы, то Краснов подойдет (можно скачать на сайте Анатолия Подгорецкого), а если хочешь серьёзно и круто, то книга Хилла - "OpenGL для профессионалов" самое оно (правда там все на си, но API он и в Африке API).


 
DeadMeat ©   (2004-11-05 12:57) [13]

Кто---то ©   (04.11.04 01:42) [9]
А канвас вместе с другими элементами торомзить не будет?


 
Кто---то ©   (2004-11-06 01:33) [14]


> Поручик ©   (05.11.04 02:30) [12]
> Кто---то ©   (05.11.04 1:38) [11]
> А по какой литературе ты изучал чистый OpenGL ? И есть ли
> она в сети.
> Литература и сеть понятия несовместимые.
> Если нужны основы, то Краснов подойдет (можно скачать на
> сайте Анатолия Подгорецкого),

Старик Подгорецкий, зачем то запихнул книгу по OpenGL в раздел Сети. Но я всё равно нашёл. Спасибо, почитаю.


> DeadMeat ©   (05.11.04 12:57) [13]
> Кто---то ©   (04.11.04 01:42) [9]
> А канвас вместе с другими элементами торомзить не будет?

А какая разница ? Выделяешь же на статичной сцене.


 
Soroka ©   (2004-11-07 10:52) [15]

А_можно_ли_рисуя_прямоугольник_просто_выделять_объекты_которые_попадают_в_этот_прямоугольник_?_Как_это_реализовать_?



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

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

Наверх




Память: 0.51 MB
Время: 0.031 c
1-1106652140
Molchaniv
2005-01-25 14:22
2005.02.06
Ограничения TStringGrid


4-1103030917
Phantomouse
2004-12-14 16:28
2005.02.06
COM+HEX


14-1105998632
Константинов
2005-01-18 00:50
2005.02.06
Звонилки. Как с ними бороться?


14-1105800557
Кирилл
2005-01-15 17:49
2005.02.06
Глюченый шрифт


14-1105761120
Думкин
2005-01-15 06:52
2005.02.06
С Днем Рождения! 15 января