2012-10-21 2 views
0

Если бы я смотрел на btRigidBody (например, BulletPhysics) сверху вниз, и я хотел, чтобы движение было таким, чтобы, когда я нажимаю вперед, он всегда будет двигаться в прямом направлении, даже после Я поворачиваю его, как бы применить вперед движение и поворот?Движение вниз по течению

Для направления кажется, что я бы использовал applyCentralForce, но какая сила? Есть ли способ применить вперед направление в качестве силы? Для вращения это было бы просто, как только поворот трансформации?

+0

Как вы знаете, что «вперед» есть? –

+0

Вперед, когда я нажимаю кнопку ввода, я знаю, как это сделать, просто движение, о котором я не уверен. – chadb

+0

Я имел в виду, откуда вы знаете, что * направление * вперед? Объект может вращаться вокруг и так далее, поэтому вы должны быть в состоянии сказать, где «вперед» как-то, да? BulletPhysics, конечно, не знает; он не поддерживает одно направление над другим. –

ответ

0

Необходимо определить, что переслать есть. Обычно у вас есть локальная система координат, в которой ваш объект определен. Например, вы можете определить положительную ось z этой системы координат как вперед. Если вашему двигателю необходимо добавить силы в глобальную систему координат, вам необходимо отслеживать изменения ориентации вашего объекта и применять его к вашему вперед направлении.

Скажем, у вас есть матрица преобразования 4x4, которая преобразует локальные координаты объекта в мировые координаты, возьмите верхнюю левую матрицу вращения 3x3 R и используйте ее для преобразования локального вперед (0, 0, 1). Теперь добавьте несколько (по значению силы) этого направления в качестве новой силы для вашего объекта.

+0

Как я объяснил в комментарии выше, с матрицей основных размеров 3 × 3 направление вперед 13, 23, 33. – chadb

+0

Да, но поскольку i написано, что пользователь должен определить локальное направление вперед. Таким образом, ваше утверждение верно только в том случае, если локальный вперед является положительной осью z. Кроме того, в вашем комментарии неясно, о какой матрице 3x3 вы говорите. Но если вы это знаете, то почему вы задали этот вопрос? –

+0

Я знаю только, что такое передний вектор, а не как он может относиться к тому, как может быть применено вращение. – chadb

1

Ну, как я применил его в моем сверху вниз игровой проект выглядит следующим образом, но есть и, возможно, другие решения:

double force = 1.0; 
double radian = 0; 
double x = 0; 
double y = 0; 
std::map<string, int> keyHeld; 
if (keyHeld["forward"]) 
{ 
    x += sin(radian) * force * deltaTime; 
    y -= cos(radian) * force * deltaTime; 
} 

Это всегда будет двигаться объект под углом, указанным в радианах на сумму, которая согласована между несколькими компьютерами.

+1

Можете ли вы объясните, как это будет работать? Я не совсем уверен, как это будет работать (и я попробовал, и это пока не для меня). – chadb

+0

Ну, это очень простая замена физики, поэтому я не уверен, что это то, что вам нужно. Однако, перемещая x и y на sin и отрицательный cos радиана соответственно, вы перемещаете объект в том направлении, в котором радиан диктует его столкновение. –

0

Off верхней части моей головы, так как я имею дело с подобной проблемой, вы могли бы использовать что-то вроде этого

float matrix[3][3]; 

btVector3 direction(matrix[1][3], matrix[2][3], matrix[3][3]); 

direction.normalize(); 

float proportionalFactor; 

bool smoothMovment; 

if (smoothMovment) 
    body->applyCentralForce(direction * proportionalFactor); // brings smooth acceleration 
else 
    body->applyCentralImpulse(direction * proportionalFactor); // brings instant motion 

/// you can't change instantly change the orientation (aka rotation), but this could get a smooth rotation toward the desired direction 

btVector3 bodyForward(0,0,-1); // it's up to you to devine the initial body forward direction, for instance -Z axis is btVector3(0,0,-1) 

btVector3 axisOfRotation = direction.cross(bodyForward).normalized(); 

float angleOfRotation = acos(direction.dot(bodyForward)); 

float rotationChangeSmoothness; 

body->applyTorqueImpulse(axisOfRotation * angleOfRotation * rotationChangeSmoothness); 
Смежные вопросы