在e-on上的某个时候,我保持了Vue产品线的传统。
我可以告诉你,这将需要几天的时间,全职。
除非找到某种库或超级巧妙的方法,否则经典方法是单击时在窗口中获取鼠标的坐标,如果它是相对于视口的相对坐标,则只需将x和y除以宽度和高度即可,获得[0,1]范围内的向量(浮点2d)。减去(0.5,0.5)即可使x和y都进入[-0.5,0.5]范围。
然后,通过简单地将x和y用作射线x和y,从该坐标发出射线,并将z设置为焦距。有时,长宽比会给操作带来麻烦。有点摆弄和试错会帮助您解决问题。
然后,您需要检查与Gizmos元素的交集,既可以是生成的网格,也可以是在Blender或其他DCC中建模的网格,或者是可以相互连接的网格零件...只需将这些网格零件用作ray /三角形相交查询。
或者,如果有,请根据您的Gizmo外观和零件使用ray / cylinder,ray / sphere。
您需要具有相交例程,该例程能够在碰撞的图元上应用转换矩阵。极其重要,因为您的Gizmo会随它所移动的对象一起平移,旋转并以与相机的距离的倒数进行缩放,以便在屏幕上保持固定的投影大小。
然后,您具有交互作用部分,最简单的方法是获取鼠标第一次“向下移动”事件时的点的变化量,以及当前“鼠标移动”位置(以纯2D形式),并将该变化量用作当前轴的移动在世界空间中,乘以k
您凭经验确定的部分。根据您的内部单位,像素与当前缩放比例等。
最后一步只是将Gizmo的矩阵应用于被操纵的对象,以便它跟随它。
我告诉你,这是一个艰苦的实施过程,如果您在空闲时间这样做,则需要超过一周的时间。如果您要完全发现该领域,则需要几个星期。如果您的周末忙于其他活动,则超过一个月:)
我建议您从英特尔下载Embree 2.0来为您执行射线/三角形相交查询,因此您不必担心对其进行编码。或者您可以轻而易举地从Blender复制/粘贴并改编代码...我认为它们已迁移到Apache许可证?在法律上应该是可能的。