Я пытаюсь создать игру, в которой пули могут летать в любом направлении. Я хотел бы сделать их векторами с направлением и величиной, чтобы заставить их идти в направлении. Я просто не знаю, как это реализовать?Помощь по векторам
Благодаря
Я пытаюсь создать игру, в которой пули могут летать в любом направлении. Я хотел бы сделать их векторами с направлением и величиной, чтобы заставить их идти в направлении. Я просто не знаю, как это реализовать?Помощь по векторам
Благодаря
Есть две части, которые должны быть рассчитаны. Во-первых, я бы начал с общей дистанции. Это должно быть просто:
total_distance = velocity * time
Предполагая, что это 2D игра, то вы должны использовать синусоидальной & косинус нарушить общее расстояние до в X и компоненты Y (для заданного угла):
distance_y = total_distance * sin(2 * pi * angle/360)
distance_x = total_distance * cos(2 * pi * angle/360)
Наконец, расстояние х/у, должна быть смещена на основе начальной позиции пули:
pos_x = distance_x + start_pos_x
pos_y = distance_y + start_pos_y
конечно, вы можете обернуть все это в хорошем классе, расширение & полировка при необходимости.
Решив мою проблему, спасибо – jmasterx
Это работает, но не лучшее решение. Также не учитывалась величина или направление. Имо оригинальный плакат нуждается в изучении некоторой векторной математики. – Craig
Мои примерные уравнения действительно включают в себя как величину (скорость), так и направление (угол). Кроме того, из его комментариев он испытывал трудности с разбивкой вектора на свои компоненты X/Y, поэтому я попытался дать простой пример того, как это сделать. –
Вы могли бы иметь класс пуля, которая содержит положение, направление вектора, и скорость. Каждый раз вы можете обновить положение пули следующим образом:
position += direction * veclocity;
Это предполагает, что направление было единичным вектором.
Я хотел бы создать начало что-то вроде этого:
struct Vector3f {
float x, y, z;
};
struct Bullet {
Vector3f position;
Vector3f velocity;
};
inline const Vector3f& Vector3f::operator+=(const Vector &other)
{
x += other.x;
y += other.y;
z += other.z;
return *this;
}
inline const Vector3f& Vector3f::operator*=(float v)
{
x *= v;
y *= v;
z *= v;
return *this;
}
Вы можете обновить позицию пули с bullet.position += velocity
(сложением векторов осуществляется путем добавления компонентов по отдельности). Обратите внимание, что вектор скорости содержит как направление, так и скорость (= значение вектора).
И если ваша пуля должна замедляться в каждом кадре, вы можете сделать что-то вроде bullet.velocity *= 0.98
(где 0,98 представляет фракцию). Вектор умножение на скаляр производится путем умножения каждого компонента со скаляром ...
С уважением, Кристофа
Спасибо! DirectX все имеет смысл сейчас! Я просто не уверен, как сделать угол, скажем, если я хочу, чтобы он путешествовал с 50 градусами – jmasterx
Vector3f (0, 1, 0) означал бы, что вы путешествуете прямо вверх (при условии, что ось y указывает вверх) и Vector (1, 0, 0) может означать, что вы путешествуете влево. Если вы хотите путешествовать со скоростью 50 °, вы можете написать Vector (cos (50), sin (50), 0). – tux21b
это любое использование?
http://www.cs.cmu.edu/~ajw/doc/svl.html
Google является прекрасным инструментом
Я думаю, что для чего-то такого же простого, как векторная и матричная математика, было бы полезно, если бы на самом деле научился делать математику. Если он хочет попасть в игры, ему нужно будет знать уравнения и их цель решать проблемы дальше по дорожке. Например, зная, как работают точечный продукт и кросс-продукты для решения S.A.T – Craig
Вы хотите создать произвольные направления и векторы? – 2010-02-12 01:56:11
Я хочу передать угол и величину в качестве параметров, по сути, пули, которые могут двигаться в любом направлении – jmasterx
, если это пуля, вы не хотите величины. Вам нужна его позиция, направление, скорость и шаг времени (время с момента последнего обновления) – Craig