rayPlaneIntersection (например), пример или аналогичная функция - PullRequest
1 голос
/ 06 января 2020

Я работаю с ботами в Call Of Duty, и их видение вычисляется с помощью функции bulletTracePassed, другого способа вычислить это не существует, поскольку в действительности нет функций бота, поэтому будет возвращено значение true, если пуля может пройти из точки A в точку B возвращает true / false, что работает в большинстве случаев БОЛЬШИНСТВО, но в большинстве случаев вызывает хаос в тех двух случаях:

  1. Когда картограф не включил никакой вид iDFLAGS_PENETRATION в стены (означает, что стена не имеет сопротивления пулям, поэтому нет контакта / удара, и пули проходят сквозь нее, как будто ничего не было.
  2. Когда у нас есть Деревья, Растения и т. д. c в середине

В этих 2 случаях боты увидят других игроков, когда не будут, а в джунглях, как карты, это полный адский ход.

Хорошо, правильный путь сделать эти исправления, просто исправить карты, добавив правильное проникновение в эти стены и густую растительность, но это невозможно сделать, потому что НЕСКОЛЬКО карт от НЕСКОЛЬКИХ мододеров, и даже официальные выпуски с такими же проблемами, и, конечно, у нас нет источников, чтобы применить эти исправления.

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

У меня есть положение глаза атакующего бота в 3D, например (x, y, z) для примера (1000, 500, 22), а также позиция, которая поражает других игроков, например, (2000,1200,60), который возвращается функцией bulletTracePassed.

Но для примера, в стене у меня есть ее часть без каких-либо столкновений, поэтому боты могут видеть сквозь них, поэтому хотелось бы установите середину стены с позицией (1600, 800, 50) и углами (10, -40, -90) и квадратным радиусом от размера до квадрата / плоскости, например, 500.

Итак, я хочу проверить, прошел ли луч через этот квадрат / плоскость, затем вернул false / true, чтобы позволить мне использовать его, чтобы боты решили пристрелить или нет этого игрока за «плохой» стеной.

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

rayPlaneIntersectionrayPlaneIntersection(ray0: vec3, ray1: vec3, origin?: vec3 | number[], normal?: vec3 | number[]): vec3 | undefined

Defined in raymath.ts:130

Computes the intersection point of a given ray and a given plane (rooted at [ 0, 0, 0 ]). t = -(dot(plane.xyz, origin) + plane.w) / dot(plane.xyz, ray); The ray intersects when (t > 0.0) && (t < tm) is true.

Parameters

ray0: vec3 Start point of a ray.
ray1: vec3Far point of a ray, used to derive the ray direction.
Default value origin: vec3 | number[] = [0.0, 0.0, 0.0]
Point on a plane with origin [ 0, 0, 0 ].
Default value normal: vec3 | number[] = [0.0, 1.0, 0.0]
Normal of the plane with origin [ 0, 0, 0 ].
Returns vec3 | undefined
If ray intersects, the intersection point on the plane if the plane was hit.

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

большое спасибо.

...