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

天行健 君子當自強而不息

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>
            韩国v欧美v日本v亚洲v| 亚洲另类黄色| 日韩一区二区精品视频| 亚洲精品社区| 一本久道久久综合婷婷鲸鱼| 亚洲精品国产精品国自产在线| 欧美一区二区视频在线| 欧美一区二区在线免费观看| 久久精品夜夜夜夜久久| 欧美gay视频| 欧美日本簧片| 国产欧美日韩综合精品二区| 狠狠色狠狠色综合系列| 亚洲狼人综合| 欧美一区二区在线| 蜜桃av综合| 亚洲乱码久久| 久久国内精品视频| 欧美日韩国产a| 国产日韩专区在线| 日韩亚洲综合在线| 亚洲一区免费在线观看| 久久男人av资源网站| 亚洲国产网站| 99re6热只有精品免费观看| 新片速递亚洲合集欧美合集| 欧美a级片网| 国产日本欧美在线观看| 亚洲欧美日韩一区在线| 国产主播一区二区三区| 日韩一级黄色大片| 欧美中文字幕精品| 亚洲激情在线| 久久精品欧洲| 国产精品日韩久久久久| 亚洲区一区二区三区| 久久国产精品久久国产精品| 亚洲精选视频在线| 久久精品国产999大香线蕉| 欧美天天在线| 日韩视频精品在线| 噜噜噜久久亚洲精品国产品小说| 日韩一本二本av| 欧美成在线视频| ●精品国产综合乱码久久久久| 亚洲欧美一级二级三级| 亚洲精品一区在线| 欧美电影免费观看高清| 狠色狠色综合久久| 久久九九全国免费精品观看| 中文日韩在线视频| 欧美日韩黄色大片| 亚洲三级免费| 欧美国产丝袜视频| 免费观看成人网| 亚洲激情国产| 欧美国产一区二区在线观看 | 亚洲无玛一区| 亚洲高清一区二区三区| 久久久一区二区三区| 国产一区二区久久久| 欧美在线亚洲| 欧美一区二区成人| 韩国av一区| 久热精品视频| 美女网站久久| 亚洲免费av观看| 亚洲欧洲三级| 欧美丝袜第一区| 午夜精品一区二区三区在线播放| 日韩一二在线观看| 国产精品久久久久久久久久免费| 亚洲综合色网站| 欧美一级久久久| 在线日韩中文| 日韩亚洲欧美精品| 国产伦精品一区二区三区视频黑人| 欧美一区网站| 美女福利精品视频| 中文一区字幕| 亚洲专区一区二区三区| 国产一区二区日韩| 亚洲第一精品电影| 国产精品国产a级| 这里只有精品视频| 欧美成人激情视频免费观看| 亚洲级视频在线观看免费1级| 亚洲人成网站777色婷婷| 欧美色精品天天在线观看视频| 欧美亚洲免费电影| 久久免费视频一区| 一区二区三区欧美日韩| 亚洲欧美在线一区二区| 1769国产精品| 亚洲午夜一级| 亚洲高清视频一区二区| 亚洲免费激情| 狠狠色丁香婷婷综合| 亚洲精品美女久久7777777| 国产精品人成在线观看免费| 欧美成人网在线| 国产精品美女久久久浪潮软件| 老司机凹凸av亚洲导航| 欧美视频一区二区三区…| 麻豆精品视频在线观看视频| 欧美午夜女人视频在线| 亚洲成人在线视频播放| 国产日韩高清一区二区三区在线| 亚洲高清在线播放| 国产日本亚洲高清| 日韩午夜激情| 91久久精品美女高潮| 亚洲欧美日韩一区二区三区在线观看 | 亚洲午夜精品一区二区| 久久精品中文字幕免费mv| 一区二区三区四区五区在线| 久久先锋影音| 久久久久久久久蜜桃| 国产精品免费网站| 99视频精品全国免费| 亚洲精品乱码久久久久久| 久久九九精品99国产精品| 午夜欧美精品| 国产精品毛片a∨一区二区三区|国| 亚洲国内精品| 91久久精品久久国产性色也91 | 欧美日韩中文另类| 亚洲国产精品久久久久婷婷884 | 欧美一级专区免费大片| 国产精品家教| 一区二区三区免费观看| 在线亚洲一区| 欧美精品一区在线发布| 欧美激情 亚洲a∨综合| 精品999在线观看| 久久精品免视看| 久久人人爽人人爽爽久久| 国产亚洲午夜| 亚洲愉拍自拍另类高清精品| 久久福利电影| 久久精品在线观看| 国产亚洲日本欧美韩国| 欧美在线电影| 久久理论片午夜琪琪电影网| 国产一区二区三区四区hd| 欧美一区二区观看视频| 久久久久久一区二区三区| 国产在线乱码一区二区三区| 久久爱91午夜羞羞| 噜噜噜噜噜久久久久久91| 亚洲第一精品夜夜躁人人爽| 麻豆精品91| 亚洲精品午夜精品| 亚洲欧美日韩系列| 国产一区在线看| 久久伊人亚洲| 亚洲国产精品一区制服丝袜| 亚洲欧洲日韩在线| 欧美日韩另类视频| 亚洲深夜av| 久久综合伊人77777尤物| 亚洲国产精品va在线观看黑人| 欧美黑人国产人伦爽爽爽| av成人免费在线| 久久国产免费看| 亚洲日韩欧美视频| 国产精品一级| 美女在线一区二区| 宅男噜噜噜66一区二区| 久久夜色精品国产亚洲aⅴ| 亚洲乱码日产精品bd| 国产精品一区视频网站| 免费看成人av| 亚洲欧美日韩综合aⅴ视频| 欧美大成色www永久网站婷| 亚洲图片欧洲图片av| 国模吧视频一区| 欧美日韩午夜剧场| 久久久五月婷婷| 亚洲桃色在线一区| 欧美激情一区二区三区高清视频| 亚洲午夜激情在线| 亚洲观看高清完整版在线观看| 国产精品久久久久国产精品日日 | 在线视频精品一| 美女日韩欧美| 性久久久久久久久久久久| 亚洲欧洲视频| 狠狠爱综合网| 国产精品日韩欧美| 欧美日韩在线播放一区| 久久一综合视频| 新狼窝色av性久久久久久| 亚洲美女免费精品视频在线观看| 久久只精品国产| 午夜伦欧美伦电影理论片| 亚洲精品乱码久久久久久日本蜜臀 | 久久手机精品视频| 亚洲女人天堂成人av在线| 亚洲欧洲日产国产综合网|