Я пытаюсь получить ближайшую точку к лучу в pyOpenGl.
def isectSphere(self, p0, p1, radius):
# normalized ray direction
r_dir = np.subtract(p0, p1)
r_dir = r_dir / np.linalg.norm(r_dir)
# nearest point on the ray to the sphere
p0_cpt = np.add(-self.pts[:,:3], p0)
near_pt = np.add(-r_dir * np.dot(p0_cpt, r_dir), p0)
# distance to center point
dist = scipy.spatial.distance.cdist(near_pt, self.pts[:,:3])
print(dist.min())
# intersect if dist less or equal the radius of the sphere
return dist <= radius
self.mouse_near = glu.gluUnProject(*self.mouse_pos, 0, self.mv_mat, self.p_mat, self.v_rect)
self.mouse_far = glu.gluUnProject(*self.mouse_pos, 1, self.mv_mat, self.p_mat, self.v_rect)
self.isectSphere(self.mouse_near, self.mouse_far, 1000)
Но я нахожусь на уровне получения точки матрицы каждой точки. Как я могу получить ближайшую точку луча, заданную двумя точками в мировых координатах p0 и p1?
Я загружаю облако точек в VBO, а затем после щелчка просматриваю массив numpy находит точку на луче, ближайшую к каждой точке, и вычисляет это расстояние. Мне удалось рассчитать его для каждой точки отдельно, но это заняло много времени, и мое приложение получало стек каждый раз, когда пользователь нажимал. Поэтому я переключился на numpy и попробую сделать это на матрицах.
Заранее благодарю за помощь.