![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GLScene!!!
scout © (2003-03-17 22:23:00)
Народ помогите!!! Как можно в GLScene реализовать стрельбу? Моя оснавная запара в том что я не знаю каким образом задать моему снаряду движение. Снаряд должен литеть туда куда в момент выстрела был направлен курсор . У меня 3D стрелялка.
scout (2003-03-29 19:14:00) [1]
Ну я всё опробовал всё пошло и глюков каторые ты называл пока я не заметил, ТОЛЬКО: при работе Timer в GLScene после каждого срабатывания оного сцена как бы подвисает, а таймера работает достаточно часто. Также при установки таймира близком к 20 сцена вообще виснет, но действия все происходят, тоесть пуля летит!!!
Alek Aaz (2003-03-29 15:27:00) [2]
2scoutТо есть? Что такое идеальный способ? Вопросы 2-4 нужно решить. Принцип я знаю, но в коде это обкатать пока некогда...
scout (2003-03-28 17:53:00) [3]
Тоесть идеального(или почти идеального) способа нет?
Alek Aaz (2003-03-25 16:13:00) [4]
Господа, кончайте базар!
Если не знаете, то так и отвечайте - не знаем. По поводу математического образования - знаний по складываню векторов вполне хватит и из школьного курса геометрии. Проблема в другом. Поясню.
В GLScene у объекта направление объекта задается двумя векторами Direction и Up. Оба вектора состоят из трех составляющих x,y,z и представляют собой единичный вектор (уверен, все присутствующие здесь что это такое:) Direction-вектор указывающий направление объекта относительно системы координат объекта - родителя. Up - вектор указывающий положение объекта относительно своей системы координат. При вызове процедуры Move(...) объект движется по направлению вектора Direction. Следовательно нашей пуле достаточно передать направление Direction Acter"a. Здесь важно отметить, что пуля не должна быть потомком Actor"a, а быть порождением Scene Root.
В итоге получаем:
procedure TForm1.FireClick(Sender: TObject);
begin
AsyncTimer1.Enabled:=True;
FireTest:=True;
Bull.Visible:=True;
Bull.Position.DirectVector:=Actor1.Position.DirectVector;
Bull.Direction.DirectVector:=Actor1.Direction.DirectVector;
Bull.Up.DirectVector:=Actor1.Up.DirectVector;
end;
procedure TForm1.AsyncTimer1Timer(Sender: TObject);
begin
Bull.Move(HK_MP5_Speed);
end;
Теперь грабли :)
1. Как видите все-таки пришлось передавать вектор Up. Если этого не сделать,то GLScene неверно изобразит пулю при некоторых параметрах введенного Direction и своего Up.
2. Вообще в идеале - актер бежит, а лепит его оружие. Могут появиться такие случаи когда актер бежит в одну сторону, а стреляет в другую. Как это сделать не спрашивайте! По идее будет два Direction"a - направление актера+направление ствола относительно актера. Их как-то на будет складывать. В GLScene есть куча всяких процедур, но какая что делает не понятно.
3. Начальная позиция пули - :) Нужно будет вычислять. Position актера+Position ствола относительно актера+смещение ствола. Как - не знаю.
4. Как создавать пули в runtime - тоже не знаю.
Напоследок:
Установить объект в точку
Bull.Position.SetPoint(0,0,0);
Задать направление
Test2.Direction.SetVector(0,0,1);
neuro (2003-03-25 00:29:00) [5]
2Ramelstinsknin: вот я соббсно чисто математическое образование и получаю =).
Rampelstinskin (2003-03-24 21:37:00) [6]
Я вобще о том с чем тут народ плюхается... Этому в первом саместе учат... Короче хочешь быть программистом иди в институт. Причем на математику ибо преподы программированию всеравно не научат. Тк как можно научить тому что не знаешь?
neuro (2003-03-24 21:19:00) [7]
2Rampelstinskin: ну здесь вообще-то высшей математики нету вообще..А где конкретно мы облажались?
Rampelstinskin (2003-03-24 21:18:00) [8]
2neuro Какая физика? Я про азы высшей математики без них в игроделанье вобще делать нечего.
neuro (2003-03-24 21:13:00) [9]
2Rampelstinskin: ну во-первых не во всех универах преподают физику.а во-вторых как спрашивают так и отвечаем =)
Rampelstinskin (2003-03-24 21:02:00) [10]
Я вот читаю и дамаю: Народ может вам институт закончить... Хотябы первый курс.
neuro (2003-03-24 20:40:00) [11]
пусть у тебя персонаж стоит в точке (x,y,z), а пушка у него под углом alpha к горизонту и под углом beta к нулевому меридиану =), простейшая геометрическая задача -- найти луч =).
Snap (2003-03-24 20:01:00) [12]
Дак это зависит от положения пушки
scout (2003-03-24 19:51:00) [13]
А где мне взять значение v0 во время выстрела? (в этом вся запара)
neuro (2003-03-23 00:17:00) [14]2Scout:
В смысле, как узнать компоненты вектора?? Дык:
v = speed*v0;
где speed = скорость пули (скаляр)
( во время выстрела)2Scout:
В смысле, как узнать компоненты вектора?? Дык:
v = speed*v0;
где speed = скорость пули (скаляр)
v0 = единичный вектор, указывающий куда сейчас курсор смотрит (во время выстрела);
Nuke (2003-03-22 22:53:00) [15]
-=scout=-
старая запара !
Просто !
scout (2003-03-22 21:51:00) [16]
Вы не поняли... Как мне задать вектор по которому будет лететь пуля после выстрела!!!
neuro (2003-03-22 21:50:00) [17]
2Nuke:
Очень просто..У тебя итератор бегает по еще летящим пулям, к-е реализованы как классы с методом bool flying(), которая возвращает true если пуля еще активна =)
Nuke (2003-03-22 21:46:00) [18]
if (пуля.еще_летит == true)
пуля.координаты += пуля.вектор_скорости;
И как это понять ?
neuro (2003-03-22 20:34:00) [19]
По-любому тебе нужно с вектором скорости заморачиваться. Вариант Nuke не пройдет как минимум потому, что у тебя персонаж может смотреть в призвольную сторону и не обязательно строго в направлении оси аппликат. Хотя можно вместе с персонажем (конкретнее с его глазами) вертеть и систему координат, но это извращение.
Лучше все-таки юзать скорость.Тогда все проще.Пусть у тебя есть класс пуль =), в котором содержаться указатели на все пули на карте, которые в данный момент находяться в процессе полета, тогда:
if (пуля.еще_летит == true)
пуля.координаты += пуля.вектор_скорости;
scout (2003-03-20 22:13:00) [20]
Нудак он типа от первого лица, но как мне всётаки всё енто сделать я так и не понял !!!