我认为这需要一些背景信息: 我一直在修改Minecraft一段时间,但我一直想制作自己的游戏,所以我开始深入挖掘新发布的LWJGL3来实际完成任务。是的,我知道它有点水平,我应该使用引擎和东西...的确,我已经尝试了一些引擎,它们永远不会完全匹配我想要做的事情,所以我决定我想解决它的根本问题。 到目前为止,我有点理解如何渲染网格,移动“相机”等等,我愿意接受学习曲线。
但问题是,在某些时候所有的教程都开始解释如何加载模型和创建骨架动画等等......但我想我真的不想那样做。使用Minecraft代码的很多东西都很糟糕,但我喜欢如何用Java代码创建模型和动画。当然,它看起来并不现实,但由于我对Blender也不好,我怀疑拥有“经典”模型和动画会有所帮助。无论如何,在那个代码中,我可以旋转一个盒子让一个生物看一个玩家,我可以使用一个窦功能来移动腿和手臂(或者我的情况下的翅膀),这是有效的,因为我的Minecraft使用立即模式而Java可以直接告诉显卡在哪里绘制每个顶点。
所以,实际问题:有没有什么好的方法可以在现代(3.3+)OpenGL中制作动态动画?我的模型基本上是形状(盒子或其他)的层次结构,我希望能够动态旋转它们。但我不确定如何组织。我会存储每个子形状的所有平移/旋转矩阵吗?这会对模型可能具有的子形状数量产生严格限制吗?有没有人尝试过类似的东西?
编辑:为了澄清,我做的事情看起来像这样:
创建模型:https://github.com/TheOnlySilverClaw/Birdmod/blob/master/src/main/java/silverclaw/birds/client/model/ModelOstrich.java 模型在构造函数中创建为一堆框,render和setRotationAngles方法设置比例和旋转。
答案 0 :(得分:1)
您正在寻找的是完全骨骼动画,唯一的区别是您不想为骨骼加载动画但想要动态计算/生成变换。
您基本上拥有骨骼层次结构,并附加了几何体。看起来你想要操纵这个几何图形,所以在将网格/变换发送到GPU(经典方式)之前,你想先从模型或世界空间中计算新的变换开始,然后发送那些新计算的矩阵以标准方式在gpu上绘制几何图形。
正如Sorin所说,为了计算每个变换,您只需迭代您的层次结构并在父骨骼的变换和父变换w.r.t的情况下累积变换。
答案 1 :(得分:1)
您应该按照一个opengl教程来理解基础知识。
让我建议"Learning Modern 3D Graphics Programming",特别是this chapter,你可以移动一个有多个关节的机器人手臂。
我使用jogl here在java中创建了一个端口,但您可以轻松地将其移植到lwjgl上。
答案 2 :(得分:0)
是和否。
您可以拥有形状层次结构并为每个形状存储相对变换。 例如"播放器"可以翻译成100,100,10(玩家在哪里),然后是" head"子组件的附加平移为0,0,5(在z轴上略高一点)。
您可以将它们存储为矩阵(它们可以对平移,旋转和缩放进行编码),并使用glPushMatrix和glPop矩阵将矩阵添加到由openGL维护的堆栈中。
draw()
函数(或者你称之为的任何函数)应该类似于:
glPushMatrix();
glMultMatrix(my_transform); // You can also just have glTranslate, glRotate or anything else.
// Draw my mesh
for (child : children) { child.draw(); }
glPopMatrix();
这为您提供了分层设置,以便对象与其父对象一起移动。或者,您可以在主存储器中有一个堆栈并自己进行乘法(使用库)。我认为openGL堆栈可能有一个限制(依赖于实现),但如果你自己处理它,唯一的限制是你可以使用的ram数量。一旦所有矩阵相乘,渲染就会在相同的时间内完成,也就是说,网格在层次结构中的深度并不重要。
对于实际动画,您需要计算中间变换。例如,对于蹲伏动画,您可能希望在它们之间有几帧,这样相机就不会跳到低位置。你可以在开始和结束位置之间进行基于时间的线性插值,但这只包括简单的动画,你仍然必须自己实现它。
你需要自己实现更复杂的东西(即根据骨骼链接修改网格物体)。