Я пытаюсь создать простую 3D-игру и нужно ограничить игрока в пределах игрового мира. Когда игрок поражает стороны света, я хочу, чтобы корабль игрока слегка отскочил.
По сути, я пытаюсь поймать игрока в коробку и не дать ему уйти через боковые стороны ...
Мне удалось определить границы игрового мира как совокупность самолетов с нормалями и расстояниями от начала координат. У игрока сферическая ограничивающая сфера, и благодаря этому сайту http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php мне удалось обнаружить столкновения.
Теперь я не могу понять, что делать при обнаружении столкновения. Лучшее, чем я могу управлять, - это застревание игрока в самолете, прохождение прямо через него или многократный отскок от него с очень высокой скоростью.
Здравый смысл подсказывает мне, что мне нужно рассчитать угол отражения от плоскости, используя его нормаль, и применить его к скорости игрока, однако я думаю, что мне нужно сначала посмотреть, прошел ли игрок плоскость, то есть бит, который я не могу разрабатывать.
distance = speed * time
обычно с дополнительным небольшим расстоянием, чтобы избежать ошибки), а затем обновить его скорость до того, каков будет результат столкновения.F = ма или а = F / м. Рассчитайте точку столкновения между сферой и плоскостью. Обычно это центр сферы - нормальный * радиус. Если вы хотите большей точности, рассчитайте, как далеко сфера проникла в плоскость, и скорректируйте свой расчет. Конечно, это во многом необязательно, если только вы не хотите действительно точной физики. Теперь вычислите относительную скорость по нормали. Для статической плоскости это: Vball Dot N. Затем умножьте VballDotN на -1 и умножьте на массу. В физике на этом этапе вы также умножите это на коэффициент восстановления (коэффициент отскока). Умножьте этот скаляр на N, и вы получите свою силу.
При настройке Vball снова разделите силу на массу, и вы получите окончательное ускорение, так что просто прибавьте это к скорости, и вы получите конечную скорость после столкновения.
Этот метод точен по формулам реакции на столкновение. Если вы хотите еще большей точности, вы должны учитывать трение, которое заставит мяч вращаться, но я не знаю, хотите ли вы этого в своей игре. В этом случае вы рассчитываете тангенциальную силу:
Обязательно рассчитайте Ft, прежде чем применять линейные эффекты, иначе трение не будет точным.
источник
vec3 F = -CollisionNormal * (1.0f+Ball.getRestitution())*vDotN;
?Я бы посоветовал сначала подсчитать расстояние от самолета. а затем при расстоянии <= до радиуса проводят реакцию столкновения.
Затем вы можете изменить это, чтобы вычислить расстояние и, если расстояние меньше этого радиуса (что означает, что объект перекрывается), сместить положение шариков и затем выполнить реакцию столкновения.
источник