Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何测试pygame屏幕中的2d点是否是PyOpenGL中3d对象的一部分?_Python_Opengl_Pygame_Pyopengl_Opengl Compat - Fatal编程技术网

Python 如何测试pygame屏幕中的2d点是否是PyOpenGL中3d对象的一部分?

Python 如何测试pygame屏幕中的2d点是否是PyOpenGL中3d对象的一部分?,python,opengl,pygame,pyopengl,opengl-compat,Python,Opengl,Pygame,Pyopengl,Opengl Compat,我正在用PyOpenGL制作一个游戏(RPG),我有一个十字线。我想检查3d对象是否在十字线中(或者检测它是否在某个点上),这是一个2d覆盖。我该怎么做 我尝试使用screen.get_at()函数,但它显示一个错误“无法调用OpenGL曲面”。此外,它也不好,因为它只检测颜色,而不检测对象(虽然可以使用颜色确定对象,但如果有多个对象具有相同的颜色怎么办?) 这就是我用来确定距离的方法: for person in persons: if (touched

我正在用PyOpenGL制作一个游戏(RPG),我有一个十字线。我想检查3d对象是否在十字线中(或者检测它是否在某个点上),这是一个2d覆盖。我该怎么做

我尝试使用screen.get_at()函数,但它显示一个错误“无法调用OpenGL曲面”。此外,它也不好,因为它只检测颜色,而不检测对象(虽然可以使用颜色确定对象,但如果有多个对象具有相同的颜色怎么办?)

这就是我用来确定距离的方法:

        for person in persons:
            if (touched(person.pos[0],person.pos[1],person.pos[2],camera_pos[0],camera_pos[1],camera_pos[2])) < 5:
                crosshair_color = (1,0,0)
                if len(attacklist) >= 2:
                    bigger = attacklist[1] > touched(person.pos[0],person.pos[1],person.pos[2],camera_pos[0],camera_pos[1],camera_pos[2])
                    if bigger == True:
                        attacklist = [person,touched(person.pos[0],person.pos[1],person.pos[2],camera_pos[0],camera_pos[1],camera_pos[2])]
                else:
                    attacklist = [person,touched(person.pos[0],person.pos[1],person.pos[2],camera_pos[0],camera_pos[1],camera_pos[2])]
        if attacklist:
            if cam_attack == True:
                attacklist[0].health -= cam_damage
编辑-完整代码-浮点除以0:

导入pygame
从pygame.locals导入*
从OpenGL.GL导入*
从OpenGL.GLU导入*
从OpenGL.GLUT导入*
导入数学、系统、numpy、随机、ctypes
pygame.init()
显示=(1500900)
screen=pygame.display.set_模式(显示,DOUBLEBUF | OPENGL)
glEnable(GL_深度_测试)
glEnable(德国劳埃德大学照明)
glShadeModel(GLU平滑)
glEnable(德国劳埃德船级社颜色材料)
glEnable(GL_混合)
glColorMaterial(GL_前部和后部、GL_环境和_漫反射)
glEnable(Glu LIGHT0)
glLightfv(GL_LIGHT0,GL_环境光[0.5,0.5,0.5,1])
glLightfv(GL_LIGHT0,GL_漫反射,[1.0,1.0,1.0,1])
glMatrixMode(GL_投影)
透视图(45,(显示[0]/显示[1]),0.1,50.0)
glMatrixMode(GLU模型视图)
gluLookAt(0,-8,0,0,0,0,0,0,1)
glTranslatef(0,-8,0)
viewMatrix=glGetFloatv(GL\U模型视图\U矩阵)
glLoadIdentity()
#初始化鼠标移动并使鼠标在屏幕上居中
displayCenter=[screen.get_size()[i]//2用于范围(2)内的i]
mouseMove=[0,0]
pygame.mouse.set_pos(显示中心)
cmddown=False
cam_攻击=错误
凸轮损坏=随机随机随机数(20,30)
击退=错误
人数=1
上下角度=0.0
摄像头位置=(0,0,0)
暂停=错误
运行=真
#xzy=xyz
#函数与类
def倒置EMAT44(垫):
m=[mat[i][j]表示范围(4)中的i,表示范围(4)中的j]
存货=[0]*16
inv[0]=m[5]*m[10]*m[15]-m[5]*m[11]*m[14]-m[9]*m[6]*m[15]+m[9]*m[7]*m[14]+m[13]*m[6]*m[11]-m[13]*m[7]*m[10]
inv[4]=-m[4]*m[10]*m[15]+m[4]*m[11]*m[14]+m[8]*m[6]*m[15]-m[8]*m[7]*m[14]-m[12]*m[6]*m[11]+m[12]*m[7]*m[10]
inv[8]=m[4]*m[9]*m[15]-m[4]*m[11]*m[13]-m[8]*m[5]*m[15]+m[8]*m[7]*m[13]+m[12]*m[5]*m[11]-m[12]*m[7]*m[9]
inv[12]=-m[4]*m[9]*m[14]+m[4]*m[10]*m[13]+m[8]*m[5]*m[14]-m[8]*m[6]*m[13]-m[12]*m[5]*m[10]+m[12]*m[6]*m[9]
inv[1]=-m[1]*m[10]*m[15]+m[1]*m[11]*m[14]+m[9]*m[2]*m[15]-m[9]*m[3]*m[14]-m[13]*m[2]*m[11]+m[13]*m[3]*m[10]
inv[5]=m[0]*m[10]*m[15]-m[0]*m[11]*m[14]-m[8]*m[2]*m[15]+m[8]*m[3]*m[14]+m[12]*m[2]*m[11]-m[12]*m[3]*m[10]
inv[9]=-m[0]*m[9]*m[15]+m[0]*m[11]*m[13]+m[8]*m[1]*m[15]-m[8]*m[3]*m[13]-m[12]*m[1]*m[11]+m[12]*m[3]*m[9]
inv[13]=m[0]*m[9]*m[14]-m[0]*m[10]*m[13]-m[8]*m[1]*m[14]+m[8]*m[2]*m[13]+m[12]*m[1]*m[10]-m[12]*m[2]*m[9]
inv[2]=m[1]*m[6]*m[15]-m[1]*m[7]*m[14]-m[5]*m[2]*m[15]+m[5]*m[3]*m[14]+m[13]*m[2]*m[7]-m[13]*m[3]*m[6]
inv[6]=-m[0]*m[6]*m[15]+m[0]*m[7]*m[14]+m[4]*m[2]*m[15]-m[4]*m[3]*m[14]-m[12]*m[2]*m[7]+m[12]*m[3]*m[6]
inv[10]=m[0]*m[5]*m[15]-m[0]*m[7]*m[13]-m[4]*m[1]*m[15]+m[4]*m[3]*m[13]+m[12]*m[1]*m[7]-m[12]*m[3]*m[5]
inv[14]=-m[0]*m[5]*m[14]+m[0]*m[6]*m[13]+m[4]*m[1]*m[14]-m[4]*m[2]*m[13]-m[12]*m[1]*m[6]+m[12]*m[2]*m[5]
inv[3]=-m[1]*m[6]*m[11]+m[1]*m[7]*m[10]+m[5]*m[11]-m[5]*m[3]*m[10]-m[9]*m[2]*m[7]+m[9]*m[3]*m[6]
inv[7]=m[0]*m[6]*m[11]-m[0]*m[7]*m[10]-m[4]*m[2]*m[11]+m[4]*m[3]*m[10]+m[8]*m[2]*m[7]-m[8]*m[3]*m[6]
inv[11]=-m[0]*m[5]*m[11]+m[0]*m[7]*m[9]+m[4]*m[1]*m[11]-m[4]*m[3]*m[9]-m[8]*m[1]*m[7]+m[8]*m[3]*m[5]
inv[15]=m[0]*m[5]*m[10]-m[0]*m[6]*m[9]-m[4]*m[1]*m[10]+m[4]*m[2]*m[9]+m[8]*m[1]*m[6]-m[8]*m[2]*m[5]
det=m[0]*inv[0]+m[1]*inv[4]+m[2]*inv[8]+m[3]*inv[12]
对于范围(16)中的i:
存货[i]/=det
退货库存
接触def(焦油x、焦油y、焦油z、焦油x1、焦油y1、焦油z1):
centerPt=pygame.math.Vector3(tar_x,tar_y,tar_z)
点2=pygame.math.Vector3(tar_x1,tar_y1,tar_z1)
距离=中心点距离(点2)
返回距离
def随动器(x、y、z、x1、y1、z1、速度):
方向x,方向y=(x1-x,y1-y)
距离=数学形下压(方向x,方向y)
方向x,方向y=(方向x/距离,方向y/距离)
角度=数学角度(数学角度2(方向y,方向x))+90
返回(方向x*速度,方向y*速度,0,角度)
def随机位置(最大距离):
x_值_变化=random.randrange(-max_distance+2,max_distance+2)
y_值_变化=random.randrange(-max_distance+2,max_distance+2)
z_值_变化=0
返回值(x值更改、y值更改、z值更改)
def blit_文本(x、y、字体、文本、r、g、b):
混合=假
如果已启用(GL_混合):
混合=真
GL3F(r、g、b)
glWindowPos2f(x,y)
对于文本中的ch:
glutBitmapCharacter(字体,ctypes.c_int(ord(ch)))
如果不混合:
glDisable(GLU混合)
def减法(v0,v1):
返回[v0[0]-v1[0],v0[1]-v1[1],v0[2]-v1[2]]
def点(v0,v1):
返回v0[0]*v1[0]+v0[1]*v1[1]+v0[2]*v1[2]
def长度(v):
返回math.sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2])
def mults(v,s):
返回[v[0]*s,v[1]*s,v[2]*s]
def添加(v0,v1):
返回[v0[0]+v1[0],v0[1]+v1[1],v0[2]+v1[2]]
def交叉口(v0,v1):
返回[
v0[1]*v1[2]-v1[1]*v0[2],
v0[2]*v1[0]-v1[2]*v0[0],
v0[0]*v1[1]-v1[0]*v0[1]]
def正常化(v):
l=长度(v)
返回[v[0]/l,v[1]/l,v[
def touched(tar_x,tar_y,tar_z,tar_x1,tar_y1,tar_z1):
    centerPt = pygame.math.Vector3(tar_x,tar_y,tar_z)
    point2 = pygame.math.Vector3(tar_x1, tar_y1, tar_z1)
    distance = centerPt.distance_to(point2) 
    return distance
#Apply view matrix
glPopMatrix()
glMultMatrixf(viewMatrix)