如何在OpenGL中弯曲对象?


11

有没有一种方法可以使用OpenGL弯曲物体,例如圆柱体或平面?

我是OpenGL初学者(我正在使用OpenGL ES 2.0,尽管这很重要,尽管我怀疑数学在这种情况下最重要,所以它在某种程度上与版本无关),我了解基本知识:平移,旋转,矩阵转换等我想知道是否有一种技术可以允许您实际更改对象的几何形状(在这种情况下,通过弯曲它们)?

欢迎任何链接,教程或其他参考!

Answers:


11

要“弯曲”对象,您需要做的是将平移/旋转/缩放的某种适当组合仅应用于所讨论对象的顶点的某些子集-可能会相应地加权该变换。

这样做是一种令人愉悦的方式,将需要使用比描述原始网格所必须严格要用的顶点更多的顶点。例如,一个简单的圆柱体可能只在其两端具有顶点,但是如果您希望该圆柱体在中间弯曲,那么您也将需要在其中顶点。

如果您感兴趣的只是非常简单的形状(例如上述平面)的一次性特定变形,则可以手动进行。例如,确定平面的“弯曲轴”,并为每一行平面顶点计算适当的变换,以根据其与弯曲轴的距离实现绕该弯曲轴的适当旋转,然后将其应用于几何体(可能在CPU,因为它将是最简单的,至少在最初是这样。但是,这种技术无法很好地扩展,并且非常繁琐。

由于正确地计算出如何权衡一组变形中每个顶点的权重以实现所需的变形(特别是对于更实际和更复杂的对象而言)非常麻烦,因此许多游戏都使用一种称为``骨骼动画''的技术。从高层次上讲,这涉及将一组单独的几何体(“骨架”)与您的网格相关联。该几何体表示对象的骨骼,然后(通常在建模工具中)定义实际模型的顶点与骨骼的骨骼之间的映射-哪些骨骼与每个顶点相关联,以及骨骼对变形的影响程度那个顶点。然后直接对骨骼进行动画处理,然后通过骨骼及其顶点之间的关系将动画转移到真实模型中。

通常,在此技术中,骨架和真实网格之间的映射是在资产生产时定义的。然后也可以构建动画,或者可以在运行时按程序构建动画。将动画转换应用于真实网格的过程在运行时发生。通常,在运行时不会生成新的顶点,这意味着在最初创建网格时,其外观变形范围隐式固定在网格中。

从理论上讲,还可以基于对动画中转换的分析,在运行时对网格应用细分和细分,从而生成适当的顶点以创建不一定要计划的动画。我暂时不知道有关此主题的任何论文。

也可以看看:


9

对于翘曲的实际数学运算,这可能会变得非常复杂,为什么不从这里开始呢?

现在,我将讨论如何应用此方法,假设您已经掌握了如何减少变形的数学方法。

2种方式:

1)每帧,访问圆柱模型中的每个顶点,并以某种方式使其偏移。

2)在渲染时使顶点着色器中的顶点偏移。OpenGL ES 2.0支持顶点着色器。因此,从某种程度上来说,您很幸运。

您是否只希望扭曲屏幕上显示的对象,还是要扭曲对象,以便游戏中的每个对象都知道它已经变形了?

如果在顶点着色器中扭曲对象,则仅在显示/栅格化之前发生这种情况,因此这意味着所有游戏对象都不知道变形。如果您只是制作屏幕保护程序,或者变形很小以至于对对象的可碰撞形状没有影响,那么这很好。

顶点着色器中 扭曲几何图形时,模型的原始顶点实际上不会移动,(它们仅显示为移动)。

顶点着色器中的变形

未变形:

不变形

变形的

变形的

这是从cg教程的第6章(程序#14)中获得的。

产生这种变形的着色器代码类似于

// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;

// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;

// move the vertex
float4 newPosition = position + displacement * displacementDirection ;

// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;

因此,您可以看到,这是在显示之前发生的(顶点着色器发生在GPU上),因此CPU代码实际上无法访问转换后的顶点位置(有几种方法可以将数据从GPU发送到CPU(主要是通过纹理),但是不会去那里)。


8

您想要实现的基本上是网格变形主题的一个子集。但是由于您是初学者,所以恐怕此类信息现在可能有点太奇怪了。我将尽力提出一些基本概念。

为此,您需要做两件事:

  1. 您的网格需要具有足够的顶点才能进行变换。例如,如果是平面,则需要确保它实际上是作为一种网格创建的,具有许多顶点供您变形。圆筒也一样。可能可以在运行时通过细分来实现此目的,但是我对该主题知之甚少。
  2. 您需要使用顶点着色器使顶点变形。基本上,顶点着色器负责计算每个顶点的最终变换位置,因此您可以借此机会对它们应用任何变形。

我不确定这将有多大帮助,但是请看一下此OpenGL资源,因为它似乎恰好是您需要的东西:

http://www.ozone3d.net/tutorials/mesh_deformer_p3.php#part_3

该链接的屏幕截图:

在此处输入图片说明

编辑

就像乔什(Josh)的回答一样,我同意,骨骼动画也是封装此问题的一种非常优雅的方法,尤其是当变形开始变得更加复杂且难以用数学表示时。

但是请记住,以上两点仍然适用-您只能使顶点变形,因此很明显,它们首先必须存在,这就是为什么您的网格需要具有相当数量的顶点密度的原因。通常,顶点着色器可驱动骨骼动画并进行顶点融合等。

顺便说一下,您也可以在CPU上执行这些操作,但是如今,通常在GPU上执行这些操作通常是更好的选择,这就是为什么我强调顶点着色器的原因,您应该对其进行研究。无论如何,与在CPU上进行编程相比,从程序上来讲,实际上并没有那么困难。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.