Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

Как в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.043 c
3-1105100023
Lucifer
2005-01-07 15:13
2005.02.06
Создание програмно псевданима DB MSAccess


3-1104850241
Брат
2005-01-04 17:50
2005.02.06
Ошибка в SQL-запросе


4-1103095551
Змей
2004-12-15 10:25
2005.02.06
Create Tform


1-1106331008
Eraser
2005-01-21 21:10
2005.02.06
Вызов функций DLL из формы


3-1105054722
Ghost_
2005-01-07 02:38
2005.02.06
динамический SQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский