Войти
ПрограммированиеФорумФизика

Рассчитать точку падения снаряда

Страницы: 1 2 Следующая »
#0
17:43, 19 янв. 2015

Всем привет. Кто знает как рассчитать точку падения снаряда. Пушка стоит на рельефном террейне, когда игрок в зоне видимости пушки она начинает стрелять по нему снарядами, тоесть с заданой точки вылетают снаряды с заданой силой под углом к горизонту. Как в момент вылета снаряда узнать дистанцию от точки его падения до места его вылета?


#1
17:50, 19 янв. 2015

Дальность полета тела, брошенного под углом к горизонту: L= V0^2 * sin(2a) / g

#2
17:55, 19 янв. 2015

Femidko
Это без трения.

#3
18:10, 19 янв. 2015

cheburashka
хочешь ли ты учитывать трение о воздух и движение ветра?

#4
20:54, 19 янв. 2015

Трения о воздух и движение ветра это в перспективе, пока хоть бы так реализовать, Femidko пушка на РЕЛЬЕФНОМ террейне, и если я начну рассчитывать формуле, то значение получаться примерные, я пробовал просто.

#5
21:48, 19 янв. 2015

cheburashka
найти точку пересечения отрезка с рельефом можешь?

#6
22:26, 19 янв. 2015

Ну по моему это как то через RatcastHit делаеться, но точно я не знаю как.

#7
22:37, 19 янв. 2015

cheburashka
значит погуглишь)
В общем первое что в голову пришло:
Берешь уравнения движения твоего снаряда, выбираешь шаг времени (чем меньше тем точнее, но вычисляться дольше будет)
И режешь траекторию движения на отрезки, проверяя на пересечения с рельефом, так и найдешь точку падения. Ну а дальше все из уравнений вывести можно.

#8
23:00, 19 янв. 2015

уравнение движения  снаряда? Я спавмлю его из объекта и предаю ему силу. Да, и что означает шаг времени?

#9
23:11, 19 янв. 2015

Вообщем мне скрипт недавно подкинули на С# написанный. Я debugData.Clear(); менял на debug.Log(); BulletSpeed где-то 200 брал. Step это и есть этот шаг времени. Так вот если я менял CalcData() на Update(), то выводились координаты currentPosition каждый кадр, когда оставлял CalcData() ничего не выводилось. Насколько я понимаю оно должно выводить координаты hit.point Одним словом скрипт адекватно так и не заработал, подскажите может что-то дописать нужно, или это я туплю так, что готовое использовать толково не могу.

    void CalcData()
    {
        debugData.Clear();
 
        Vector3 originPosition = transform.position;
        Vector3 speed = transform.forward * BulletSpeed;
        Vector3 prevPosition = originPosition;
 
        debugData.Add(originPosition);
        RaycastHit hit = new RaycastHit();
 
        int itCount = 0;
        while (prevPosition.y > MinY)
        {
            itCount += 1;
            float stepTime = (float)itCount * Step;
            Vector3 currentPosition = originPosition + speed * stepTime + Physics.gravity * stepTime * stepTime / 2f;
            if (Physics.Raycast(prevPosition, currentPosition - prevPosition, out hit, Mathf.Abs((prevPosition - currentPosition).magnitude)))
            {
                debugData.Add(hit.point);
                break;
            }
            else
            {
                debugData.Add(currentPosition);
                prevPosition = currentPosition;
            }
        }
    }

#10
23:11, 19 янв. 2015

cheburashka
вот тут есть много полезных статей на эту тему:

+ Показать
#11
10:46, 20 янв. 2015

Если пушка видит цель (у нас нет корректировщика и не нужно стрелять за гору), то снаряд не пересечется с ландшафтом в 99%. Конечно, при условии, что это обыкновенный ландшафт, и нет аватарских летающих островов или объект не находится в пещере (1%). И то, если речь о снаряде, его траектория  очень приближена к прямой, особенно на концах, поэтому даже пещера не помеха будет.

#12
11:07, 20 янв. 2015

Femidko
> то снаряд не пересечется с ландшафтом в 99%
Артиллеристы могут промазать.

Femidko
> траектория  очень приближена к прямой, особенно на концах
Для небольшой дистанции - прямая наводка. Для цели которая находится далеко от арт позиции - стрельба по навесной траектории а это уже не прямая.

#13
11:24, 20 янв. 2015

> Трения о воздух и движение ветра это в перспективе, пока хоть бы так
> реализовать, Femidko пушка на РЕЛЬЕФНОМ террейне, и если я начну рассчитывать
> формуле, то значение получаться примерные, я пробовал просто.

Не вижу проблемы, если честно. Школьная физика (уж не помню в каком классе уравнение движения проходят)

Пусть:
(x0,y0) - координаты снаряда, м
(dx,dy) - вектор скорости (куда летит снаярд), м
dt - шаг по времени, с
g - ускорение свободного падения, м/с^2

Тогда получить новые координаты через определенный промежуток времени тривиально:
x1 += dx*dt;
y1 += dy*dt + g*dt*dt/2;
dy += g*dt;

После чего находишь (если есть) пересечение отрезка (x0,y0)-(x1,y1) с поверхностью. Если оно есть, то заканчиваешь. В противном случае обновляешь текущие координаты снаряда (x0,y0) и повторяешь расчет координат через определенный промежуток времени.
x0 = x1;
y0 = y1;

з.ы. собственно тот кусок кода, что ты привел, это и делает

#14
11:32, 20 янв. 2015

Задача поставлена не точно. Если
cheburashka
> игрок в зоне видимости пушки

Подразумевает, что игрок в прямой зоне видимости, то пересечения с ландшафтом считать не нужно. Если игрок просто в некоторой зоне от пушки (возможно стрелять за гору) - тогда считаем пересечения с ландшафтом. Во втором варианте можно соптимизировать, и пересечь отрезок от пушки до цели с ландшафтом, если пересечений нет, то делаем вариант 1.

Страницы: 1 2 Следующая »
ПрограммированиеФорумФизика

Тема в архиве.