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

天行健 君子當自強而不息

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>
            最新日韩在线| 亚洲第一网站免费视频| 久久精品国产亚洲a| 欧美激情精品久久久久久黑人 | 国产日韩精品电影| 一区二区三区视频在线看| 欧美夫妇交换俱乐部在线观看| 欧美一区二区三区成人| 国产精品国产三级国产专播精品人| 日韩一级黄色av| 亚洲国产精品成人综合色在线婷婷| 久久久国产一区二区| 一区三区视频| 美女啪啪无遮挡免费久久网站| 久久精品99无色码中文字幕| 国产一区二区三区久久| 久久久久九九九| 久久精品亚洲精品| 在线视频观看日韩| 欧美**人妖| 欧美xx69| 一区二区三欧美| 99人久久精品视频最新地址| 欧美视频第二页| 欧美一区二区精美| 欧美在线视频免费播放| 国内精品亚洲| 欧美黄色一级视频| 欧美日韩一区二区在线观看| 亚洲一区二区精品视频| 午夜精品久久久久久99热| 国内精品久久久久久久影视蜜臀| 久久综合狠狠综合久久综合88| 久久视频在线视频| 日韩视频在线免费| 亚洲欧美国产日韩中文字幕| 黄色av日韩| 亚洲欧洲视频| 国产精品永久免费| 牛牛精品成人免费视频| 欧美精品一区二区三区在线播放| 亚洲欧美视频在线| 久久久久一区二区| 日韩午夜精品| 性色av一区二区三区红粉影视| 亚洲国产欧洲综合997久久| 亚洲精品之草原avav久久| 国产女人精品视频| 亚洲福利视频三区| 欧美日韩在线电影| 久久国产精品电影| 欧美高清视频免费观看| 亚洲日本中文字幕| 国产精品99久久久久久久久| 亚洲欧美在线免费| 91久久国产综合久久蜜月精品| 99热这里只有精品8| 加勒比av一区二区| 夜久久久久久| 在线不卡中文字幕| 亚洲午夜精品久久| 亚洲电影观看| 亚洲在线观看免费视频| 亚洲国产精品成人精品| 亚洲一区免费网站| 亚洲国产精品视频| 欧美一级大片在线观看| 亚洲午夜小视频| 久久中文在线| 久久精品国产清自在天天线 | 国产婷婷色一区二区三区四区| 欧美华人在线视频| 国产亚洲欧美日韩日本| 亚洲久久一区| 亚洲国产精品第一区二区三区 | 国产精品爽爽ⅴa在线观看| 麻豆精品视频在线观看| 欧美日韩在线一二三| 老妇喷水一区二区三区| 国产欧美在线视频| 日韩午夜电影| 一本久久综合亚洲鲁鲁五月天| 欧美一区二区三区日韩| 亚洲视频免费看| 久久最新视频| 久久成人精品无人区| 国产精品久久网| 亚洲国产成人久久| 黄色在线成人| 久久精品论坛| 羞羞漫画18久久大片| 欧美揉bbbbb揉bbbbb| 欧美88av| 亚洲人成人一区二区在线观看 | 国产在线一区二区三区四区 | 伊人狠狠色j香婷婷综合| 午夜日韩在线观看| 久久国产一区二区| 国产亚洲毛片在线| 午夜亚洲影视| 久久精品盗摄| 国产一区二区三区高清播放| 久久久www成人免费精品| 久久久久www| 国产一区观看| 久久精品观看| 欧美电影在线播放| 亚洲精品视频在线看| 欧美激情综合在线| 99人久久精品视频最新地址| 亚洲中无吗在线| 国产日韩在线视频| 久久久久久一区| 亚洲大胆视频| 欧美日韩国产成人| 欧美日韩福利在线观看| 日韩视频在线观看免费| 亚洲综合二区| 国内精品99| 欧美激情免费观看| 亚洲一级黄色| 久久一区激情| 一本高清dvd不卡在线观看| 欧美性猛片xxxx免费看久爱| 亚洲欧美大片| 欧美福利在线| 亚洲欧美日韩网| 在线精品视频一区二区三四| 欧美精品激情blacked18| 一区二区三区四区五区精品视频 | 亚洲一区二区免费在线| 久久综合久久综合久久综合| 亚洲精品中文字幕在线| 国产精品日韩一区二区三区| 久久激情五月婷婷| 亚洲毛片在线观看.| 久久久91精品| 中文精品99久久国产香蕉| 国产一区二区三区高清在线观看| 欧美成人dvd在线视频| 亚洲天堂黄色| 亚洲高清久久网| 久久精品动漫| 日韩西西人体444www| 国产一区二区三区久久悠悠色av | 欧美激情性爽国产精品17p| 一区二区三区你懂的| 亚洲国产精品www| 国产色视频一区| 欧美日韩一卡| 美国成人直播| 久久99伊人| 亚洲男人的天堂在线观看| 亚洲精品日韩在线观看| 久久久久国色av免费看影院| 性欧美xxxx大乳国产app| 99精品视频一区二区三区| 亚洲第一精品夜夜躁人人躁| 国产精品人人做人人爽人人添| 欧美激情一二区| 久久蜜桃资源一区二区老牛 | 今天的高清视频免费播放成人 | 欧美一二区视频| 亚洲午夜免费视频| 一区二区免费在线播放| 亚洲大胆av| 国产一区二三区| 国产一区二区三区久久| 国产日韩精品久久| 国产欧美91| 国产精品日韩在线播放| 国产精品jizz在线观看美国| 欧美国产亚洲视频| 欧美夫妇交换俱乐部在线观看| 久久久久久久久久码影片| 欧美在线视频观看| 欧美在线一二三| 久久www成人_看片免费不卡 | 国产日韩精品一区二区三区| 欧美色网一区二区| 国产精品福利在线观看网址| 在线播放中文一区| 欧美阿v一级看视频| 欧美亚洲一区在线| 午夜欧美大尺度福利影院在线看| 亚洲欧美卡通另类91av| 亚洲一区视频| 亚洲一区欧美| 午夜视频在线观看一区| 欧美一区二区大片| 久久精品国产清高在天天线 | 欧美v日韩v国产v| 美女主播视频一区| 欧美国产日韩视频| 欧美日韩第一页| 欧美手机在线视频| 国产日韩av一区二区| 狠狠色丁香婷婷综合| 亚洲国产综合在线看不卡| 亚洲激情中文1区|