D3D如何做出CS那样的3D行走轮系统系统,有何要点

《云中行走》幕后视效大揭秘 410米高空钢索怎么走?
来源:搜狐娱乐
站在400多米高空往下看是个啥体验?身为“恐高症”患者的姿势君想想就觉得腿一哆嗦。
日,一个叫菲利普?帕特的法国小伙儿世贸中顶楼,站在双子塔之间的钢丝,走了一次吓尿大家的钢索。
  (转自微信公众号:电影涨资势)在老牌导演罗伯特-泽米吉斯的2015年的新片《云中行走》中,这场大胆而疯狂的冒险得以还原。影片在纽约首映时甚至有观众吓吐了。而1月22日,这部吓死人不偿命的电影也终于穿过漫漫云海,飘到了中国观众的眼前。
迳蛟诰缰械陌缦
  《阿甘正传》导演泽米吉斯操刀 老牌特效师助阵
听到导演“罗伯特?泽米吉斯”可别犯懵儿哟,因为银家就是《阿甘正传》的导演。还记得开场的那片羽毛咩?
  泽米吉斯老大爷对电影界的高新技术一直乐此不疲
  1994年,《阿甘正传》里开场的羽毛堪称经典,后来阿甘和肯尼迪握手的场景惊呆了不少小伙伴;
  2004年的《极地特快》首次尝试将CG动画真人捕捉技术用于电影,被载入吉尼斯世界纪录;
  2007年老爷子干脆掌管迪士尼的ImageMovers Digital公司成为“动捕专业户”,并以IMAX 3D的形式重新演绎了狄更斯的《圣诞颂歌》。
Atomic Fiction视效案例
  这次负责《云中行走》视效部分的是Atomic Fiction。资势君试着翻译了一下曾经做过的案例,他们居然有――奥斯卡最佳视效提名的《星际迷航:暗黑无界》(2013)、《独行侠》(2013);获艾美奖提名的《宇宙时空之旅》(2014);其他知名作品还包括《迫降航班》(2012)、《环形使者》(2012)以及即将在内地上映的《云中行走》。
居然这么帅,翻出照片的那一刻,资势君可直可弯了
  而视效总监则是凯文-贝利(KevinBaillie)
  更重要的是他那么年轻,但是早已是一位老牌视效师了!!!代表作品包括《超人归来》(2006)、《博物馆奇妙夜》(2006)、《加勒比海盗3:世界的尽头》、《变形金刚3》(2011)、《星际迷航:暗黑无界》(2013)、《极品飞车》(2014)等。
  前期拍摄准备:其实高空戏都是室内拍的
南塔楼角绿幕真相
影片中呈现的南塔楼角
  因为导演泽米吉斯曾在ImageMoversDigital公司(这是迪士尼公司主打运动捕捉和CGI的电影工作室,2007年成立,2010年关闭,仅出品过《圣诞颂歌》和《火星需要妈妈》两部作品)掌舵,所以《云中行走》本来是打算用运动捕捉的形式完成表演的。而那时视效总监贝利也在那家公司,已经开始探讨如何与Atomic Fiction的瑞安-图德普(RyanTudhope,也是一位资深视效师)展开合作。
  “我们都很清楚这次的任务是要对世贸中心双子塔的屋顶做一系列视觉重建,然后还有一大堆绿幕合成要完成,”贝利说。“重点在于,这些重建要花多少钱?是在室内还是在室外拍?”
  令贝利感到庆幸的是,拍摄最终选在蒙特利尔的梅尔斯电影工作室(MELS film stages)室内进行,这样就避免了室外拍摄会遇到的光线、气候变化等复杂问题。
  贝利说道:“我们建了一个40×60×12英尺的舞台作为南塔楼角,影片大部分时间里主人公都在这里活动。然后确立了一个合适的角度,以保证从这个角度刚好能看到下面的行人在散步,其他部分就是交给视效环节去做了。此外,相机的高度设置也很重要,必须得保证能把演员走钢丝的场景收入镜头中,而且不能遗漏任何一个重要的角落。”
  摄影指导达瑞兹-沃斯基(DarszWolski)选了天花板上的一块区域布光,以此模拟真实的天空。“为了完美再现一片多云的天空,达瑞兹和他的团队提供了宽泛、柔和的打光,”
天花板系统创造出自然的光照效果
  贝利说道:“如果剧情是发生在日出时分,那么天花板上的灯只用一半就可以了,当然这时还要单独用一盏代表太阳。其实我们的照明条件不是特别好,但是达瑞兹用他的天花板系统真的创造出自然的光照效果,挺不可思议的。”
  钢丝怎么走?有特殊装置保护,迳蛴胩嫔砥肷险
  当这部作品确定以真人电影的方式拍摄时,这场玩儿命大戏就必须得表现得足够令人信服,一些特殊的拍摄手段被提上日程:
主演约瑟夫-高登-莱维特从开拍前到拍摄过程中一直在接受专业的走钢丝训练
  在实际拍摄时情况要复杂得多――演员/替身演员有时真的踩在钢丝上,有时踩在特制的木板上,有时则是踩在一种叫做“加拿大板”(Canadian Bar)的装置上。
  这套装置是一道20英尺长的钢梁,中间是一道凹槽,这样钢丝就可以悬置在其中。表演时约瑟夫的脚仍然踩在钢丝上,一旦失去平衡,凹槽两边的任意一边依然可以给他支撑以免坠落。
  特效总监贝利说:
  “有时我们会使用Nuke出品的变形工具对绳索作出微妙的变形,以便匹配演员踩在上面时因重量产生的抖动。而为了保证作品能够完美还原钢丝在演员走动过程中的呼吸感,约瑟夫和替身的镜头我们都做了使用。如果演员的脚因为碰到了&加拿大板&上没有表现出脚部&包裹&在钢丝上应有的弧度,我们的特效师们就会对脚部的形态做出修正让画面看起来更可信。”
  “最关键的是,我们得将多种手段综合使用,镜头有时候是约瑟夫,有时候是替身演员杰德-坎达-马丁(Jade Kindar-Martin,来自著名的太阳马戏团),有时约瑟夫踩在保护装置上,有时没有&&如果总是重复使用一种手段很容易让画面变得很假,但我们只是偶尔玩儿点小花活儿,这样观众们才会买账。”
  换脸怎么换?不只是面孔,还有表情和表演
  因为一些钢索上的戏份由替身演员完成,而有时镜头面要做推拉的范围超出了绿幕的限定,因此Atomic Fiction公司制作了二十几个面部替换模型和数字替身。
  贝利谈到:“我们和一家叫做Pixelgen的公司合作,这家公司专门从事3D扫描的摄影测量工作。他们用100台相机包围住演员,当这些相机开始同时运作同测量就开始了――利用每分钟内不同相机的数据差异,不仅可以重建面部和身体的几何结构,还可以得到丰富细致到毛孔纹理的面部细节。”
这传说中的大换脸连表情、皮肤、发丝都可以还原!
  “这不只是从一般意义上还原面孔,还原做鬼脸或是专注时紧锁双眉的神情也很重要。皮肤仿真系统甚至可以捕捉到血液在脸部的流动、发丝的摆动和瞳孔的细微变化。比如当血液流过额头时,四周的肌肤就会显得很苍白一些。”
  在拍摄的最后一天,剧组还使用了Faceware头戴式人脸识别摄影机。
  贝利说道:“我们给约瑟夫穿戴好设备并让他站在地面上的一截带子上进行表演。这样就捕捉到了约瑟夫真实的面部表情并把它们移植到数字替身的面部上去,而肢体的部分还是替身演员杰德完成。”所以所谓的“换脸”换的不只是面容,还有表情。
  “复活”世贸中心:建模与绘景实现“双塔奇谋”
  世贸中心双子塔作为纽约的地标性建筑,从911事件倒塌后至今也有15年了,无论从感情上还是实际操作上讲,重建这样一座建筑都是一项巨大的挑战。“乍一看你可能会觉得它只是一道从地面腾空而起的1400英尺长的直线,所以如果你只是按照图纸字面的意思去构建,会使它看起来非常假,”贝利说道。
特效下的纽约市
  “我们必须在面板上做出一些调整使得直线看起来不要那么僵硬,让整栋建筑的线条看起来更自然一些。当然也不能做得太过火,否则会显得很蹩脚。”
完成这样的任务需要大量的图片作蓝本,美术团队参考了数以千计的照片和影像资料
  多数人可能不知道的是,直到2001年双子塔倒塌前,世贸中也没有多少数字形式的素材。很多胶片介质的照片模糊不清并不能直接拿来用。幸运的是,剧组手上有双子塔的建筑图纸,也通过纽约港务局得到了整个世贸中心建筑群的详细信息。
  另一方面,双子塔外表面的材质是电镀铝,虽然看起来不光滑,但有着很高的反射率,周遭环境会及时反映在上面。所以晴天的时候它看起来是白色的,多云天气下则深接近深灰色。“我们必须把这些问题解决好,不然观众会觉得这跟他们印象中的不一致。”
  因为双子塔外表受周遭环境影响很大,因此制作时必须时刻从全方位考虑,而不是仅仅关注摄影机能看到的那部分。“一旦出现盲区,整个建筑就被毁了。”
  而通过一些参考图片,制作团队发现,在某些角度通过双子塔的玻璃窗其实是可以看到一部分内景的。“有时通过窗户确实可以看到星星点点的灯光、办公桌、书架等”贝利说:“所以我们复原了将近30层楼的内部细节,有深度和视觉差的效果会让着一切看起来更真实,而这种做法对于3D转换也提供了发挥的余地。
  3D转制:其实,转制不一定比原生的差
  画面的立体感是这部电影的另一个重点。泽米吉斯非常依靠最终呈现的3D画面来让观众沉浸在帕特的世界里。虽然片子实际上是用单机拍摄的,但仍在追求立体感。
人家的转制3D怎么就这么真呢!
  传奇3D(Legened3D)负责了《云中行走》的后期转制工作。他们从负责电影特效的公司拿到所有的素材,根据他们所希望的转制3D预算,将素材图层重叠。贝利说:“有趣的是,这部电影一共只有826个镜头,但一些大片大概会有2200个特效镜头。”
贝利说,“在做完这个项目以后,我是真的相信转制3D要比原生的更好了。”
  “主要原因是这使拍摄过程更容易,只要你时刻记得拍3D电影的法则。此外,3D转制的设备现在也确实非常神奇,我们只要坐在影院里,就可以实时地做出一些转制决定,比如景深该有多少。你可以直接指出,这段景深太深;前景的这个人有点挡住我了,这样你就可以实时地进行调整。但用3D摄像机拍出的原生素材,很有可能让你在某些时候卡壳了。”
  尾声:
  对贝利而言,这场高空秀意义非凡。
  “拍摄期间我们得到特许飞到世贸中心旧址1400英尺上空。在飞机盘旋的过程中,我向下望去,难以克制的惊喜、恐惧和敬畏之情油然而生。这里就是菲利普曾经走过的地方,在这么高的地方,在没有任何保护措施的情况下,他竟然完成了一场秀。”
1974年的那场壮举给了贝利意外惊喜――因为工作需要,贝利得以坐直升机飞到高空俯拍纽约城。
  “这是一种前所未有的强烈感受。我把它带回我的工作中并拿它来衡量我们的作品:这个镜头能不能让我感觉又重回直升机里?如果不能,说明我们的工作效果还不够好。”
(责任编辑:张尧 UK029)
客服热线:86-10-
客服邮箱:D3D如何做出CS那样的3D行走系统,有何要点
[问题点数:40分,结帖人nabasasun]
D3D如何做出CS那样的3D行走系统,有何要点
[问题点数:40分,结帖人nabasasun]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|3D游戏编程入门(十四)D3D绘制三角形完整代码
为了方便大家理解,我这里给出一个完整的代码,因为考虑到理解问题,这里更多的使用的是结构流程化的编程,实际上,我们应该使用更加面向对象化的设计,包括使用预编译头,模板类这些在代码中都没有给出,仅仅实现了一个功能而已.理解就好,另外最后给出了一个应该运行出来的图示.另因为运行环境和新浪博客的格式不同,所以在代码缩进等方面会有一顶出入,不过还不至于影响读程,大家可以拿回自行进行修改调试.
#include & d3dx9.h&
#include & windows.h&
#include & stdlib.h&
#include & malloc.h&
#include & memory.h&
#include & tchar.h&
// 全局变量:
hI&&&&&&&&//
szTitle[20];&&&&&&&&//
标题栏文本
szWindowClass[20];&&&&&&//
主窗口类名
LPDIRECT3D9 g_pD3D =
NULL;&&&&&&//
LPDIRECT3DDEVICE9 g_pD3DDevice =
NULL;&&&//
D3D设备指针
LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL; //
顶点缓存指针
//定义顶点信息的结构体
struct CUSTOMVERTEX
&&& FLOAT x, y,
//定义自由顶点格式
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
//定义释放COM对象的宏
#define SafeRelease(pObject) if(pObject != NULL)
{pObject-&Release(); pObject=NULL;}
// 此代码模块中包含的函数的前向声明:
ATOM&&&&MyRegisterClass(HINSTANCE
hInstance);
BOOL&&&&InitInstance(HINSTANCE,
LRESULT CALLBACK&WndProc(HWND, UINT, WPARAM,
LRESULT CALLBACK&About(HWND, UINT, WPARAM,
//初始化D3D设备
HRESULT InitialiseD3D(HWND hWnd)
&//取得D3D9的对象
&&& g_pD3D =
Direct3DCreate9(D3D_SDK_VERSION);
&&& if(g_pD3D ==
return E_FAIL;
&//得到当前的显示模式
D3DDISPLAYMODE d3
if(FAILED(g_pD3D-&GetAdapterDisplayMode(D3DADAPTER_DEFAULT,
return E_FAIL;
&//创建一个D3D设备
D3DPRESENT_PARAMETERS d3
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;//全屏模式还是窗口模式
d3dpp.SwapEffect =
D3DSWAPEFFECT_DISCARD;//后台缓冲区复制到前台时,清除后台缓冲区内容
d3dpp.BackBufferFormat = d3ddm.F//屏幕的显示模式
&//创建一个Direct3D设备
if(FAILED(g_pD3D-&CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pD3DDevice)))
return E_FAIL;
&&& return
HRESULT InitialiseVertexBuffer()
&//顶点信息数组
&CUSTOMVERTEX cvVertices[] =
&&{250.0f, 100.0f, 0.5f, 1.0f,
D3DCOLOR_XRGB(255, 0, 0),},
&&{400.0f, 350.0f, 0.5f, 1.0f,
D3DCOLOR_XRGB(0, 255, 0),},
&&{100.0f, 350.0f, 0.5f, 1.0f,
D3DCOLOR_XRGB(0, 0, 255),},
&//通过设备创建顶点缓冲
&if(FAILED(g_pD3DDevice-&CreateVertexBuffer(3 *
sizeof(CUSTOMVERTEX),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0, D3DFVF_CUSTOMVERTEX,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
D3DPOOL_DEFAULT, &g_pVertexBuffer,NULL)))
&&return E_FAIL;
&//锁定顶点缓冲,并得到一个存放顶点信息的缓冲区的指针
&if(FAILED(g_pVertexBuffer-&Lock(0,
sizeof(cvVertices), (void**)&pVertices, 0)))
&&return E_FAIL;
&//复制顶点信息
&memcpy(pVertices, cvVertices,
sizeof(cvVertices));
&//解锁顶点缓冲区
&g_pVertexBuffer-&Unlock();
&&& return
void Render()
if(g_pD3DDevice == NULL)
&//清空后备缓冲区为黑色
g_pD3DDevice-&Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,
0, 0), 1.0f,
&//开始绘制场景
g_pD3DDevice-&BeginScene();
&//渲染三角形
&g_pD3DDevice-&SetStreamSource(0,
g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX));
&g_pD3DDevice-&SetFVF(D3DFVF_CUSTOMVERTEX);
&g_pD3DDevice-&DrawPrimitive(D3DPT_TRIANGLELIST,
&//结束绘制场景
g_pD3DDevice-&EndScene();
&//翻页显示
g_pD3DDevice-&Present(NULL, NULL, NULL, NULL);
//释放所使用到的所有COM对象
void CleanUp()
&SafeRelease(g_pVertexBuffer);
&SafeRelease(g_pD3DDevice);
&SafeRelease(g_pD3D);
//游戏循环
void GameLoop()
//进入游戏循环
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT)
fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage)
&&&&&&&&&&&
//处理消息
&&&&&&&&&&&
TranslateMessage(&msg);
&&&&&&&&&&&
DispatchMessage(&msg);
&&&//如果没有消息,则渲染当前的场景
&&&&&&&&&&&
int APIENTRY _tWinMain(HINSTANCE hInstance,
&&&&&&&&&&&&&&&&&&&&
HINSTANCE hPrevInstance,
&&&&&&&&&&&&&&&&&&&&
lpCmdLine,
&&&&&&&&&&&&&&&&&&&&
&//注册Windows的窗口类
&&& WNDCLASSEX
wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L,
&&&&&&&&&&&&&&&&&&&&
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
&&&&&&&&&&&&&&&&&&&&
"D3DDrawGraphics", NULL};
RegisterClassEx(&wc);
&//创建一个窗口
&&& HWND hWnd =
CreateWindow("D3DDrawGraphics", "D3D绘制简单图形",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
GetDesktopWindow(), NULL, wc.hInstance, NULL);
&//初始化Direct3D
if(SUCCEEDED(InitialiseD3D(hWnd)))
&&//显示窗口
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
&&//初始化顶点缓冲
&&if(SUCCEEDED(InitialiseVertexBuffer()))
&&&//开始游戏:
进入游戏循环
&&&GameLoop();
CleanUp();
&//撤销窗口类的注册
UnregisterClass("D3DDrawGraphics", wc.hInstance);
&&& return
// 注册窗口类
ATOM MyRegisterClass(HINSTANCE hInstance)
&WNDCLASSEX
&wcex.cbSize = sizeof(WNDCLASSEX);
&wcex.style&&&=
CS_HREDRAW | CS_VREDRAW;
&wcex.lpfnWndProc&=
(WNDPROC)WndP
&wcex.cbClsExtra&&=
&wcex.cbWndExtra&&=
&wcex.hInstance&&=
&wcex.hIcon&&&=
LoadIcon(hInstance, (LPCTSTR)IDI_MY);
&wcex.hCursor&&=
LoadCursor(NULL, IDC_ARROW);
&wcex.hbrBackground&=
(HBRUSH)(COLOR_WINDOW+1);
&wcex.lpszMenuName&=
(LPCTSTR)IDC_MY;
&wcex.lpszClassName&=
&wcex.hIconSm&&=
LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
&return RegisterClassEx(&wcex);
保存实例句柄并创建主窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
&& HWND hW
&& hInst = hI //
将实例句柄存储在全局变量中
CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance,
&& if (!hWnd)
return FALSE;
&& ShowWindow(hWnd,
nCmdShow);
&& UpdateWindow(hWnd);
&& return TRUE;
//& 窗口回调函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM
wParam, LPARAM lParam)
switch(message)
case WM_DESTROY:
&&&&&&&&&&&
PostQuitMessage(0);
&&&&&&&&&&&
case WM_KEYUP:
&&&&&&&&&&&
switch (wParam)
&&&&&&&&&&&
VK_ESCAPE:
&&&&&&&&&&&&&&&&&&&
DestroyWindow(hWnd);
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&& return
DefWindowProc(hWnd, message, wParam, lParam);
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。随笔 - 43, 文章 - 0, 评论 - 11, 引用 - 0
原文出处:
思路与相差不多,主要的区别在顶点的数据结构定义不一样。 2D的VERTEX结构定义为:
//&The&2D&vertex&format&and&descriptortypedef&struct{&&&&float&x,&y,&z;&&//&2D&coordinates&&&&float&&&&&&&//&rhw&&&&float&u,&v;&&&&&//&texture&coordinates}&VERTEX;#define&VERTEX_FVF&&&(D3DFVF_XYZRHW&|&D3DFVF_TEX1)
3D的VERTEX结构定义为:
//&The&3D&vertex&format&and&descriptortypedef&struct{&&&&float&x,&y,&z;&&//&3D&coordinates&&&&&&&&float&u,&v;&&&&&//&texture&coordinates}&VERTEX;#define&VERTEX_FVF&&&(D3DFVF_XYZ&|&D3DFVF_TEX1)
其他的区别主要在Do_Init函数,3D模式启用深度蒙板,并且格式为16位z-缓存位深;接着禁用光照,并且启用z缓存;再接着设置透视矩阵和视口矩阵。
&& present_param.EnableAutoDepthStencil&=&TRUE;&& present_param.AutoDepthStencilFormat&=&D3DFMT_D16;&&& //&set&render&state&&&&//&disable&d3d&lighting&&&&g_d3d_device-&SetRenderState(D3DRS_LIGHTING,&FALSE);&&&&//&enable&z-buffer&&&&g_d3d_device-&SetRenderState(D3DRS_ZENABLE,&D3DZB_TRUE);&&&&//&create&and&set&the&projection&matrix&&&&//&builds&a&left-handed&perspective&projection&matrix&based&on&a&field&of&view&&&&D3DXMatrixPerspectiveFovLH(&mat_proj,&D3DX_PI/4.0,&1.33333,&1.0,&1000.0);&&&&//&sets&a&single&device&transformation-related&state&&&&g_d3d_device-&SetTransform(D3DTS_PROJECTION,&&mat_proj);&&&&//&create&and&set&the&view&matrix&&&&D3DXMatrixLookAtLH(&mat_view,&&&&&&&&&&&&&&&&&&&&&&&&&D3DXVECTOR3(0.0,&0.0,&-500.0),&&&&&&&&&&&&&&&&&&&&&&&&D3DXVECTOR3(0.0f,&0.0f,&0.0f),&&&&&&&&&&&&&&&&&&&&&&&&&D3DXVECTOR3(0.0f,&1.0f,&0.0f));&&&&g_d3d_device-&SetTransform(D3DTS_VIEW,&&mat_view);
函数Do_Frame也有一些区别,调用Clear来清除后备缓冲时增加了一个D3DCLEAR_ZBUFFER提示D3D要清除z 缓存,接着设置世界矩阵。
&& //&clear&device&back&buffer&&&&g_d3d_device-&Clear(0,&NULL,&D3DCLEAR_TARGET&|&D3DCLEAR_ZBUFFER,&D3DCOLOR_RGBA(0,&64,&128,&255),&1.0f,&0);&&& //&create&and&set&the&world&transformation&matrix&&&& //&rotate&object&along&z-axis&&&& D3DXMatrixRotationZ(&mat_world,&(float)&(timeGetTime()&/&1000.0));&&&&&&&&&&&& g_d3d_device-&SetTransform(D3DTS_WORLD,&&mat_world);
完整源码如下:
/***************************************************************************************PURPOSE:&&&&3D&Drawing&DemoRequired&libraries:&&WINMM.LIB,&D3D9.LIB,&D3DX9.LIB.&***************************************************************************************/#include&&windows.h&#include&&stdio.h&#include&"d3d9.h"#include&"d3dx9.h"#pragma&comment(lib,&"winmm.lib")#pragma&comment(lib,&"d3d9.lib")#pragma&comment(lib,&"d3dx9.lib")#pragma&warning(disable&:&4305)#define&WINDOW_WIDTH&&&&400#define&WINDOW_HEIGHT&&&400#define&Safe_Release(p)&if((p))&(p)-&Release();//&window&handles,&class&and&caption&text.HWND&g_HINSTANCE&g_static&char&g_class_name[]&=&"Draw3DClass";static&char&g_caption[]&&&&=&"Draw3D&Demo";//&the&Direct3D&and&device&objectIDirect3D9*&g_d3d&=&NULL;IDirect3DDevice9*&g_d3d_device&=&NULL;//&The&3D&vertex&format&and&descriptortypedef&struct{&&&&float&x,&y,&z;&&//&3D&coordinates&&&&&&&&float&u,&v;&&&&&//&texture&coordinates}&VERTEX;#define&VERTEX_FVF&&&(D3DFVF_XYZ&|&D3DFVF_TEX1)IDirect3DVertexBuffer9*&g_vertex_buffer&=&NULL;IDirect3DTexture9*&&&&&&g_texture&=&NULL;//--------------------------------------------------------------------------------//&Window&procedure.//--------------------------------------------------------------------------------long&WINAPI&Window_Proc(HWND&hwnd,&UINT&msg,&WPARAM&wParam,&LPARAM&lParam){&&&&switch(msg)&&&&{&&&&case&WM_DESTROY:&&&&&&&&PostQuitMessage(0);&&&&&&&&return&0;&&&&}&&&&return&(long)&DefWindowProc(hwnd,&msg,&wParam,&lParam);}//--------------------------------------------------------------------------------//&Initialize&d3d,&d3d&device,&vertex&buffer,&&set&render&state&for&d3d;//&set&perspective&matrix&and&view&matrix.//--------------------------------------------------------------------------------BOOL&Do_Init(){&&&&D3DPRESENT_PARAMETERS&present_&&&&D3DDISPLAYMODE&&display_&&&&D3DXMATRIX&mat_proj,&mat_&&&&BYTE*&vertex_&&&&//&initialize&vertex&data&&&&VERTEX&verts[]&=&{&&&&&&{&-100.0f,&&100.0f,&0.0f,&0.0f,&0.0f&},&&&&&&{&&100.0f,&&100.0f,&0.0f,&1.0f,&0.0f&},&&&&&&{&-100.0f,&-100.0f,&0.0f,&0.0f,&1.0f&},&&&&&&{&&100.0f,&-100.0f,&0.0f,&1.0f,&1.0f&}&&&&};&&&&&//&do&a&windowed&mode&initialization&of&Direct3D&&&&if((g_d3d&=&Direct3DCreate9(D3D_SDK_VERSION))&==&NULL)&&&&&&&&return&FALSE;&&&&//&retrieves&the&current&display&mode&of&the&adapter&&&&if(FAILED(g_d3d-&GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&&display_mode)))&&&&&&&&return&FALSE;&&&&ZeroMemory(&present_param,&sizeof(present_param));&&&&//&initialize&d3d&presentation&parameter&&&&present_param.Windowed&&&&&&&&&&&&&&&=&TRUE;&&&&present_param.SwapEffect&&&&&&&&&&&&&=&D3DSWAPEFFECT_DISCARD;&&&&present_param.BackBufferFormat&&&&&&&=&display_mode.F&&&&present_param.EnableAutoDepthStencil&=&TRUE;&&&&present_param.AutoDepthStencilFormat&=&D3DFMT_D16;&&&&//&creates&a&device&to&represent&the&display&adapter&&&&if(FAILED(g_d3d-&CreateDevice(D3DADAPTER_DEFAULT,&D3DDEVTYPE_HAL,&g_hwnd,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&D3DCREATE_SOFTWARE_VERTEXPROCESSING,&&present_param,&&g_d3d_device)))&&&&&&&&return&FALSE;&&&&&&&&&//&set&render&state&&&&//&disable&d3d&lighting&&&&g_d3d_device-&SetRenderState(D3DRS_LIGHTING,&FALSE);&&&&//&enable&z-buffer&&&&g_d3d_device-&SetRenderState(D3DRS_ZENABLE,&D3DZB_TRUE);&&&&//&create&and&set&the&projection&matrix&&&&//&builds&a&left-handed&perspective&projection&matrix&based&on&a&field&of&view&&&&D3DXMatrixPerspectiveFovLH(&mat_proj,&D3DX_PI/4.0,&1.33333,&1.0,&1000.0);&&&&//&sets&a&single&device&transformation-related&state&&&&g_d3d_device-&SetTransform(D3DTS_PROJECTION,&&mat_proj);&&&&//&create&and&set&the&view&matrix&&&&D3DXMatrixLookAtLH(&mat_view,&&&&&&&&&&&&&&&&&&&&&&&&&D3DXVECTOR3(0.0,&0.0,&-500.0),&&&&&&&&&&&&&&&&&&&&&&&&D3DXVECTOR3(0.0f,&0.0f,&0.0f),&&&&&&&&&&&&&&&&&&&&&&&&&D3DXVECTOR3(0.0f,&1.0f,&0.0f));&&&&g_d3d_device-&SetTransform(D3DTS_VIEW,&&mat_view);&&&&//&create&the&vertex&buffer&and&set&data&&&&g_d3d_device-&CreateVertexBuffer(sizeof(VERTEX)&*&4,&0,&VERTEX_FVF,&D3DPOOL_DEFAULT,&&g_vertex_buffer,&NULL);&&&&//&locks&a&range&of&vertex&data&and&obtains&a&pointer&to&the&vertex&buffer&memory&&&&g_vertex_buffer-&Lock(0,&0,&(void**)&vertex_ptr,&0);&&&&memcpy(vertex_ptr,&verts,&sizeof(verts));&&&&//&unlocks&vertex&data&&&&g_vertex_buffer-&Unlock();&&&&//&load&the&texture&map&&&&D3DXCreateTextureFromFile(g_d3d_device,&"Texture.bmp",&&g_texture);&&&&return&TRUE;}//--------------------------------------------------------------------------------//&Release&all&d3d&resource.//--------------------------------------------------------------------------------BOOL&Do_Shutdown(){&&&&Safe_Release(g_vertex_buffer);&&&&Safe_Release(g_texture);&&&&Safe_Release(g_d3d_device);&&&&Safe_Release(g_d3d);&&&&return&TRUE;}//--------------------------------------------------------------------------------//&Render&a&frame.//--------------------------------------------------------------------------------BOOL&Do_Frame(){&&&&D3DXMATRIX&mat_&&&&//&clear&device&back&buffer&&&&g_d3d_device-&Clear(0,&NULL,&D3DCLEAR_TARGET&|&D3DCLEAR_ZBUFFER,&D3DCOLOR_RGBA(0,&64,&128,&255),&1.0f,&0);&&&&//&Begin&scene&&&&if(SUCCEEDED(g_d3d_device-&BeginScene()))&&&&{&&&&&&&&//&create&and&set&the&world&transformation&matrix&&&&&&&&//&rotate&object&along&z-axis&&&&&&&&D3DXMatrixRotationZ(&mat_world,&(float)&(timeGetTime()&/&1000.0));&&&&&&&&&&&&&&&&g_d3d_device-&SetTransform(D3DTS_WORLD,&&mat_world);&&&&&&&&//&set&the&vertex&stream,&shader,&and&texture.&&&&&&&&//&binds&a&vertex&buffer&to&a&device&data&stream&&&&&&&&g_d3d_device-&SetStreamSource(0,&g_vertex_buffer,&0,&sizeof(VERTEX));&&&&&&&&//&set&the&current&vertex&stream&declation&&&&&&&&g_d3d_device-&SetFVF(VERTEX_FVF);&&&&&&&&//&assigns&a&texture&to&a&stage&for&a&device&&&&&&&&g_d3d_device-&SetTexture(0,&g_texture);&&&&&&&&//&renders&a&sequence&of&noindexed,&geometric&primitives&of&the&specified&type&from&the&current&set&&&&&&&&//&of&data&input&stream.&&&&&&&&g_d3d_device-&DrawPrimitive(D3DPT_TRIANGLESTRIP,&0,&2);&&&&&&&&//&release&texture&&&&&&&&g_d3d_device-&SetTexture(0,&NULL);&&&&&&&&//&end&the&scene&&&&&&&&g_d3d_device-&EndScene();&&&&}&&&&//&present&the&contents&of&the&next&buffer&in&the&sequence&of&back&buffers&owned&by&the&device&&&&g_d3d_device-&Present(NULL,&NULL,&NULL,&NULL);&&&&return&TRUE;}//--------------------------------------------------------------------------------//&Main&function,&routine&entry.//--------------------------------------------------------------------------------int&WINAPI&WinMain(HINSTANCE&inst,&HINSTANCE,&LPSTR&cmd_line,&int&cmd_show){&&&&WNDCLASSEX&&win_&&&&MSG&&&&&&&&&&&&&g_inst&=&&&&&//&create&window&class&and&register&it&&&&win_class.cbSize&&&&&&&&=&sizeof(win_class);&&&&win_class.style&&&&&&&&&=&CS_CLASSDC;&&&&win_class.lpfnWndProc&&&=&Window_P&&&&win_class.cbClsExtra&&&&=&0;&&&&win_class.cbWndExtra&&&&=&0;&&&&win_class.hInstance&&&&&=&&&&&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&=&g_class_&&&&win_class.hIconSm&&&&&&&=&LoadIcon(NULL,&IDI_APPLICATION);&&&&if(!&RegisterClassEx(&win_class))&&&&&&&&return&FALSE;&&&&//&create&the&main&window&&&&g_hwnd&=&CreateWindow(g_class_name,&g_caption,&WS_CAPTION&|&WS_SYSMENU,&0,&0,&&&&&&&&&&&&&&&&&&&&&&&&&&WINDOW_WIDTH,&WINDOW_HEIGHT,&NULL,&NULL,&inst,&NULL);&&&&if(g_hwnd&==&NULL)&&&&&&&&return&FALSE;&&&&ShowWindow(g_hwnd,&SW_NORMAL);&&&&UpdateWindow(g_hwnd);&&&&//&initialize&game&&&&if(Do_Init()&==&FALSE)&&&&&&&&return&FALSE;&&&&//&start&message&pump,&waiting&for&signal&to&quit.&&&&ZeroMemory(&msg,&sizeof(MSG));&&&&while(msg.message&!=&WM_QUIT)&&&&{&&&&&&&&if(PeekMessage(&msg,&NULL,&0,&0,&PM_REMOVE))&&&&&&&&{&&&&&&&&&&&&TranslateMessage(&msg);&&&&&&&&&&&&DispatchMessage(&msg);&&&&&&&&}&&&&&&&&&&&&&&&&//&draw&a&frame&&&&&&&&if(Do_Frame()&==&FALSE)&&&&&&&&&&&&break;&&&&}&&&&//&run&shutdown&function&&&&Do_Shutdown();&&&&UnregisterClass(g_class_name,&inst);&&&&&&&&return&(int)&msg.wP}
效果(图象绕z轴旋转):

我要回帖

更多关于 车架行走系统变宽 的文章

 

随机推荐