首页 > 解决方案 > Kivy3 单击对象时运行函数

问题描述

我有一个应用程序,其中我有一个分散的渲染器,我需要知道何时有人点击该对象,但由于该对象不在相机正下方,我不知道它的 X 和 Y 坐标,只知道它的 X、Y和 Z. 相机正向下看,我有多个可移动的物体,所以我需要能够在旅途中解决它。

我尝试使用向量和矩阵,但文档不是很好,所以我遇到了很多麻烦。我也尝试过使用数学 -

bPos = obj.pos[0], obj.pos[1],  obj.pos[2]
bPos2 = .obj.pos[0] + 10, obj.pos[1] + 10., obj.pos[2] # I also don't know how to get the exact size so I tried this
cPos = self.camera.pos

pitch = atan((bPos[0] - cPos.x) / (bPos[1] - cPos.y))
yaw = atan((bPos[2] - cPos.z) / (bPos[1] - cPos.y))

x = width() / 2 + (pitch * (width() / self.camera.fov))
y = height() / 2 + (yaw * (height() / self.camera.fov))


pitch2 = atan((bPos2[0] - cPos.x) / (bPos2[1] - cPos.y))
yaw2 = atan((bPos2[2] - cPos.z) / (bPos2[1] - cPos.y))

x2 = width() / 2 + (pitch2 * (width() / self.camera.fov))
y2 = height() / 2 + (yaw2 * (height() / self.camera.fov))



with self.canvas.after: # To draw some points on so I know where it thinks the boundaries are
    Color(rgba=(0, 1, 0, 0.5))
    Rectangle(pos=(x, y), size=(10, 10))

    Color(rgba=(0, 0, 1, 0.5))
    Rectangle(pos=(x2, y2), size=(10, 10))

我所有的对象都是 10 x 10 x 10。(-5 到 5)

完整的项目在 GitHub 上但它很乱而且很大,相关部分在这个文件的底部

标签: python3dkivy

解决方案


我已经设法做到了,我用 Matrix.project() 做到了,我通过 OpenGL 本身而不是 kivy 作为 openGl 解决了这个问题!

m = Matrix()

x, y, z = m.project(obj.pos[0]-5, obj.pos[1]-5, obj.pos[2]-5,
                    camera.model_matrix, camera.projection_matrix,
                    camera.pos.x, camera.pos.y, width, height)

x2, y2, z2 = m.project(obj.pos[0]+5, obj.pos[1]+5, obj.pos[2],
                       camera.model_matrix, camera.projection_matrix,
                       camera.pos.x, camera.pos.y, width, height)

我在浏览 kivy3 相机类时找到了模型和投影矩阵。


推荐阅读