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

Вниз

Вопрос по GLScene   Найти похожие ветки 

 
Jack   (2004-09-19 01:22) [0]

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


 
DeadMeat ©   (2004-09-19 09:33) [1]

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

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


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

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


 
DeadMeat ©   (2004-09-19 22:13) [3]

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

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


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

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


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

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


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

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


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


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


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


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


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

Для камеры 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, то тоже самое. Как быть ?


 
DeadMeat ©   (2004-09-20 19:26) [9]

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

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


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


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

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

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


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

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

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

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


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


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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.042 c
14-1103021793
Alexander Panov
2004-12-14 13:56
2005.01.09
Выборы в Украине. Противостояние. (Продолжение 4)


14-1103388402
alex145
2004-12-18 19:46
2005.01.09
PHP-скрипт без ответа


14-1103282454
TUser
2004-12-17 14:20
2005.01.09
Никому монитор не нужен?


14-1103148356
Sulimxar
2004-12-16 01:05
2005.01.09
Зацените программулину


3-1102542933
Vemer
2004-12-09 00:55
2005.01.09
Работа с External Tables..