如何在PyOpenGL中检查两个对象之间的距离?

时间:2019-06-17 03:41:24

标签: python-3.x opengl pygame pyopengl

我正在PyOpenGL中制作一个RPG,我想检查相机是否在一定距离内指向对象(由顶点制成)。我该怎么办?

我尝试在对象的顶点上使用range()来检查相机是否在范围内。但这没用。

import pygame
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *

import math,sys

def touched(tar_x,tar_y,tar_z,tar_w,tar_h,tar_d,tar_x1,tar_y1,tar_z1,tar_w1,tar_h1,tar_d1):
    for i in range(tar_x1,tar_x1 + tar_w1):
        for j in range(tar_y1,tar_y1 + tar_h1):
            for k in range(tar_z1,tar_z1 + tar_d1)
                if (tar_x < i < tar_x + tar_w) and (tar_y < j < tar_y + tar_h) and (tar_z < k < tar_z + tar_d):
                    return True
    return False

#[...]

while True:

    #[...]

    if touched(int(person.x),int(person.y),int(person.z),10,5,5,int(camera_pos[0]),int(camera_pos[1]),int(camera_pos[2]),1,1,1): #
        print("yes!") #

1 个答案:

答案 0 :(得分:1)

如果您想知道是否有2个立方体在触摸,则必须检查这些立方体在所有3个维度上是否都“重叠”。

如果您具有范围[ tar_x tar_x + tar_w ]和第二范围[ tar_x1 tar_x1 + tar_w1 ],则可以通过以下方式检查范围是否“重叠”:

intersect = tar_x < tar_x1+tar_w1 and tar_x1 < tar_x+tar_w

对所有3个维度进行此检查:

def touched(tar_x,tar_y,tar_z,tar_w,tar_h,tar_d,tar_x1,tar_y1,tar_z1,tar_w1,tar_h1,tar_d1):

    intersect_x = tar_x < tar_x1+tar_w1 and tar_x1 < tar_x+tar_w
    intersect_y = tar_y < tar_y1+tar_h1 and tar_y1 < tar_y+tar_h
    intersect_z = tar_z < tar_z1+tar_d1 and tar_z1 < tar_z+tar_d
    return intersect_x and intersect_y and intersect_z

如果您想知道某个点是否在长方体内部,则必须测试每个维度,坐标 tar_w1 是否在 [tar_x,tar_x + tar_w]

is_in = tar_x < tar_x1 < tar_x+tar_w

再次检查所有3维尺寸

def isIn(tar_x,tar_y,tar_z,tar_w,tar_h,tar_d,tar_x1,tar_y1,tar_z1):

is_in_x = tar_x < tar_x1 < tar_x+tar_w
is_in_y = tar_y < tar_y1 < tar_y+tar_h
is_in_z = tar_z < tar_z1 < tar_z+tar_d
return is_in_x  and is_in_y and is_in_z 

如果您想知道一个点到另一个点的距离,例如长方体的中心,则可以使用pygame.math.Vector3.distance_to()

centerPt = pygame.math.Vector3(tar_x + tar_w/2, tar_y + tar_h/2, tar_z + tar_d/2)
point2   = pygame.math.Vector3(tar_x1, tar_y1, tar_z1)

distance = centerPt.distance_to(point2)