青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

Working with Morphing Animation(1)

Morphing in Action

Back in the early 90s, a revolutionary computer−graphics animation technique known as morphing hit the big league and was brought into the mainstream, thanks to a man known as Michael Jackson. No, I'm not referring to one of his plastic surgery fiascos−rather, the use of morphing in one of his music videos. Yep, the King of Pop used morphing techniques in his video for the song "Black or White" and created an animation phenomenon that continues to this day.

In case you haven't seen the video, let me explain. It includes a segment in which a person is grooving to the tune, and the camera is centered on that person's face. Every few seconds, the person's face morphs into another person's face. This continues while the face morphs more than 10 times. The results of the morphing in the video are incredible, and I still remember them clearly to this day!

As the years rolled by, morphing eventually made its way to gaming. Whereas the older days of morphing involved digitally editing video footage to smoothly change one image into another (such as in "Black or White" ), nowadays morphing (or at least the morphing we're going to discuss here) involves the smooth change of 3D meshes over time.

Probably the most popular example of morphing in gaming has got to be with id's Quake. In Quake, all of the characters' animation sequences are constructed from a series of morphing meshes. One mesh slowly changes shape to a second mesh, the second mesh changes shape to match a third mesh, and so on.

Spaced over a short period of time and using enough meshes from which to morph, all animation sequences are smooth and extremely easy to process. Even the lowliest of computer systems can run Quake decently. That's because morphing animation is extremely easy to work with, as you'll see in the next few chapters.

So as you can surmise, morphing−or tweening, as it is sometimes referred to (such as in the DirectX SDK)−is the process of changing one shape into another over time. For you, those shapes are meshes. The process of morphing a mesh involves slowly changing the coordinates of the mesh vertices, starting at one mesh's shape and progressing to another.

The mesh that contains the orientation of the vertices at the beginning of the morphing cycle is called the source mesh. The second mesh, which contains the orientation of the vertices at the end of the morphing cycle, is called the target mesh. Take a closer look at these two meshes to better understand the whole morphing process.

 

Defining Source and Target Meshes

The source and target meshes you'll deal with are everyday ID3DXMesh objects. However, you can't use just any two meshes for a morphing operation; there are some rules to follow. First, each mesh must share the same number of vertices. The morphing operation merely moves vertices from the source mesh positions to match the target mesh positions. This brings up the second rule: Each vertex in the source mesh must have a matching vertex (that is, a matching index number) in the target mesh. Take the meshes shown in Figure 8.1 as an example.

Vertex ordering is important here. For a vertex to move from the source position to the target position, it must share the same index number. If you were to renumber the order, the vertices would move in the wrong direction while morphing and produce some funky−looking results such as those shown in Figure 8.2:

As long as you design the meshes to have the same number of vertices and so that the vertex ordering matches up, you'll do just fine. As for getting the actual mesh data, I'll leave that in your capable hands. You can use the D3DXLoadMeshFromX function to load your meshes. After you've got two valid meshes loaded and ready to use, you can begin morphing them!

 

Morphing the Meshes

Now that you have two meshes to work with (the source and target meshes), you can begin the morphing process. Remember that morphing is the technique of changing one shape to another. You want the vertices in the source mesh, in their initial positions, to gradually move to match the positions of the target mesh's vertices.

You can measure the time period used to track the motion of the vertices from the source mesh coordinates to the target mesh coordinates using a scalar value (ranging from 0 to 1). With a scalar value of 0 the vertices will be positioned at the source mesh coordinates, whereas with a scalar value of 1 the vertices will be positioned at the target mesh coordinates. As Figure 8.3 illustrates, any scalar value between 0 and 1 will place the vertices somewhere between the source mesh and target mesh coordinates.

It is quite simple to calculate the coordinates in which to position a vertex between the source mesh coordinates and target mesh coordinates. Take a vertex from the source mesh and multiply the vertex's coordinates by the inversed scalar value (1.0−scalar). Using the inversed scalar means that the original vertex coordinates will use 100 percent of the vertex's coordinate position when the scalar is at 0.0, and zero percent of the vertex's coordinate position when the scalar is at 1.0.

Next, using the same indexed vertex's coordinates from the target mesh, multiply the vertex's coordinates by the scalar value. Adding the two resulting values gives you the final coordinates to use for the vertex during the morphing animation.

At first, this concept of multiplying the vertex coordinates by a scalar value and adding the results together might seem strange. If you're unsure of the math, perform the following calculations to see that the results are indeed correct. Use a one−dimensional value to represent the vertex coordinates. Set the source vertex coordinate to 10 and the target vertex coordinate to 20. To make things easy, use a scalar value of 0.5, which should give you a resulting morphing vertex coordinate of 15.

Multiplying the source coordinate (10) by 1−0.5 gives you 5. Multiplying the target coordinate (20) by 0.5 gives you 10. Adding the two results (5 and 10) gives you 15. Isn't that special−it comes out to the correct value after all!

This procedure would resemble the following code, assuming that the vertex's source coordinates are stored in vecSource, the target coordinates are stored in vecTarget, and the scalar is stored in Scalar.

// vecSource = D3DXVECTOR3 with source coordinates
// vecTarget = D3DXVECTOR3 with target coordinates
// Scalar = FLOAT with scalar value

// Multiply source coordinates by inversed scalar
D3DXVECTOR3 vecSourcePos = vecSource * (1.0f−Scalar);

// Multiply target coordinates by scalar
D3DXVECTOR3 vecTargetPos = vecTarget * Scalar;

// Add the two resulting vectors together
D3DXVECTOR vecPos = vecSourcePos + vecTargetPos;

After that last bit of code, the vecPos vector will contain the coordinates to use for positioning a vertex during the morphing animation. Of course, you would repeat the same calculations for each vertex in the source mesh. In the next section, you'll get to see how to perform these calculations to build your own morphing meshes. Before that, however, I'd like to mention something about timing your morphing animations.

Up to this point, I've been ignoring the factor of time−both the length of the animation cycle (how long the morphing animation takes to progress from the source coordinates to the target coordinates) and exactly what point in time you are sampling the coordinates from in the animation sequence. Assuming you are measuring time in milliseconds, with the animation's length stored as Length (a FLOAT value) and the time at which you are sampling the coordinates stored as Time (also a FLOAT value), you can compute a proper scalar value to use in your calculations as follows:

Scalar = Time / Length;

Using the calculations you've already seen in this section, you can use the scalar value to compute the coordinates of the vertices to build your morphing mesh.

That's the second time I've mentioned building a morphing mesh, so I won't keep delaying things. Read on to see how to build a morphing mesh you can use to render. Although I previously hinted at using a vertex shader, first I will show you the easiest way to build a morphing mesh−by manipulating the mesh's vertex buffers directly.


posted on 2008-04-28 16:59 lovedday 閱讀(843) 評(píng)論(1)  編輯 收藏 引用

評(píng)論

# re: Working with Morphing Animation(1) 2008-09-21 15:26 Li_Prominent

兄弟,摘抄“Advanced Animation with DirectX”的文章應(yīng)該注明啊。
而且你摘地不完全啊。
少了Vertex Shader 那部分精華內(nèi)容。  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            最新精品在线| 亚洲尤物在线视频观看| 久久精品国产一区二区三区免费看| 亚洲国产婷婷| 欧美久久一区| 欧美一级片在线播放| 午夜激情综合网| 激情成人综合网| 欧美成ee人免费视频| 欧美成人自拍视频| 亚洲四色影视在线观看| 亚洲一区二区三区在线| 国产主播精品在线| 欧美成人免费一级人片100| 蜜臀99久久精品久久久久久软件| 日韩视频永久免费观看| 在线天堂一区av电影| 国产专区欧美专区| 亚洲韩日在线| 国产区在线观看成人精品| 老司机午夜精品视频| 欧美精品在线免费观看| 性做久久久久久免费观看欧美| 久久九九热re6这里有精品| 亚洲免费久久| 欧美亚洲免费在线| 一本大道久久精品懂色aⅴ| 亚洲自拍高清| 日韩视频在线免费观看| 亚洲欧美综合一区| 亚洲美女少妇无套啪啪呻吟| 亚洲欧美日韩视频二区| 亚洲美女毛片| 久久精彩免费视频| 亚洲综合久久久久| 欧美国产免费| 久久久久久网址| 国产精品成人久久久久| 亚洲国产成人久久综合| 国产专区一区| 亚洲一区二区在线看| 一本久道久久综合婷婷鲸鱼| 久久久久久免费| 性伦欧美刺激片在线观看| 欧美国产日韩在线观看| 久久久久久久久综合| 国产精品久久久久久超碰| 亚洲国产综合视频在线观看| 国产一区二区激情| 亚洲免费视频网站| 亚洲免费一区二区| 欧美日本精品| 亚洲国产欧美日韩另类综合| 影音先锋亚洲一区| 欧美一区二区视频免费观看| 午夜电影亚洲| 国产精品视频精品| 亚洲视频自拍偷拍| 亚洲影院免费| 国产精品sss| 亚洲午夜精品视频| 亚洲一区三区在线观看| 国产精品进线69影院| 亚洲最新合集| 亚洲午夜电影在线观看| 欧美日韩国产专区| 一本久道久久综合狠狠爱| 一本色道88久久加勒比精品| 欧美精品免费播放| 最新中文字幕一区二区三区| 日韩视频精品在线| 欧美人妖另类| 一本久道久久综合中文字幕 | 久久蜜桃香蕉精品一区二区三区| 欧美一区二区三区在线| 国产亚洲一区二区精品| 欧美尤物巨大精品爽| 欧美在线免费视屏| 狠狠色综合网| 欧美a级理论片| 亚洲人成亚洲人成在线观看| 99精品国产99久久久久久福利| 欧美精品一区二区蜜臀亚洲| 日韩午夜精品| 欧美伊人久久久久久久久影院| 国产婷婷色一区二区三区四区| 欧美在线免费观看视频| 欧美国产日韩一区| 亚洲网站视频| 国产一区在线播放| 免费在线成人av| 亚洲图片欧洲图片日韩av| 欧美综合国产精品久久丁香| 在线观看一区二区精品视频| 欧美激情一区二区三区在线视频观看 | 在线性视频日韩欧美| 国产精品揄拍一区二区| 久久青草久久| 在线亚洲成人| 欧美成人免费小视频| 亚洲欧美资源在线| 亚洲成人中文| 国产精品网站视频| 女人香蕉久久**毛片精品| 一本到12不卡视频在线dvd | 亚洲另类视频| 国产午夜精品理论片a级探花| 欧美.www| 西西裸体人体做爰大胆久久久| 欧美国产视频一区二区| 欧美亚洲一区三区| 亚洲欧洲精品一区| 国产麻豆综合| 欧美精品成人91久久久久久久| 欧美一区二区大片| 一区二区三区四区五区精品| 蜜臀91精品一区二区三区| 亚洲一区二区三区免费观看| 亚洲国产日韩欧美在线99| 国产日韩精品在线观看| 欧美日韩一区二区在线| 噜噜噜在线观看免费视频日韩| 亚洲免费在线视频一区 二区| 亚洲日本成人在线观看| 久久综合精品国产一区二区三区| 亚洲嫩草精品久久| 一区二区三区鲁丝不卡| 亚洲激情电影在线| 在线观看av一区| 国产一区二区三区不卡在线观看| 欧美天堂亚洲电影院在线观看 | 欧美精品亚洲二区| 猛干欧美女孩| 久久综合伊人77777| 欧美一区二视频在线免费观看| 亚洲午夜激情免费视频| 99国产精品久久| 99在线精品观看| 亚洲靠逼com| 亚洲精品日韩激情在线电影| 美女主播精品视频一二三四| 久久免费视频在线观看| 久久综合狠狠| 狂野欧美一区| 欧美成年人视频网站| 麻豆久久婷婷| 欧美好吊妞视频| 欧美激情小视频| 亚洲高清色综合| 日韩一区二区精品| 日韩一区二区精品在线观看| 99riav久久精品riav| 99这里只有久久精品视频| 99国产精品视频免费观看| 日韩亚洲欧美高清| 亚洲一区二区三区国产| 先锋影音一区二区三区| 性欧美暴力猛交69hd| 久久黄色网页| 免费亚洲网站| 欧美日韩影院| 国产日韩在线看| 在线成人中文字幕| 日韩一区二区免费看| 亚洲一区二区三区视频| 久久gogo国模啪啪人体图| 久久久久成人精品| 欧美大学生性色视频| 亚洲精品欧美精品| 亚洲免费网址| 免费不卡在线观看| 欧美视频免费在线| 国产视频亚洲精品| 一区二区激情视频| 久久久xxx| 91久久国产自产拍夜夜嗨| 亚洲视频狠狠| 久久青草欧美一区二区三区| 欧美日韩大陆在线| 国内精品久久久| 一本色道综合亚洲| 久久综合久久综合久久| 亚洲美女毛片| 久久久夜精品| 国产精品看片你懂得| 最近中文字幕日韩精品 | 久久久久九九视频| 91久久在线视频| 久久精品国产亚洲a| 欧美日韩一区三区| 影音先锋另类| 欧美在线播放一区二区| 亚洲精品一级| 久久久精品视频成人| 国产精品卡一卡二| 99精品国产一区二区青青牛奶 | 一区二区欧美精品| 欧美gay视频| 午夜精品免费在线| 国产精品久久久亚洲一区 |