python - 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)
解决方案
我已经设法做到了,我用 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 相机类时找到了模型和投影矩阵。
推荐阅读
- c# - C# DHCP 脚本使用大量 cpu
- database - 如何从 MIMIC-II 数据库下载 4000 名患者的数据?
- python - 窗口 10,如何在 Geany 中获取终端选项卡
- java - 是否有一个 Java 函数来查找数组元素在已排序的字符串数组中的位置
- javascript - 每次用户单击下拉列表中的项目时,都会读取它的值并将其放入输入字段中
- rxjs - rxjs timeout:区分时间过期和源错误
- here-api - 我可以将 HERE 地理编码 API 结果存储到数据库中吗?
- flutter - Flutter 错误“从包 dart:async 和包 dart:async-patch 中删除了 8 帧”
- godot - Godot - 切换到不同的运动模式时,我无法摆脱存储的动量
- azure - IOT Central Azure 连接器 - 逻辑应用