我目前正在编写一个实际上充当3D网格“剪切”工具的应用程序。好吧,我现在遇到了一些问题,我对如何解决一无所知,因为这是我的第一个应用程序。
我已经将一个模型从一个目标文件加载到画布上,然后在同一个画布上,我使用鼠标拖动事件绘制线来定义切割点。
让我们说我想把球切成两半,然后在中间划出一条线。如何在线下检测球的顶点。
其次,如果我旋转/平移球,所有顶点信息都会改变吗?
答案 0 :(得分:1)
想想你在现实世界中做了什么:你不能用一条线切球,你必须使用一把刀(一条线没有音量)。要切球,你必须将刀移过球。
所以你要照顾的是一架飞机,而不是一条线。要获得这样的平面,您必须使用一些3D数学。你所拥有的是画布方向和平面的“侧视图”(看起来像一条线)。
所以你要找的飞机垂直于画布。获得这样一个平面的一种简单方法是采用画布方向并创建一个具有相同方向的平面,然后将该平面绕该线旋转90°。
之后,您可以访问模型的所有边缘并确定它们位于飞机的哪一侧。为此,确定平面的哪一侧是边缘的端点。使用交叉产品。如果它们位于同一侧(交叉产品的两个结果将具有相同的符号),则可以忽略该边缘。否则,您需要确定边和平面的交点。创建新边并相应地连接它们。
有关数学的一些背景信息,请参阅this page。但是你应该在你的opengl库中找到一些帮助方法。
如果我旋转/平移球,所有顶点信息都会改变
当然。
答案 1 :(得分:1)
这不会那么容易。
我假设您正在绘制的线引出一个平面然后切割球体。
为此,您必须计算球体和平面的交叉区域。
这不是一项微不足道的任务,我建议使用现有的框架,或者如果你真的想自己这样做,请阅读基本的交叉问题,以了解这类问题。 This paper为各种交叉口测试提供了很好的介绍。
一般来说,边界代表卷,就像你的情况一样,在涉及更高级的操作时很难处理。与在其中钻一个小孔相比,将球体切成两半是很容易的。有时最好使用体积表示,如四面体网格或CSG。
关于第二个问题,您不应旋转或平移球体,旋转并平移相机。