我想知道如何修改3D对象的形状(顶点)并创建一个新的形状,比如让我们改变它的一部分高度或者通过编程来打洞用户的交互就像鼠标移动一样。我把标签WebGl,但我想知道如何在3D世界中实现它的一般想法。
如果您没有得到我所说的内容,请参阅tinkercad。您可以使用它修改3D对象的形状。
我不知道它是如何实现的,所以任何信息都会受到赞赏。
修改
这question与我的相似。但我认为答案不能达到削减形状或类似的东西。
EDIT2:
好的,所以我从下面的AutoDesk doc获得了一个改变形状的想法。要通过移动点或边来更改形状,我需要让用户选择其中一个,然后在用户移动鼠标时更改其坐标。
要cut or clip一个形状,我想我需要拆分或创建三角形,其中交叉点与其他形状发生,以实现tinkerpad具有的相同功能。
答案 0 :(得分:1)
你想要达到的目标需要掌握几种知识。我想你猜对了你的问题的答案可能需要一整本书。因此,我将简单地尝试引导您使用正确的工具和概念。
首先,你必须分开三个不同的东西:
用户交互管理,即:如何转换鼠标光标位置和移动(在2D中)以在3D世界中正确使用它。
顶点属性(位置,法线等)修改,这可能是最容易的部分。
交互式网格结构修改,在这里,我们进入一个域,比两个第一更复杂。
你必须实现所谓的“鼠标拣选”。您必须了解3D投影概念(透视和正交),然后才能将2D鼠标光标位置从屏幕“取消投影”到3D世界。
为此,您可以在此处找到一些信息:Mouse Picking with Ray Casting
一旦实现了这一点,你需要一个强大的算法来快速检测“射线”和网格多边形交集,这样你就可以知道击中了哪个三角形,在什么位置等等。
为此,您需要至少实现以下内容:Möller–Trumbore intersection algorithm
要检测顶点上的光线投射,可以实现Ray-Sphere intercetion测试,假设每个顶点都由半径较小的虚拟边界球体表示。
这部分很简单,正如您已经发现的那样,您只需根据鼠标光标移动来调整顶点参数。
在这里,您必须实现3D引擎中不常用的功能,因为常见的3D引擎主要使用固定结构网格。但是,如果您想轻松编辑网格结构,删除顶点,边,分割多边形等,则需要动态网格数据结构。
为此,它存在DCEL(双连接边缘列表)数据结构。 以下是维基百科概述:Doubly connected edge list
这里有一些数据可以理解这个概念,然后实现它:
DCEL - Notes from the book by de Berg, Van Krevald, Overmars, and Schwarzkpf
The DCEL Data Structure for 3D Graphics by Ryan Holmes
The DCEL data structure: a C++ implementation
要把所有这些放在一起,你需要了解3D变换,矢量如何工作,如何通过逆矩阵变换矢量,坐标等从一个坐标空间传递到另一个坐标空间等。
祝你好运!答案 1 :(得分:0)
我所寻找的是建设性的实体几何 https://en.wikipedia.org/wiki/Constructive_solid_geometry
我还没有找到一个很好的资源来了解它是如何在一个场景背后实现的,但我现在知道在哪里看。