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

天行健 君子當自強而不息

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>
            欧美日韩不卡| 欧美日韩亚洲一区在线观看| 好看的亚洲午夜视频在线| 午夜精品久久久久久| 中文在线不卡| 国产欧美日韩不卡免费| 久久久久久91香蕉国产| 久久国产精品久久久| 亚洲国产精品久久久久秋霞影院| 久热精品在线视频| 欧美精品www| 欧美亚洲视频| 噜噜噜久久亚洲精品国产品小说| 亚洲伦理网站| 日韩一区二区高清| 国产区日韩欧美| 亚洲高清视频一区二区| 欧美日韩国产色视频| 香蕉免费一区二区三区在线观看 | 日韩写真视频在线观看| 国产精品亚洲产品| 欧美xart系列在线观看| 欧美日韩一二三四五区| 欧美在线影院在线视频| 欧美aⅴ一区二区三区视频| 亚洲校园激情| 久久婷婷一区| 亚洲在线免费| 免费成人高清在线视频| 性欧美video另类hd性玩具| 免费在线欧美视频| 久久高清国产| 欧美天堂在线观看| 欧美国产综合视频| 国产专区欧美专区| 一区二区三区四区五区在线 | 欧美日韩免费网站| 欧美sm重口味系列视频在线观看| 欧美香蕉大胸在线视频观看| 国产精品老牛| 亚洲乱码视频| 亚洲第一福利视频| 午夜精品亚洲一区二区三区嫩草| 日韩亚洲成人av在线| 久久深夜福利免费观看| 久久国产精品久久精品国产| 欧美视频在线视频| 亚洲精品乱码久久久久久日本蜜臀 | 欧美电影免费观看| 欧美久久影院| 宅男噜噜噜66一区二区| 久久亚洲高清| 国产精品99久久久久久久久 | 亚洲国产乱码最新视频| 欧美视频在线观看一区| 久久婷婷丁香| 亚洲欧美国产毛片在线| 欧美人在线观看| 老司机一区二区| 午夜精品美女自拍福到在线 | 欧美a级一区| 久久综合久色欧美综合狠狠| 一区二区三区国产在线观看| 91久久精品一区| 欧美激情精品久久久久久黑人| 久久精品导航| 久久精品国产99| 久久久久99| 久久婷婷人人澡人人喊人人爽| 久久xxxx精品视频| 久久精品视频一| 欧美福利电影网| 亚洲国产精品成人精品| 亚洲国产你懂的| 日韩视频免费在线观看| 亚洲深夜福利在线| 欧美亚洲三区| 欧美国产一区在线| 欧美性猛片xxxx免费看久爱| 国产亚洲毛片| 中国女人久久久| 久久国产手机看片| 亚洲国产成人av好男人在线观看| 亚洲欧洲在线播放| 性欧美xxxx视频在线观看| 久久精品国产久精国产思思| 欧美日韩www| 亚洲国产精品一区二区www在线| 亚洲精品国产精品乱码不99| 性做久久久久久| 最新中文字幕一区二区三区| 中文精品视频一区二区在线观看| 亚洲欧美日韩精品在线| 欧美日韩国产一区二区| 国内久久视频| 久久精品国产综合精品| 亚洲最新合集| 欧美日韩一本到| 日韩视频一区二区在线观看| 欧美另类99xxxxx| 亚洲精品少妇| 亚洲国产成人精品视频| 久久香蕉精品| 亚洲国产欧美在线| 亚洲电影成人| 欧美本精品男人aⅴ天堂| 在线欧美电影| 欧美黄色免费网站| 欧美激情一区二区三区在线视频观看 | 久久精品91久久久久久再现| 亚洲欧美日本在线| 国模吧视频一区| 亚洲国产精品一区二区www| 久久久久九九九| 亚洲精品在线一区二区| 日韩午夜三级在线| 国产区二精品视| 欧美国产专区| 国产精品毛片大码女人| 久久综合色8888| 欧美日韩精品久久久| 午夜精品影院| 欧美国产欧美亚洲国产日韩mv天天看完整| 在线国产日韩| 亚洲欧美bt| 日韩写真视频在线观看| 久久高清国产| 亚洲专区一区二区三区| 久久美女性网| 欧美在线免费看| 国产精品高清一区二区三区| 欧美精品久久天天躁| 欧美一区观看| 欧美日韩久久不卡| 免费试看一区| 国内精品一区二区三区| 亚洲精品社区| 99riav国产精品| 欧美成年人网站| 免费影视亚洲| 国产一区二区三区久久| 亚洲图片在线| 欧美一区1区三区3区公司| 国产精品地址| 亚洲视频狠狠| 久久精品视频免费播放| 国产精品一卡| 久久精品国产99精品国产亚洲性色| 亚洲男女毛片无遮挡| 欧美日韩免费观看一区| 99riav久久精品riav| 先锋影音网一区二区| 国产日韩欧美一区| 巨乳诱惑日韩免费av| 亚洲国产精品第一区二区| 亚洲国产精品悠悠久久琪琪| 欧美国产91| 先锋资源久久| 亚洲国产精品悠悠久久琪琪| 99香蕉国产精品偷在线观看| 国产精品美女久久久浪潮软件| 亚洲免费在线观看视频| 免费不卡亚洲欧美| a4yy欧美一区二区三区| 国产一区二区在线观看免费| 免费在线亚洲欧美| 欧美在线观看视频| 亚洲人精品午夜在线观看| 久久精品伊人| 亚洲一本大道在线| 亚洲国产精品成人综合色在线婷婷| 国产精品av久久久久久麻豆网| 久久裸体艺术| 欧美一区精品| 在线亚洲自拍| 亚洲一区视频在线观看视频| 欧美成人资源| 亚洲国产电影| 欧美激情黄色片| 亚洲国产婷婷香蕉久久久久久99 | 亚洲免费av网站| 亚洲国产精品久久久久秋霞影院 | 久久久久久亚洲精品杨幂换脸| 99国产一区| 一区二区三区视频在线| 亚洲美女毛片| 亚洲在线视频网站| 午夜精品视频一区| 欧美一区二区三区四区在线| 久久精品成人一区二区三区蜜臀 | 国产美女精品视频| 国产日韩精品在线观看| 国产一区二区三区网站| 国产一级揄自揄精品视频| 国产日韩一区二区三区| 一区在线影院| 一区二区成人精品| 久久九九热免费视频| 亚洲国产精品va在线看黑人动漫 | 欧美国产激情|