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