![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Задание пути объекту.... (GLScene) [Delphi, Windows]
Colt1978 © (2004-11-01 22:31:00)Привет всем.... подскажите кто может сталкивался... Как заставить объект (к примеру Актёра) двигаться из текущего положения в точку указанную мышкой...
В качестве поверхности перемещения использую Terrain...
Суть в том что не могу я его направить куда надо....
Colt1978 (2004-11-24 06:43:00) [1]
> Da Stranger (23.11.04 16:40) [16]
> Посмотри на это...
нет там ничего...
Colt1978 (2004-11-24 06:43:00) [2]
> Da Stranger (23.11.04 16:40) [16]
> Посмотри на это...
нет там ничего...
Da Stranger (2004-11-23 16:40:00) [3]Посмотри на это...
Актёр движется, но направление не сохраняет. Завтра, может, выложу усовершенствованную версию.
http://xgb.boom.ru/temp/xxx.zip
Colt1978 (2004-11-23 06:26:00) [4]
> Da Stranger (22.11.04 17:56) [14]
а как это выглядит ввиде кода ?
Da Stranger (2004-11-22 17:56:00) [5]
> Видишь ли в том примере путь чётко задан, а тут задаю я
> его сам мышкой. 2-х мерные координаты преобразуются в 3-х
> мерные. Возможно что я просто что-то напутал именно с координатами,
> но понять что я уже не всилах... :-(
Получить 3х мерные координаты из 2- мерных можно функцией Camera.xxx.ScreentoWorld, а потом найти пересечение прямой (Camera.position--- эта точка) с плоскостью XY на высоте этой точки.
Получившаяся точка и будет пунктом назначения.
Звучит сложновато, но проше не умею ;)
Colt1978 (2004-11-22 12:09:00) [6]
> dimodim-modern (22.11.04 10:32) [12]
Конено пашет, но почемуто когда я масштабирую карту то что-то не пашет.... И заметь всё зависит от расположения камеры, Если ты её поднимишь высоко, результат положительный будет а если ты камеру приблизишь к объекту то может случиться косяк...
dimodim-modern (2004-11-22 10:32:00) [7]Прикольно...Пашет
Colt1978 (2004-11-22 06:23:00) [8]
> Домовенок (21.11.04 00:44) [10]
что я только не пробывал... ничего не получается.
Домовенок (2004-11-21 00:44:00) [9]>Colt1978 (18.11.04 21:35) [9]
Дык ты его двигай до конкретной координаты не пока он будет равен ей, а проверяй равен или ушел дальше. Тогда тормози. Если зашел чуть дальше, совсем чуть-чуть, то наверное ничего страшного? А такое бывает иногда.
Colt1978 (2004-11-18 21:35:00) [10]Da Stranger (17.11.04 17:48) [8]
Интересный примет есть в \Demos\behaviours\pathcontrol по плавному передвижению по заданному пути с возможностью изменять скорость.
Пример я помню такой, но у меня совсем не так. Теретически объект перемещается, но бывают лаги и глюки когда объект не останавливается а продолжает свой путь.
Видишь ли в том примере путь чётко задан, а тут задаю я его сам мышкой. 2-х мерные координаты преобразуются в 3-х мерные. Возможно что я просто что-то напутал именно с координатами, но понять что я уже не всилах... :-(
Da Stranger (2004-11-17 17:48:00) [11]Интересный примет есть в \Demos\behaviours\pathcontrol по плавному передвижению по заданному пути с возможностью изменять скорость.
Кстати, кто-нибудь ещё использует glMovement?
Colt1978 (2004-11-17 10:36:00) [12]Забыл добавить что код указанный в процедуре TForm1.GLSceneViewer1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); обрабатывается у меня когда я нажимаю левую кнопку мыши...
Код я просто не вставил...
Colt1978 (2004-11-17 10:16:00) [13]Опять я....
Вот как мне подсказали реализовать:
procedure TForm1.GLCadencerProgress(Sender: TObject; const deltaTime,
newTime: Double);
var
speed, z : Single;
nmp : TPoint;
bufv:tvector;
begin
....
actor.Position.Y:=Terrain.InterpolatedHeight(actor.Position.AsVector)+250;
bufv:=actor.Position.asvector;
bufv[1]:=mpos[1];
actor.PointTo(mpos,vectormake (0,1,0));
if vctordistance (bufv,mpos)>0.1 then actor.Move(deltatime*150);
...
SceneViewer.Invalidate;
end;
procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var rayStart, rayVector, iPoint, iNormal : TVector;
begin
// SetVector(rayStart, GLSphere1.AbsolutePosition);
SetVector(rayStart, Camera.AbsolutePosition);
SetVector(rayVector, SceneViewer.Buffer.ScreenToVector(AffineVectorMake(x, SceneViewer.Height-y, 0)));
NormalizeVector(rayVector);
if Terrain.RayCastIntersect(rayStart, rayVector, @iPoint, @iNormal) then
begin
mpos:=ipoint;
mdir:=vectornormalize (inormal);
// actor.PointTo(mpos,vectormake (0,1,0));
end;
end;
Я что хочу сказать, дело в том, что я использую террайн этот , увеличиваю его в свойстве масштабирования в 16 раз, может в этом проблеммма того, что актёр движется не туда куда мне хочется. Камера у меня управляется с клавиатуры и при помощи мыщи я вращаю камеру. Мож кто поможет разобраться ?
Кто---то (2004-11-05 01:34:00) [14]
> Colt1978 (03.11.04 07:05) [2]
> и с тем и другим....
1.
Для определения куда ткнули мышью используй функцию : GLSceneViewer1.Buffer.ScreenToWorld(x, y);
в x y впиши координаты экрана в которые тыкаешь. В качестве резултьта получишь позишн в ДжиЭльСцене.
2.
PointTo - поворачивает объет лицом к заданной позишн или объекту.
Move(расстояние *deltaTime) - двигает на указанное расстояние. deltaTime берётся из кадансера, нужна, чтобы на разных компьютерах движение было с одинаковой скоростью.
Colt1978 (2004-11-03 15:26:00) [15]Ты прав. Лицом можно поворачивать туда куда надо...
мне немного помогли, кого заинтересует выложу с разрешения автора...
Поидее там ещё доробатывать и доробатывать....
Домовенок (2004-11-03 09:31:00) [16]Где-то в демках к GLScene есть пример работы с тайлами. Вот там можно посмотреть в какой тайл ткнули мышкой, брать его координаты, и отправлять туда героя. В принципе героя не так уж и сложно туда перемещать, придется немного подумать о том, как правильно его лицом в нужное направление развернуть.
Colt1978 (2004-11-03 07:05:00) [17]и с тем и другим....
Кто---то (2004-11-03 01:58:00) [18]Какая разница чем указана точка ?
Проблема с определением места в которое ткнули мышью или с перемещением ?