havok引擎文档翻译 之 motion

Motion提取/locoMotion

4.1概要

大多数游戏引擎为角色使用碰撞代理(collision proxy)作为简化的表示方法,那么,如何将碰撞代理的运动轨迹(Motion)绑定到相关的动画系统是非常重要的,不然的话就会出现像滑步 之类的瑕疵!

原始的管线中要求动画师在固定点做动画,然后在游戏中动态的根据角色的速度来匹配播放动画,这样的设定要求动画师去除了自然的加速和减速信息,留下一个不真实的原地动画,这是程序员驱动的方式!

另一种方式运行动画师用最自然的方式完全的控制动画的表现,动画播放时的恒速运动没了,动画师设定的运动直接在游戏中控制角色的运动,这种动画师驱动的模型最完整的保留了角色的运动信息。

Havok的动画系统扩展了第二种方式来处理复杂的运动轨迹,这样动画师就可以完全控制角色的复杂运动,并在游戏过程中展示!

4.2什么是motion

We use the term motion to specify the displacement of an animated skeleton (a character) during playback

我们使用motion这个术语来表示角色(骨骼动画)的动画播放时的位移!

During the playback of an animation (a running cycle, or a hand waving animation), the position and orientation of the different bones of a skeleton will be animated. The motion of character is a concept that applies to the animated skeleton as a whole (instead of an animation track, which applies to individual bones), and basically is defined as the displacement of the animated skeleton as interpreted by the application. In other words, it represents how the overall animation of the individual bones affects the animation of the character's reference frame (this reference frame defines where the character is at any given point of time)

在一个动画的播放过程中(一个跑步循环,或者一个握手动作),骨架中各个骨头的位置和方向会不停改变,形成动画。角色的motion指的是把这个骨骼当做一个整体的话,这个整体的位移情况!

Take the example of a simple walk cycle. The original animation (in 3ds Max, for example) would usually start with a character located at position A and would end at position B, a few meters away from the starting position.

拿一个简单的走路动画为例,原始的动画中(例如在3dmax)通常角色的起始点在A点,结束点在B点,A点和B点之间有几米的距离

 

If we loop this 60-frame (1 second) animation, though, what will happen is that the character will move from A to B, then snap back to A, move to B, snap again to A, etc. What we can do, of course, is make sure that once we reach the end of the animation, we then move our character to position B; that is, we add the translation vector B-A each time a full animation cycle is reached.

当我们循环播放这个动画,会看到角色从a走到b,然后被拉回到a,然后再走到b,以此循环,当然我们也可以在走到b的时候,我们将角色拉到b的位置,这样每次动画结束的时候我们做一次拉动角色的位移操作!

By doing this, we are starting to use the concept of motion, although in a very simplistic manner. The translation B-A is effectively the motion of our character after a single animation cycle.

这样,我们就可以使用动画师做的motion的内容了,虽然是很简单的方式,BA的拉动位移对于角色的简单循环动画也是有效的。

The motion of animated character, therefore, is an abstraction of the concept of “how much a character moves” or, alternatively, “how much a character should move”, during the animation. Motion can usually be estimated, as we did in our example, by looking at the animation for the root node of a character, and projecting it to a particular axis or plane.

动画角色的运动,指的是:角色移动了多少,或者说角色应该移动多少.在动画系统里,motion通常是预估的,比如上例中,我们观察角色根节点,并看它在哪条轴或者面上发生了运动!

We then define motion extraction as the process with which we split the animation (track) of the root of a character into a motion (track) and local animation (track).

 

 

我们把motion extration(运动轨迹抽离)定义为 分离角色的根节点的运动(motion和原地运动!

For example, if in the example above we consider the motion of our character to be a constant velocity displacement between points A and B, our motion extraction would look like this:

比如,以上例子中,我们假设角色的motion 是从AB的匀速移动的话,我们的motion extraction(运动轨迹抽离)就是这样的:

 

The root track of our walk animation contains a displacement along the X-axis (in red) from A to B, plus some smaller displacements in the Z (up) axis (in blue), caused by the up/down hip movement.

我们走路动画的根节点运动轨迹包含了在x轴上(红色)从AB的位移,还有在Z轴上小的位移(蓝色),这个位移是走路时屁股的一扭一扭产生的。

 

After motion extraction, we get a motion track (depicted here) that represents the net displacement of the character (in the X-axis). 

One of the most important things that differentiates motion from the rest of animation is the fact that motion accumulates during a looping playback. Notice how, after reaching B, the value of X in the motion track continues to increase, where the animation would however loop again to its values at time A.

Motion extraction(运动轨迹抽离)之后,我们获得了一个运动轨迹(如图)代表了角色在x轴上的静位移。

需要注意的是,区分motion和动画,motion在循环播放过程中是累加的,当到达b之后,motionx值继续增加,动画则是要从a开始重新播放

 

After motion extraction, the root track now only contains the smaller local displacements on the up (Z) axis (rescaled here to make it easier to see).

当motion extraction(动画轨迹抽离)之后,根节点的轨迹就只包含Z周上小的本地位移了

Notice that after motion extraction, our animation will be a “walk in place”, since all displacement in the forward (X) direction has been extracted, leaving only the smaller up-down motion of the pelvis.

注意在motion extration (动画轨迹抽离)之后,我们的动画就成为了“原地走路”,所有在X轴上的位移都已经被抽离,剩下的只有走路时盆骨摇晃导致的上下的小抖动。

4.2.1. Using Multiple Samples  使用多重采样

In our example above, our motion along the X-axis is constant in velocity so we only needed two samples (one at A and one at B) to specify the motion (the motion was a straight line). There are some cases, however, where we may need to represent motion with more accuracy. Imagine this animation: our character walks a few steps, then stops, and then runs for a few steps. If we only look at the motion using start time A and end time B, our motion extraction would be:

 

在上面的例子中,我们在X轴上的速度是恒定的,所以我们只需要两个采样点(AB)来指定我们的motion(直线的motion),还有更复杂的情况,比如:角色先走两步,然后停下了,然后又跑两步,如果我们只采样AB点,那么我们的motion extration 就成这样了:

 

The root track of our walk+stop+run animation contains mainly displacement along the X-axis (in red) from A to B, but this time it is not constant in velocity.

我们的根节点轨迹是走++跑的运动,仍然是从AB,但这一次不是恒速的!

 

If we only sample the motion using the X-axis at points A and B as we did in the previous example, our motion will have again constant velocity over time.

如果我们只采样AB两点,我们还会得到一个恒速运动。

 

After motion extraction, the root track now only contains the difference between the original animation and the extracted motion. Notice there are still big displacements on the forward (X) axis, resulting from the difference between the original animation and our constant velocity motion.

Motion extration 之后,根节点的轨迹只包含

 

 

As we said earlier in this section, one of the uses of motion is that it tells us “where the character is”, trying to disregard small local variations in the animation of particular bones. In the example above, the root node would still have a considerable amount of animation in the X (forward) direction, since a constant velocity forward motion doesn't accurately reflect the movement of our character. This can sometimes be a problem, as we will see in some of our examples later on.

我们之前提到过,motion的作用之一是告诉我们“角色在那个位置”,而忽略指定骨头的小的位移,上例中,根骨骼在x轴上有一个速度变化的运动,而匀速运动无法准备的表示我们角色的于东,这是个问题,我们稍后来讨论这个问题。

If, however, we use multiple samples for the motion (instead of just sampling A and B), we can construct a much better representation for the motion. In particular, if we use as many samples as the animation:

如果,我们对运动使用多重采样,(而不是只采样AB两点),我们就能建造一个更好的运动表现,比如,我们使用尽可能多的采样点:

 

Let’s look again at our walk+stop+run animation.

我们还来看 走++跑的动画

 

We now sample the motion in the X-axis by taking samples every frame. We basically reconstruct the curve for the X component of the root’s translation.

我们这次对x轴上的运动采取每帧都采样,来表示根节点在x轴上的位移。

 

After motion extraction, the X translation component in the root track is now 0. The rest of components (Z, i.e. Up, in particular) only contain local displacements.

Motion extraction 之后,x轴上的偏移为0,只剩下Z轴的上下小幅度摇动。

The motion track now gives us a much more accurate description of “where the character is” at any time during playback.

Motion轨迹现在给了我们一个更准确的描述:“角色在哪里” 让我们在播放动画的时候可以更好的控制角色位置。

4.2.2. Choosing the Motion Components  选择motion component

In the previous examples, we used a single component (X) to describe the motion extracted from the animation. This is because in our example, X was the “forward” direction in our scene, and the animations involved forward motion.

在上述例子中。我们使用单轴(X)来描述动画的motion 提取,这是因为在我们例子中,x是前方,而动画参与了前进运动。

Since the choice of axis is arbitrary, from now on we will be talking about forward/back axis, right/left axis and up/down (or vertical) axis instead of X, Y or Z.

但是轴的选择是随意的,现在我们要讨论前进/后退,左/,/,三轴来代替xyz

Not all animations have forward motion. The motion of a vertical jump, for example, could be described using the up/down axis; the motion of a forward jump may be described by using both the forward/back axis and the up/down axis. Finally, some animations, like a hand waving animation, may not have motion at all.

不是所有的动画都有前进motion,比如,垂直跳跃,是在上/下轴产生的,前方跳跃,同时产生在前进/后退轴,和上/下轴,最后,有些动,比如握手,就没有任何的motion信息

Also, apart from translations on particular axis, there is also a turning motion that we may want to extract from an animation. We define this turning motion (or yaw motion) as a rotation around the vertical (up/down) axis.

同样,除了特定轴的移动,还有turning motion,我们也可以从动画中提取,我们定义turning motion为围着上/下轴的旋转!

So, in total, we have 4 motion components:

Translation on the forward/back direction.

Translation on the right/left direction.

Translation on the up/down direction.

Turning (rotation) around the vertical axis.

至此,我们有4motion类型:

前后移动

左右移动

上下移动

绕上下轴旋转

The choice of which motion components should be extracted from the root animation is application-specific. However, most game applications have similar requirements, and therefore would follow these rules:

那些motion类型应该从动画冲提取除了是程序指定的,无论如何,大多数游戏有着同样的需求,他们遵循如下规则:

If an animation is meant to loop seamlessly, you want to extract motion of those components where the initial and final poses differ (so the initial and final poses match).

如果一个动画被设计为无缝循环的,你需要提取起始和结束姿势的不同的部分!

Even if a component loops seamlessly, the application may be interested in keeping track of motion for particular components during the animation cycle. In those cases, you want to extract the motion on those components using multiple samples.

如果一个动画师无缝循环的,如果动画轨迹会影响游戏的,你也需要提取这些信息。

例子1.

我们有一个跳跃的动画:

 

If we want this animation to loop seamlessly, we need to extract the motion in the forward direction, since the character ends up at some distance along the forward axis; otherwise the animation will snap back to the original position during playback.

如果我们想要动画可以无缝循环,我们需要提取前/后方向的的motion信息,不然角色会在动画部分完之后回到原点!

Extracting motion along the vertical axis is not required for seamlessly looping, since the animation finishes with the character at the same height as the initial pose. However, in many situations we may want to extract the vertical motion from animations like this one. Imagine this situation:

/下方向的信息则不需要提取,如果是为了无缝播放动画的话,因为起始点的角色有根节点在同样的高度,但是有时候我们需要到处纵轴的motion信息,考虑下面的情况:

We are using the animation to drive a character in a game. For collision detection, we are representing the character with a capsule, and we move this capsule representing the character according to the motion extracted from the character.

我们在游戏中使用动画驱动角色,为了碰撞测试,我们使用一个胶囊来代表角色,当我们移动胶囊的时候,

 

 

While with animations like walk or run cycles, considering only forward motion suits our needs, jump cycles are normally different. Consider the time when the animation has the character in the air:

考虑角色在空中的情况:

 

Since our capsule representation follows the motion of the character, and we only extracted this motion along the forward axis, our game assumes the character is still at the same height (on the ground).

我们的胶囊随着角色运动,由于我们只提取了x轴的motion,我们游戏认为我们的角色始终在同一个高度(在地上)

Imagine now that there is an obstacle on the way of the character (and that’s why the player decided to jump, which triggered the jump animation). Since our capsule representation (which we use for collision detection) doesn't follow vertical movements of the character, the capsule will collide with the obstacle, a collision will be reported and the player will be stopped.

假设角色的路上有个障碍物,我们的碰撞胶囊并没有产生和角色同样的纵轴运动,胶囊将被障碍物挡住,角色无法前进:

 

If, however, we allow vertical motion to be also extracted (and use multiple samples, otherwise the information about the jump is lost), we can use that motion to drive our capsule and therefore we don’t get this false collision:

如果,我们也导出上/下轴向的运动,我们可以使用motion驱动胶囊,这样我们就不会有碰撞,

 

Example 2

Imagine we have an animation for a character turning around a corner:

Figure 3.10. A Character's Turning Animation

 

 

In this case, we want to extract motion in both the forward/back axis and the right/left axis. We don’t need to extract up and down motion.

We need to use multiple samples in order to properly reproduce the motion curve of the character; if we use only two samples we would assume the motion is in a straight line (from the start to the end point) and therefore, if running an application like the previous example, our character representation (capsule) would report collisions with the blue obstacle in the picture.

Notice that for this animation we also want to extract turning (yaw) motion from the animation since the character actually turns 90 degrees from the start to the end (the animation finishes with the character facing a different direction); by doing this the end and start pose will match (and therefore loop seamlessly).

 

 

 

 

 

 

 

posted @ 2013-09-10 21:25  鱼写代码  阅读(560)  评论(0编辑  收藏  举报