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

Вниз

Вопрос по 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
14-1103272598
Kerk
2004-12-17 11:36
2005.01.09
Свобода слова на форуме.


14-1103510483
Василий Микушев
2004-12-20 05:41
2005.01.09
Ищу программиста!


1-1103844001
Tine
2004-12-24 02:20
2005.01.09
Calendar


4-1100890082
Japp
2004-11-19 21:48
2005.01.09
Как получить информацию о типе открытого Хендла?


4-1101218492
snake1977
2004-11-23 17:01
2005.01.09
Активность кнопки





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