2015-11-20 2 views
0

Я просто немного разбираюсь в обработке, так как я знаю это лучше, чем любой другой язык, и наткнулся на этот сайт Custom 2d physics engine. Все идет нормально. Я нахожусь в точке, где у меня есть 2 прямоугольника, и мне нужно разрешить столкновение. Согласно этому документу я должен использовать код:Попытка создать физический движок в java из документального фильма, который использует C++

void ResolveCollision(Object A, Object B) 
{ 
    // Calculate relative velocity 
    Vec2 rv = B.velocity - A.velocity 

    // Calculate relative velocity in terms of the normal direction 
    float velAlongNormal = DotProduct(rv, normal) 

    // Do not resolve if velocities are separating 
    if(velAlongNormal > 0) 
    return; 

    // Calculate restitution 
    float e = min(A.restitution, B.restitution) 

    // Calculate impulse scalar 
    float j = -(1 + e) * velAlongNormal 
    j /= 1/A.mass + 1/B.mass 

    // Apply impulse 
    Vec2 impulse = j * normal 
    A.velocity -= 1/A.mass * impulse 
    B.velocity += 1/B.mass * impulse 
} 

Это написано в C++, так что я должен был бы портирование на Java. И здесь я зацикливаюсь на двух вещах. 1: Что означает автор с «нормальным»? как я могу получить «нормальный»? вещь 2 - эти 3 строки кода:

Vec2 impulse = j * normal 
    A.velocity -= 1/A.mass * impulse 
    B.velocity += 1/B.mass * impulse 

Он создает вектор, который имеет только 1 номер? j * нормальный? У меня нет четкой картины о том, что именно происходит, что на самом деле не приносит мне пользы.

+0

Если вы не знаете, что такое нормальный вектор, это не вопрос программирования: вы должны сделать некоторые фоновые чтения по математике, моделируемой. http://mathworld.wolfram.com/NormalVector.html –

+0

нормаль определен в другом месте. Поиск объекта или любых «глобальных» – JFPicard

+0

«Пользовательский физический движок физики» -> Вы ссылаетесь на страницу под названием «Как создать собственный 2D-движок физики». –

ответ

0

Возможно, он ссылается на this как "обычный". Таким образом, нормаль - это вектор с двумя элементами, поскольку вы имеете в виду учебник по физике 2D. И j*normal умножит каждый элемент normal со скаляром j.

normal, velocity и impulse - векторы с 2 элементами для координат x, y. Из серии обучающих программ, на которые вы ссылаетесь, вы можете видеть нормальный here ближе к концу.

+0

Спасибо! немного очистил! – user1586195

0

«Нормальный» вектор в точке на границе формы 2D или 3D-вектор, который:

  1. перпендикулярно к границе в этой точке;
  2. имеет длину 1; и
  3. точки наружу вместо внутри формы

нормальный вектор такой же, все по прямой линии (2d) или плоской поверхности (3d), так что вы также будете слышать, как люди говорят о «нормальной» линии или поверхности в этих случаях.

Обычный вектор используется для всех видов важных вычислений в графическом и физическом коде.

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

+0

Хорошо, так это нормально? 'PVector normal = new PVector (- (B.pos.y-A.pos.y), (B.pos.x-A.pos.x));' – user1586195

+0

Простите, это было не совсем правильно. * Если ваши объекты круглые *, а это центральные позиции, то нормаль в точке контакта (B-A)/расстояние (A, B). Может быть, ваш физический движок делает это предположение для простоты. –