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

天行健 君子當自強而不息

Timing in Animation and Movement(6)

Creating In−Game Cinematic Sequences

Using time−based animation is crucial to achieving smooth playback, but what good could using time−based movement possibly do? Sure, moving a few objects around a set path is neat, but is that all you can do? The answer is a resounding no! There's much more you can do with time−based movement, including creating in−game cinematic sequences, like those from games such as Silicon Knights' Eternal Darkness: Sanity's Requiem In Eternal Darkness, the player is treated to animation sequences that play out using the game's 3D engine.

To use a cinematic camera, you can rely on the techniques you read about earlier in this chapter, and you can use the pre−calculated animation sequences, it's only a matter of plotting out the path that your camera will follow over time. Mix that with a complete
pre−calculated animation, and you've got yourself a complete in−game cinematic engine!

Rather than reiterate what you already saw in this chapter, I'll leave it up to you to check out the Cinematic demo, which shows a small cinematic sequence. In a nutshell, the demo merely loads a series of keys (using the .X path parser class) that represent the paths the camera follows. In every frame, the position of the camera is calculated using the keys, and the viewport is oriented. Then the pre−calculated animation is updated and the entire scene is rendered.

As shown in Figure 2.12, you get to see how complex routes can be applied to cameras in order to traverse a 3D scene in real time. This technique of moving a camera is perfect to use for an in−game cinematic system.

Figure 2.12: The cinematic camera demo adds a moving camera to the Route demo.

 

Route.x:

xof 0303txt 0032
template Path {
<F8569BED-53B6-4923-AF0B-59A09271D556>
DWORD Type; // 0=straight, 1=curved
Vector Start;
Vector Point1;
Vector Point2;
Vector End;
}
template Route {
<18AA1C92-16AB-47a3-B002-6178F9D2D12F>
DWORD NumPaths;
array Path Paths[NumPaths];
}
Route Robot {
5; // 5 paths
  0; // Straight path type
0.0, 10.0, 0.0; // Start
0.0, 0.0, 0.0; // Unused
0.0, 0.0, 0.0; // Unused
0.0, 10.0, 150.0;, // End
  1; // Curved path type
0.0, 10.0, 150.0; // Start
75.0, 10.0, 150.0; // Point1
150.0, 10.0, 75.0; // Point2
150.0, 10.0, 0.0;, // End
  1; // Curved path type
150.0, 10.0, 0.0; // Start
150.0, 10.0, -75.0; // Point1
75.0, 10.0, -150.0; // Point2
0.0, 10.0, -150.0;, // End
  0; // Straight path type
0.0, 10.0, -150.0; // Start
0.0, 0.0, 0.0; // Unused
0.0, 0.0, 0.0; // Unused
-150.0, 10.0, 75.0;, // End
  0; // Straight path type
-150.0, 10.0, 75.0; // Start
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 0.0;; // End
}
Route Camera {
4; // 4 paths
  1;  // Curved path type
0.0, 80.0, 300.0; // Start
150.0, 80.0, 300.0; // Point1
300.0, 80.0, 150.0; // Point2
300.0, 80.0, 0.0;, // End
  1;  // Curved path type
300.0, 80.0, 0.0; // Start
300.0, 80.0, -150.0; // Point1
151.0, 80.0, -300.0; // Point2
0.0, 80.0, -300.0;, // End
  1;  // Curved path type
0.0, 80.0, -300.0; // Start
-150.0, 80.0, -300.0; // Point1
-300.0, 80.0, -150.0; // Point2
-300.0, 80.0, 0.0;, // End
  1;  // Curved path type
-300.0, 80.0, 0.0; // Start
-300.0, 80.0, 150.0; // Point1
-150.0, 80.0, 300.0; // Point2
0.0, 80.0, 300.0;; // End
}
Route Target {
5; // 5 paths
  0; // Straight path type
0.0, 10.0, 0.0; // Start
0.0, 0.0, 0.0; // Unused
0.0, 0.0, 0.0; // Unused
0.0, 10.0, 150.0;, // End
  1; // Curved path type
0.0, 10.0, 150.0; // Start
75.0, 10.0, 150.0; // Point1
150.0, 10.0, 75.0; // Point2
150.0, 10.0, 0.0;, // End
  1; // Curved path type
150.0, 10.0, 0.0; // Start
150.0, 10.0, -75.0; // Point1
75.0, 10.0, -150.0; // Point2
0.0, 10.0, -150.0;, // End
  0; // Straight path type
0.0, 10.0, -150.0; // Start
0.0, 0.0, 0.0; // Unused
0.0, 0.0, 0.0; // Unused
-150.0, 10.0, 75.0;, // End
  0; // Straight path type
-150.0, 10.0, 75.0; // Start
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 0.0; // Unused
0.0, 10.0, 0.0;; // End
}

WinMain.cpp:

#include <windows.h>
#include 
<d3d9.h>
#include 
<d3dx9.h>
#include 
"Direct3D.h"
#include 
"route.h"

struct sBackdropVertex
{
    
float x, y, z, rhw;
    
float u, v;        
};

#define BACKDROP_FVF (D3DFVF_XYZRHW | D3DFVF_TEX1)

////////////////////////////////////////////////////////////////////////////////////////////////

IDirect3D9
*                g_d3d;
IDirect3DDevice9
*        g_device;
IDirect3DVertexBuffer9
*    g_backdrop_vb;
IDirect3DTexture9
*        g_backdrop_texture;
D3DXMESHCONTAINER_EX
*    g_robot_mesh_container;
D3DXMESHCONTAINER_EX
*    g_ground_mesh_container;

cXRouteParser            g_route_parser;

D3DXVECTOR3 g_robot_pos, g_robot_last_pos;    

const char CLASS_NAME[] = "CinematicClass";
const char CAPTION[]    = "Cinematic Demo";

////////////////////////////////////////////////////////////////////////////////////////////////

LRESULT FAR PASCAL window_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

bool do_init(HWND hwnd);
void do_shutdown();
void do_frame();


//////////////////////////////////////////////////////////////////////////////////////////////

int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR, int cmd_show)
{      
    CoInitialize(NULL);    
// Initialize the COM system

    
// Create the window class here and register it

    WNDCLASSEX win_class;  

    win_class.cbSize        
= sizeof(win_class);
    win_class.style         
= CS_CLASSDC;
    win_class.lpfnWndProc   
= window_proc;
    win_class.cbClsExtra    
= 0;
    win_class.cbWndExtra    
= 0;
    win_class.hInstance     
= inst;
    win_class.hIcon         
= LoadIcon(NULL, IDI_APPLICATION);
    win_class.hCursor       
= LoadCursor(NULL, IDC_ARROW);
    win_class.hbrBackground 
= NULL;
    win_class.lpszMenuName  
= NULL;
    win_class.lpszClassName 
= CLASS_NAME;
    win_class.hIconSm       
= LoadIcon(NULL, IDI_APPLICATION);

    
if(!RegisterClassEx(&win_class))
        
return -1;

    
// Create the main window
    HWND hwnd = CreateWindow(CLASS_NAME, CAPTION, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
                             
00640480, NULL, NULL, inst, NULL);

    
if(hwnd == NULL)
        
return -1;

    ShowWindow(hwnd, cmd_show);
    UpdateWindow(hwnd);

    
// Call init function and enter message pump
    if(do_init(hwnd)) 
    {
        MSG msg;    
        ZeroMemory(
&msg, sizeof(MSG));

        
// Start message pump, waiting for user to exit
        while(msg.message != WM_QUIT) 
        {
            
if(PeekMessage(&msg, NULL, 00, PM_REMOVE)) 
            {
                TranslateMessage(
&msg);
                DispatchMessage(
&msg);
            }
      
            do_frame();    
// Render a single frame
        }
    }
  
    do_shutdown();
    UnregisterClass(CLASS_NAME, inst);
    CoUninitialize();

    
return 0;
}

LRESULT FAR PASCAL window_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
// Only handle window destruction messages
    switch(msg) 
    {
    
case WM_DESTROY:
        PostQuitMessage(
0);
        
break;

    
case WM_KEYDOWN:
        
if(wParam == VK_ESCAPE)
            DestroyWindow(hwnd);

        
break;
    }

    
return DefWindowProc(hwnd, msg, wParam, lParam);
}

bool do_init(HWND hwnd)
{
    init_d3d(
&g_d3d, &g_device, hwnd, falsefalse);

    
if(FAILED(load_mesh(&g_robot_mesh_container, g_device, "..\\Data\\robot.x""..\\Data\\"00)))
        
return false;

    
if(FAILED(load_mesh(&g_ground_mesh_container, g_device, "..\\Data\\ground.x""..\\Data\\"00)))
        
return false;

    
// create the backdrop

    sBackdropVertex backdrop_verts[
4= 
    {
        {   
0.0f,   0.01.01.0f0.0f0.0f },
        { 
640.0f,   0.01.01.0f1.0f0.0f },
        {   
0.0f480.01.01.0f0.0f1.0f },
        { 
640.0f480.01.01.0f1.0f1.0f }            
    };

    g_device
->CreateVertexBuffer(sizeof(backdrop_verts), D3DUSAGE_WRITEONLY, BACKDROP_FVF, D3DPOOL_DEFAULT,
                                 
&g_backdrop_vb, NULL);

    
char* ptr;

    g_backdrop_vb
->Lock(00, (void**)&ptr, 0);
    memcpy(ptr, backdrop_verts, 
sizeof(backdrop_verts));
    g_backdrop_vb
->Unlock();

    D3DXCreateTextureFromFile(g_device, 
"..\\Data\\Backdrop.bmp"&g_backdrop_texture);

    
// setup a directional light

    D3DLIGHT9 light;
    ZeroMemory(
&light, sizeof(D3DLIGHT9));

    light.Type 
= D3DLIGHT_DIRECTIONAL;
    light.Diffuse.r 
= light.Diffuse.g = light.Diffuse.b = light.Diffuse.a = 1.0f;
    light.Direction 
= D3DXVECTOR3(0.0f-0.5f0.5f);

    g_device
->SetLight(0&light);
    g_device
->LightEnable(0, TRUE);

    
if(! g_route_parser.load("..\\Data\\Route.x"))
        
return false;

    
return true;
}

void do_shutdown()
{
    
// free mesh data
    delete g_robot_mesh_container;    g_robot_mesh_container  = NULL;
    delete g_ground_mesh_container;    g_ground_mesh_container 
= NULL;

    release_com(g_backdrop_vb);
    release_com(g_backdrop_texture);

    
// release D3D objects
    release_com(g_device);
    release_com(g_d3d);
}

void do_frame()
{
    
static DWORD start_time = timeGetTime();
    DWORD curr_time 
= timeGetTime();

    
// calculate the position in which to place the robot along the path based on time and robot_route_length of route.
    float robot_route_length = g_route_parser.get_length("Robot");
    DWORD robot_dist 
= (curr_time - start_time) / 10;
    robot_dist 
%= ((DWORD)robot_route_length + 1);

    
// get the camera's position
    float camera_route_length = g_route_parser.get_length("Camera");
    DWORD camera_dist 
= (curr_time - start_time) / 20;
    camera_dist 
%= ((DWORD) camera_route_length + 1);

    
// get the target's position
    float target_route_length = g_route_parser.get_length("Target");
    DWORD target_dist 
= (curr_time - start_time) / 10;
    target_dist 
%= ((DWORD) target_route_length + 1);

    
// update the positions of the robot
    g_robot_last_pos = g_robot_pos;
    g_route_parser.locate(
"Robot", (float)robot_dist, &g_robot_pos);

    
// get camera and target position
    D3DXVECTOR3 camera_pos, target_pos;
    g_route_parser.locate(
"Camera", (float)camera_dist, &camera_pos);
    g_route_parser.locate(
"Target", (float)target_dist, &target_pos);

    
// set a view transformation matrix
    D3DXMATRIX  mat_view;    
    D3DXVECTOR3 up(
0.0f1.0f0.0f);
    D3DXMatrixLookAtLH(
&mat_view, &camera_pos, &target_pos, &up);
    g_device
->SetTransform(D3DTS_VIEW, &mat_view);

    
// clear the device and start drawing the scene

    g_device
->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(000255), 1.0f0);

    g_device
->BeginScene();

    
// draw the backdrop
    g_device->SetFVF(BACKDROP_FVF);
    g_device
->SetStreamSource(0, g_backdrop_vb, 0sizeof(sBackdropVertex));
    g_device
->SetTexture(0, g_backdrop_texture);
    g_device
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 02);

    g_device
->SetRenderState(D3DRS_LIGHTING, TRUE);

    
// draw the ground mesh
    D3DXMATRIX mat_world;
    D3DXMatrixIdentity(
&mat_world);
    g_device
->SetTransform(D3DTS_WORLD, &mat_world);
    draw_mesh(g_ground_mesh_container);

    
// calculate the rotation of the robots based on last known position, and update last position once done.
    D3DXVECTOR3 diff = g_robot_pos - g_robot_last_pos;
    
float rot_x =  atan2(diff.y, diff.z);
    
float rot_y = -atan2(diff.z, diff.x);

    
// rotate the robot to point in direction of movement
    D3DXMatrixRotationYawPitchRoll(&mat_world, rot_y, rot_x, 0.0f);

    
// position the robot by setting the coordinates directly in the world transformation matrix
    mat_world._41 = g_robot_pos.x;
    mat_world._42 
= g_robot_pos.y;
    mat_world._43 
= g_robot_pos.z;
    g_device
->SetTransform(D3DTS_WORLD, &mat_world);

    draw_mesh(g_robot_mesh_container);

    g_device
->SetRenderState(D3DRS_LIGHTING, FALSE);

    g_device
->EndScene();

    g_device
->Present(NULL, NULL, NULL, NULL);
}

download source file


posted on 2008-04-21 18:23 lovedday 閱讀(366) 評論(0)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美三级在线播放| 欧美日韩亚洲国产精品| 国产一区二区剧情av在线| 校园激情久久| 欧美一区二区三区在线免费观看 | 亚洲国产精品免费| 欧美成人一区二免费视频软件| 亚洲电影一级黄| 亚洲精选视频在线| 国产精品久久影院| 久久综合影视| 欧美破处大片在线视频| 亚洲欧美日韩一区在线观看| 午夜精品久久久久久久99樱桃 | 亚洲精品欧洲精品| 欧美日韩国产在线播放网站| 亚洲欧美日韩综合国产aⅴ| 久久成人精品无人区| 亚洲精品久久| 午夜精品久久久久久久男人的天堂| 永久免费视频成人| 宅男噜噜噜66一区二区66| 国内一区二区三区| aa成人免费视频| 在线观看中文字幕亚洲| 夜色激情一区二区| 亚洲国产日韩美| 亚洲在线视频观看| 99精品国产一区二区青青牛奶| 亚洲欧美日韩在线观看a三区| 亚洲人成网站精品片在线观看 | 久久久人人人| 欧美日韩黄视频| 女生裸体视频一区二区三区| 国产精品久久亚洲7777| 亚洲高清不卡一区| 国产欧美一区二区三区另类精品| 亚洲国产人成综合网站| 国产综合视频在线观看| 亚洲午夜国产一区99re久久| 亚洲日本一区二区三区| 久久久国产精品一区| 午夜精品久久久久久99热| 欧美久久久久久久| 欧美成人亚洲| 国产一区二区三区av电影 | 欧美/亚洲一区| 韩国成人精品a∨在线观看| 一本色道久久加勒比88综合| 亚洲另类在线视频| 欧美成人精品三级在线观看 | 亚洲美女视频在线观看| 久久天天狠狠| 久久一区精品| 一区二区亚洲精品| 久久精品中文| 快播亚洲色图| 在线观看一区视频| 久久综合激情| 亚洲高清三级视频| 亚洲乱码国产乱码精品精可以看 | 国产欧美一级| 香蕉久久夜色精品国产| 久久精品国产视频| 国产一区二区精品在线观看| 欧美在线精品免播放器视频| 久久精品九九| 影音先锋久久| 欧美va天堂在线| 亚洲第一中文字幕| 99精品视频免费在线观看| 欧美精品尤物在线| 亚洲另类自拍| 欧美人与性动交cc0o| 9l视频自拍蝌蚪9l视频成人| 亚洲欧美成人精品| 国产日韩欧美制服另类| 久久久久久久综合狠狠综合| 亚洲第一区在线观看| 日韩亚洲精品电影| 国产精品黄视频| 久久黄色小说| 91久久精品国产| 亚洲欧美日韩精品一区二区 | 亚洲第一搞黄网站| 国产精品日韩精品欧美在线 | 亚洲在线免费视频| 亚洲永久在线观看| 亚洲综合色婷婷| 久久久精品国产99久久精品芒果| 久久久水蜜桃| 亚洲欧美国产日韩天堂区| 久久综合九色九九| 国产精品久久91| 亚洲精品国产精品乱码不99 | 国产亚洲欧美一区二区| 亚洲无人区一区| 亚洲欧美日韩精品久久亚洲区| 欧美制服丝袜| 亚洲剧情一区二区| 能在线观看的日韩av| 国产精品久久久对白| 亚洲精品免费网站| 久久亚洲精品一区| 性高湖久久久久久久久| 国产精品久久九九| 日韩一区二区高清| 免费看的黄色欧美网站| 久久久成人网| 在线观看日韩欧美| 鲁大师影院一区二区三区| 欧美亚洲午夜视频在线观看| 欧美日韩国产在线一区| 一区二区三区福利| 夜夜精品视频| 国产中文一区二区三区| 欧美一区二区三区另类| 亚洲欧美在线免费| 狠狠操狠狠色综合网| 欧美日韩一区二区在线视频| 亚洲国产精品成人久久综合一区| 久久久久www| 欧美激情精品久久久久久大尺度 | 亚洲人成7777| 欧美日韩国产精品一卡| 亚洲亚洲精品三区日韩精品在线视频| 亚洲美女视频网| 国产日本欧美一区二区三区| 久久蜜桃资源一区二区老牛 | 在线日本成人| 一本久道久久综合狠狠爱| 国产在线乱码一区二区三区| 性欧美video另类hd性玩具| 亚洲精品自在久久| 国产欧美日韩一区二区三区| 老司机久久99久久精品播放免费 | 最新国产拍偷乱拍精品| 国产精品久久久久久福利一牛影视 | 免费一区二区三区| 国产精品午夜电影| 亚洲电影免费观看高清完整版在线| 欧美日韩亚洲在线| 欧美激情精品久久久| 国产在线不卡视频| 香蕉久久国产| 欧美一二区视频| 国产精品一区在线观看| 一区二区三区四区蜜桃| 亚洲精品免费在线播放| 久久久噜噜噜久噜久久| 性做久久久久久| 国产精品综合| 久久高清一区| 欧美成人一区二区在线| 亚洲高清久久久| 欧美一区三区二区在线观看| 欧美精品在线观看| 日韩视频二区| 欧美一区二区在线观看| 国产午夜精品在线观看| 久久久久se| 最新国产成人在线观看| 亚洲专区免费| 狠狠色综合色区| 欧美日韩成人综合天天影院| 妖精成人www高清在线观看| 欧美在线免费观看视频| 91久久国产综合久久| 欧美日韩视频不卡| 欧美一区二区三区在线| 亚洲国产精品一区二区尤物区| 一区二区国产精品| 国产日本欧洲亚洲| 欧美jizz19hd性欧美| 小黄鸭视频精品导航| 91久久精品国产91性色 | 亚洲一区二区三区免费观看| 久久久久久久久伊人| 亚洲图片你懂的| 最新日韩欧美| 好男人免费精品视频| 国产乱码精品一区二区三区五月婷 | 亚洲欧美变态国产另类| 欧美激情区在线播放| 久久青草久久| 久久久人人人| 久久亚洲国产精品日日av夜夜| 午夜国产精品影院在线观看| 一区电影在线观看| 宅男噜噜噜66一区二区| 99国内精品久久| 亚洲一区二区日本| 午夜一区二区三区在线观看| 香蕉久久久久久久av网站| 亚洲一级电影| 久久午夜精品一区二区| 午夜精品视频在线| 久久av免费一区| 欧美福利精品| 国产一区二区日韩精品|