2016-06-14 22 views
0

我想这需要一些背景资料: 我一直在改装的Minecraft有一段时间了,但我送花儿给人希望让自己的比赛,所以我就开始挖掘到新发布的LWJGL3真正把事情做好。是的,我知道这有点低级,我应该使用引擎和其他东西......实际上,我已经尝试过一些引擎,并且他们从来没有完全匹配我想要做的事情,所以我决定从根本上解决问题。 到目前为止,我了解如何渲染网格,移动“相机”等,我愿意学习曲线。有没有办法在现代OpenGL中“即时”创建简单的动画?

但事实是,在某些时候所有的教程开始解释如何加载模型和创建骨骼动画等等...但我想我真的不希望走那条路。使用Minecraft代码的很多事情都很糟糕,但我喜欢如何从Java代码创建模型和动画。当然,它看起来不太超现实,但由于我对Blender不太好,所以我怀疑“经典”模型和动画会有所帮助。无论如何,在该代码中,我可以旋转一个盒子来让一个生物看一个球员,我可以使用一个窦功能来移动腿部和手臂(或者在我的情况下是双翼),并且这是有效的,因为Minecraft使用了即时模式Java可以直接告诉图形卡在哪里绘制每个顶点。

因此,实际的问题(S):是否有进行动态的动画现代(3.3+)的OpenGL什么好办法?我的模型基本上是一个形状(盒子或其他)的层次结构,我希望能够在飞行中旋转它们。但我不知道如何组织。我会存储每个子形状的所有翻译/旋转矩阵吗?这是否会严重限制模型可能具有的子形状的数量?有没有人尝试过这样的事情?

编辑:为了澄清,我就是这样做看起来是这样的:

创建一个模型:https://github.com/TheOnlySilverClaw/Birdmod/blob/master/src/main/java/silverclaw/birds/client/model/ModelOstrich.java 模型创建为在构造一堆箱子,设置规模和旋转的渲染和setRotationAngles方法。

回答

1

你应该遵循一个opengl教程来了解基础知识。

让我建议"Learning Modern 3D Graphics Programming",特别是this chapter,在那里你移动一个机器人手臂多关节。

enter image description here

我没有使用JOGL here Java中的端口,但是你可以轻松地移植过来LWJGL。

+0

我已经下文[这LWJGL3书(https://www.gitbook.com/book/lwjglgamedev/3d-game-development-with-lwjgl/细节)和一堆OpenGL教程,但这似乎包括我在找什么,谢谢。 – Silverclaw

0

是和否。

你可以有你的形状的层次结构和存储的相对变换每个。 例如,“玩家”必须翻译为100,100,10(玩家所在的位置),然后“头部”子组件将具有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数量。一旦所有矩阵相乘,渲染将在相同的时间内完成,那么对于性能而言,网格在层次结构中有多深并不重要。

对于实际的动画,你需要计算中间转换。例如,对于蹲伏动画,您可能希望在两者之间有几帧,以便相机不会跳到低位。您可以在开始和结束位置之间使用基于时间的线性插值来完成此操作,但这仅涵盖简单的动画,您仍然必须自己实现它。

什么更复杂的(即修改基于骨骼链接目),你需要自己实现。

+0

谢谢你的努力,但我认为你的回答涵盖了“老”推/ popMatrix的操作是我的世界/ LWJGL2.x在做,无论如何,但不提供基于shader的OpenGL? – Silverclaw

+0

是,这些电话已被弃用,但背后的理念仍然 – elect

1

你在找什么是完全骨骼动画,唯一的区别是你不希望加载动画为你的骨头,但要计算/动态生成变换的事实。

你基本上连有骨骼层次,和几何形状。看起来你想要“严格地”操作这个几何体,因此在将网格/变换发送到GPU(经典方式)之前,首先要计算模型或世界空间中的新变换,然后发送那些新近计算的矩阵以标准方式在GPU上绘制几何图形。

由于索林说,计算每个变换你只需要遍历层次结构和积累给父骨骼的变换和当地变换w.r.t父变换。

相关问题