Как получить угол между двумя векторами в pygame? - PullRequest
1 голос
/ 13 июля 2020

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

def rotate_char(khiladi,vector,old_center,angle=False) :
x1, y1 = vector
x2, y2 = khiladi.pos
dx, dy = x2 - x1, y2 - y1

rads = atan2(dx, dy)
degs = degrees(rads)

r_khiladi = pygame.transform.rotate(khiladi.image, degs)

R_k = r_khiladi.get_rect()
R_k.center = old_center
screen.blit(r_khiladi, (R_k))
if angle : return degs 

Я использовал другой метод, который использовал numpy

v1_u = list(khiladi.pos / linalg.norm(khiladi.pos))
v2_u = list(vector / linalg.norm(vector))
v1_u[1] , v2_u[1] = -v1_u[1] , -v2_u[1]
c_angle =  degrees(arccos(clip(dot(v1_u, v2_u), -1.0, 1.0)))

Когда я пытался напечатать углы, они были совершенно неуместны и не соответствовали ' т даже не показал какой-либо модели. Пожалуйста, помогите

1 Ответ

1 голос
/ 13 июля 2020

Я рекомендую использовать pygame.math.Vector2 / angle_to() для вычисления угла между двумя векторами в градусах.

If (x1, y1 ) и (x2, y2) - это 2 вектора, тогда угол между векторами равен:

v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
angle_v1_v2_degree = v1.angle_to(v2)

В общем, произведение точка двух векторов равно косинусу угла между двумя векторами, умноженному на величину (длину) обоих векторов.

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 

Отсюда следует, что точка произведение 2 единичных векторов равно косинус угла между двумя векторами, потому что длина единичный вектор равен 1.

uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )

A dot B

Hence the angle between 2 vectors can be computed by math.acos из dot произведения 2 нормализованных векторов ( normalize () ):

v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
v1u_dot_v2u = v1.normalize().dot(v2.normalize())
angle_v1_v2_radian = math.acos(v1u_dot_v2u)
...