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

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

преобразование координат


Sacred ©   (2003-07-03 02:21:00) 

Многоуважаемые, я нуждаюсь в помощи.
у меня такая проблема: вообщем мне нужно по клику мышки на сцене создать объект, динамически объект я создать могу, но столкнулся с проблемой - преобразования координат, тое сть мне надо из экранной системы координат перейти в мировую. Я нашел функцию ScreenToWorld,но она как то странно работает, то есть возвращает тип TAffinevector.
Вы не могли бы рассказать и научить как мне получить в чистом виде x,y,z.
это для того чтобы потом указать объекту position.x и position.y.
Заранее благодарен.
PS работая с компонентами GLScene


voland   (2003-07-06 16:18:00) [1]

Kelegorm посмотри ясчик(мыло).


Kelegorm   (2003-07-04 12:41:00) [2]

Но ведь похоже? Там надо подобрать коофиценты масштабности, а ткже разброса, и будет всё круто!


Sacred   (2003-07-04 01:59:00) [3]

Спасибо за ответы...но сделал вот так...получил вектор
vecOfWSC := GLSceneViewer1.Buffer.ScreenToWorld(x,y);

а потом просто
Position.X := vecOfWSC[0]*10;
Position.Y := vecOfWSC[1]*10;
видимо 10 это коэффициент масштабности, потому что без него объект рисуеться уж слишком близко около центра, а с ним рисуется там где кликаю...


Kelegorm   (2003-07-03 07:37:00) [4]

Function ScreenCurPosToWorldPos(X,Y:integer):TPointer;
begin
Result.X := (X - Form1.ClientWidth/2)/(Form1.ClientWidth/2)*WidthScreen;
Result.Y := ((Form1.ClientHeight/2 - Y)/(Form1.ClientHeight/2))*WidthScreen;
end;

Function WorldPosToScreenCurPos(X,Y:Single):TPoint;
begin
Result.X := Round(X*(Form1.ClientWidth/2)/WidthScreen + Form1.ClientWidth/2);
Result.Y := Round(Form1.ClientWidth/2 - Y*(Form1.ClientHeight/2)/WidthScreen);
end;

Думаю, объяснять не надо.

WidthScreen := 8.3.
угол обзора камеры равен Pi/4.
У меня работает.


Asteroid   (2003-07-03 02:31:00) [5]

При обратном преобразовании координат (из экранных в мировые) всегда получается вектор (луч). Все точки этого луча при прямой проекции попали бы в одну экранную точку. Так что тебе надо выбрать одну из точек луча (зная хотя бы удаленность от камеры уже можно ее получить).


Наверх

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