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

天行健 君子當(dā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 閱讀(851) 評論(1)  編輯 收藏 引用

評論

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

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


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


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲高清视频在线| 久久精品人人做人人爽电影蜜月| 国产精品视频最多的网站| 亚洲美女电影在线| 免费成人高清| 久久香蕉精品| 亚洲高清成人| 亚洲国产日韩精品| 亚洲精品久久久蜜桃| 麻豆freexxxx性91精品| 狠狠色狠狠色综合日日91app| 午夜精品久久久久久久白皮肤 | 久久国产精品色婷婷| 欧美韩国在线| 日韩网站在线看片你懂的| 亚洲欧洲在线播放| 在线视频一区二区| 亚洲精品美女在线观看播放| 欧美sm视频| 洋洋av久久久久久久一区| 99视频精品免费观看| 国产精品美女午夜av| 久久国产精品99久久久久久老狼 | 午夜精彩国产免费不卡不顿大片| 在线亚洲欧美视频| 国产精品一区久久| 免费日韩av| 99视频精品全国免费| 国产精品一区二区三区观看| 久久久久久久97| 久久激五月天综合精品| 亚洲欧洲午夜| 99riav久久精品riav| 国产情人综合久久777777| 久久先锋资源| 欧美激情视频一区二区三区不卡| 亚洲黄色成人| 欧美激情2020午夜免费观看| 六月婷婷久久| 夜夜爽av福利精品导航| 亚洲另类视频| 国产精品亚洲一区| 亚洲字幕一区二区| 亚洲人体影院| 国产精品一区二区三区四区五区| 亚洲欧美日韩国产| 欧美一区二区三区在线| 国产精品呻吟| 欧美在线二区| 欧美伊人精品成人久久综合97| 91久久精品国产| 亚洲免费在线看| 亚洲片在线观看| 午夜久久tv| 一本久道久久久| 亚洲一区二区三区精品在线 | 欧美1级日本1级| 午夜精品久久久久久久99黑人| 久久亚洲二区| 亚洲一区三区视频在线观看| 久久人人97超碰精品888| 亚洲综合首页| 免费成人黄色av| 久久精品国产一区二区电影| 欧美精品亚洲| 欧美激情二区三区| 精品电影在线观看| 亚洲一区在线播放| 亚洲无线视频| 欧美激情aaaa| 女生裸体视频一区二区三区| 国产一区二区三区黄视频| 99视频精品在线| av不卡在线观看| 美女脱光内衣内裤视频久久影院 | 亚洲综合欧美日韩| 欧美/亚洲一区| 久久久最新网址| 国产啪精品视频| 亚洲天堂成人在线观看| 亚洲视频免费在线观看| 欧美日韩国产色站一区二区三区 | 亚洲大片一区二区三区| 欧美一区亚洲| 欧美一区二区在线免费播放| 欧美午夜精品理论片a级按摩 | 国产乱码精品一区二区三区忘忧草 | 久久精品一区二区国产| 久久精品国产99| 国产在线乱码一区二区三区| 欧美一区二区在线| 久久久久成人精品免费播放动漫| 国产乱码精品一区二区三区不卡| 亚洲永久免费观看| 久久精品一区二区三区不卡| 国产亚洲va综合人人澡精品| 亚洲欧美日韩一区在线观看| 欧美中文字幕久久| 国产一级揄自揄精品视频| 欧美在线免费视屏| 久久综合久久久久88| 伊人久久大香线蕉综合热线| 久久亚洲视频| 亚洲国产视频一区| 亚洲午夜精品一区二区| 国产精品久久久一区麻豆最新章节| 亚洲国产日韩一区二区| 一本久久知道综合久久| 国产精品久久久久影院色老大| 亚洲欧美中文日韩v在线观看| 亚洲天堂成人| 国内视频精品| 欧美一区二区高清| 亚洲精品免费一二三区| 久久本道综合色狠狠五月| 在线观看精品一区| 欧美日本韩国| 欧美亚洲一区二区在线观看| 欧美高清视频在线| 亚洲伊人观看| 在线日韩一区二区| 欧美亚洲一区二区三区| 在线播放不卡| 欧美一区亚洲| 欧美一区视频| 亚洲伦理在线观看| 国产精品亚洲精品| 女主播福利一区| 亚洲欧美日韩成人| 亚洲国产成人精品久久| 午夜欧美不卡精品aaaaa| 在线观看欧美日本| 欧美午夜三级| 久久中文精品| 亚洲图片在线| 久久婷婷av| 亚洲午夜久久久| 国产精品入口夜色视频大尺度 | 欧美成人视屏| 亚洲色图在线视频| 亚洲国产精品欧美一二99| 久久久久久久一区二区三区| 一区二区三区四区五区精品视频| 狠狠色狠色综合曰曰| 国产精品久久久久久亚洲调教| 免费观看欧美在线视频的网站| 亚洲欧美国产精品va在线观看| 亚洲国产三级| 欧美黄色网络| 乱码第一页成人| 久久国产精品黑丝| 午夜在线成人av| 亚洲欧美一区二区三区在线| 亚洲日韩视频| 亚洲精品社区| 亚洲国产精品激情在线观看| 国产一区二区三区精品久久久| 欧美小视频在线| 欧美片第一页| 欧美精品在线免费观看| 久久综合伊人77777蜜臀| 久久精品国产亚洲5555| 亚洲欧美日韩一区二区在线| 亚洲专区国产精品| 亚洲欧美在线磁力| 午夜日韩视频| 性欧美xxxx大乳国产app| 亚洲欧美日韩系列| 午夜精品一区二区三区在线视| 亚洲综合第一页| 亚洲影视在线| 欧美在线3区| 西瓜成人精品人成网站| 亚洲综合好骚| 久久一综合视频| 老鸭窝毛片一区二区三区| 欧美超级免费视 在线| 欧美sm重口味系列视频在线观看| 欧美大成色www永久网站婷| 欧美激情在线免费观看| 欧美日韩一区高清| 国产精品免费在线| 狠狠综合久久| 亚洲精品日产精品乱码不卡| 在线一区二区视频| 亚洲欧美日韩国产中文 | 国产精品日韩电影| 国产一区二区三区直播精品电影| 国内外成人在线视频| 亚洲激情女人| 中文亚洲欧美| 久久视频在线看| 亚洲国产精品一区制服丝袜| 中文亚洲视频在线| 久久久精品一品道一区| 欧美国产日韩免费| 国产女主播在线一区二区| 亚洲国产成人porn| 亚洲先锋成人| 六月丁香综合|