-
У меня вопрос. С помощью GLScene я начал делать стрелялку (только не подумайте, что я делаю её для продажи или как шедевер с новыми технологиями, нет я делаю её для себя и для друзей). Так как я не умею делать много чего (только 3 месяцев как стал сам разбираться) и анимационные модели, то использую стандартного waste.md2 только рисую разные текстуры. Ну, ближе к вопросу. Мне надо сделать выстрел. Как я понимаю, создаю целиндр, при нажатии на LMB он visible:=true, GetOrCreateDCEDynamic(Pulia1).ApplyAccel(Sila). Это понятно, а вот как сделать чтобы пуля летела именно в том направлении в котором смотрит камера и ещё с разносом...??? Я пытался Position и Up пули присваивать камеры, но у меня что-то не получается. Подскажите, пожалуйста, или может есть какойто другой способ реализовать выстрел и столкновение(расчёт что пуля попала в Actor3 и тд.).
-
Для полёты пуль - обычно юзаются вектора (вектору пули присваивается вектор камеры (положение, направление) + различные преобразования). Для столкновения - Collusion Detection(вроде бы так пишется).
-
// Начальное положение пули это положение камеры:
Pula_Position0 := Camera_Position;
// Так можно найти вектор направления движения пули:
glGetFloatv( GL_MODELVIEW_MATRIX , @m );
Pula_Direction.x := m[0,2]; Pula_Direction.y := m[1,2]; Pula_Direction.z := m[2,2]; // или все с минусом, что-то сейчас не соображу
Полженее пули в зависимости от времени такое:
Pula_Position.x := Pula_Position0.x + Pula_Direction.x * t * v; Pula_Position.y := Pula_Position0.y + Pula_Direction.y * t * v; Pula_Position.z := Pula_Position0.z + Pula_Direction.z * t * v;
// v - это скорость
Ну и т.д. ...
Положение камеры я например раньше находил вот так: ( способ проверенный работает )
function GetCameraPos: TVector3f; var mdP,mdM :array[0..15] of double; mV :array[0..3 ] of integer; x,y,z :double; begin
glGetDoublev( GL_PROJECTION_MATRIX , @mdP ); glGetDoublev( GL_MODELVIEW_MATRIX , @mdM ); glGetIntegerv( GL_VIEWPORT , @mV );
gluUnProject( mV[2]/2 , mV[3]/2 , -1000000 , @mdM , @mdP , @mV , x , y , z );
result.x:=x; result.y:=y; result.z:=z;
end;
|