kivy - 获取 GLSL 顶点着色器位置以用于 cpu 事件碰撞器函数
问题描述
我正在使用 python kivy 将带有 opengl 的网格渲染到画布上。我想从片段着色器返回顶点数据,这样我就可以构建一个碰撞器(在进行投影和模型视图转换后用于我的 cpu 事件侦听器)。我可以在 cpu 上复制矩阵乘法(我想这是最简单的方法),但是我必须进行两次相同的计算(不好)。
我能想到的唯一方法(经过一些浏览)是将对象 id 印在我渲染的网格 alpha 通道上(如果我将数据编码保持在 alpha 的值 1 附近,不会有太大影响)。并在 cpu 端创建某种“颜色选择器”来对其进行解码(我猜使用 kivy 并不难)。
任何人都有更好的想法来处理这个问题?还是更好的方法?
解决方案
这里的第一个标准是:您是否需要碰撞来进行拾取或物理模拟?
如果是用于物理:您几乎不需要相同的网格用于渲染和物理碰撞。通常,您对物理形状使用非常粗略的近似,几乎总是凸形或凸形的联合。(碰撞任意凹面网格是任何物理引擎都无法做到的事情,如果他们尝试这样做,性能将会很差。)
如果是为了通过鼠标单击来选择对象:您可以采用两种不同的方式:
- 您在 CPU 上复制几何体,并使用鼠标位置和相机视图创建与此几何体相交的射线,以查看首先击中的内容。
- 渲染场景后,您从深度缓冲区读回单个像素。(鼠标经过的像素。)使用返回的深度值以及相机信息,您可以重建世界中相应的 3D 位置。一旦你有了一个 3D 位置,你就可以查询你的世界,看看哪个物体最接近这个点,你就会得到你的命中。
推荐阅读
- oracle - 这些错误是什么意思,你建议我如何修复它们?
- list - 我怎样才能在 Prolog 上接受输入并用它列出一个列表?
- templates - JSRender:从转换器或自定义标签呈现另一个模板
- jquery - 从DOM中删除元素时,Angularjs删除事件侦听器
- javascript - 如何确保在不重新抛出错误或使用 Promise.reject 的情况下捕获异步函数的错误?
- c++ - 更改变量的值时,使用 int x = 100 有什么区别;与 x = x + 100 相比;
- javascript - 如何制作滚动到顶部的 HTML 后退按钮?
- xcode - Xcode 10 View Controller 场景定位问题
- python-3.x - 根据每个数据点的实际值绘制 3D 点的颜色
- ruby-on-rails - Ruby on Rails - 创建函数以列出用户