Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по GLScene [Delphi, Windows]


Jack ©   (2004-09-19 01:22:00) 

Есть в GLScene такая штука как: GLSceneViewer.Buffer.GetPickedObject(x,y)
она возвращает объект с координатами x,y
Вопрос, как получить объект по координатам x,y,z ?
В документации не нашел, может кто знает, поможите.


Ктото   (2004-09-21 03:02:00) [1]


> Jack   (21.09.04 02:41) [11]
> В "верхнем" коде идет поиск пересечения объекта с нормалью
> от координат экрана.

А как может такого пересечения не быть ?


Jack   (2004-09-21 02:41:00) [2]

В "верхнем" коде идет поиск пересечения объекта с нормалью от координат экрана.
Есть еще варианты, например :
property AbsolutePosition : TVector read GetAbsolutePosition write SetAbsolutePosition;

function PointInObject(const point : TVector) : Boolean; virtual;

но как их использовать ?


Ктото   (2004-09-21 02:01:00) [3]


> DeadMeat ©   (20.09.04 19:26) [9]
> Может GLSceneViewer.Buffer.WorldToScreen(....) ?

Я нашёл ещё :
 PointMake(GLSceneViewer1.Buffer.PixelRayToWorld(X, Y));

А всё-таки пересечение чего с чем мы ищем в приведённом выше коде ?


DeadMeat   (2004-09-20 19:26:00) [4]

Может GLSceneViewer.Buffer.WorldToScreen(....) ?

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


Ктото   (2004-09-20 06:05:00) [5]

Для камеры csPerspective
var
 pick : TGLCustomSceneObject;
 rayStart, rayVector, iPoint, iNormal : TVector;

begin
 pick := (GLSceneViewer1.Buffer.GetPickedObject(X, Y) as TGLCustomSceneObject); // Берём объект.
 if pick <> nil then begin // Если объект нашёлся ...
     SetVector(rayStart, GLCamera1.AbsolutePosition);
     SetVector(rayVector, GLSceneViewer1.Buffer.ScreenToVector(AffineVectorMake(X, Y1, 0))); // Y1 - перевёрнутый Y.
     iPoint1 := rayVector;
     NormalizeVector(rayVector);
     if pick.RayCastIntersect(rayStart, rayVector, @iPoint, @iNormal) then begin // Пытаемся определить пересечения векторов.
// Если кто-нибудь понимаем пересечение чего с чем мы ищем - объясните пожалуйста.
 // Если пересечение нашли, то в iPoint получаем 3D координаты объекта.
end;


Но проблема в том, что эти координаты не всегда находятся. Например, если мы кликаем в FireFX, то мы не найдём пересечения векторов. Если в Terrain, то тоже самое. Как быть ?


Ктото   (2004-09-20 02:51:00) [6]


> Jack   (20.09.04 01:35) [6]
> Мне совершенно не надо чтобы по объекту давили мышью,
> интересует описанная возможность вообще.


procedure TForm1.GLSceneViewer2MouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


В демке используются коондираты курсора мыши X и Y. Можешь задать их другими.


Jack   (2004-09-20 01:35:00) [7]

Мне совершенно не надо чтобы по объекту давили мышью,
интересует описанная возможность вообще.


Ктото   (2004-09-20 01:20:00) [8]

См демку meshhit .
Определение 3D-координат объекта по которому кликнули мышкой зависит от КамераСтайл, что несколько осложняет дело.


Jack   (2004-09-20 00:57:00) [9]

На сцену выведено несколько различных объектов, часть из них
не видна, тоесть закрыта теми которые находятся на переднем плане. Задача состоит в том чтобы установить где какой объект,
тоесть мне надо сканируя по координатам пространства (X,Y,Z)определить где какой объект. GetPickedObject(x,y,z) мне бы очень подошел, но он работает только на координатах экрана.
Другие решения есть ?


DeadMeat   (2004-09-19 22:13:00) [10]

Ты чуть поподробнее объясни чего тебе надо. Для чего и как ты это видишь...
Мож есть другое решение...

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


Jack   (2004-09-19 21:56:00) [11]

Мне как раз нужно выбрать объект, который находится в глубине(Z),
и его на форме не видно, в objmove если спрятать кубик за плоскость координатной сетки, то его уже не выбрать.
Если есть мысли то подскажите ....


DeadMeat   (2004-09-19 09:33:00) [12]

Ты видимо не до конца понял, что это за координаты. Это координаты на экране. Точнее на форме.
Другими словами, они нужны, для выборки объекта из сцены, по координатам мыши (или чегонить другого) (x,y). Соответственно Z там не будет (хотя может в LongHorn и введут)...
Получается, что если есть два объекта на сцене, один впереди другого, то выбран будет ближний объект (в случае, если один полностью перекрывает другой). Если же щелкнуть по дальнему (если он будет хоть чуть-чуть виден), то выбрать можно и его...
А вообще глянь
\GLScene\Demos\movements\objmove

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо