基于时间的动作时间单位:ms
速度慢的电脑可以通过丢帧来保证动画的速度
在Windows中读取时间
用timeGetTime()函数,详见MSDN
可以在函数的开头用静态变量来存储时间:
void FrameUpdate() { static DWORD LastTime = timeGetTime();
|
时间相关的动画记录动画的开始时间,然后存储每一帧相对开始时间的偏移量
关键帧的格式,包括时间和变换矩阵:
typedef struct sKeyframe { DWORD Time; D3DMATRIX matTransformation; } sKeyframe;
|
通过ElapsedTime来决定使用哪一帧
计算出值在0~1之间的一个标量值来确定当前时间相对于前后两个关键帧的位置
float Scalar = (Time - Keyframes[Keyframe].Time)/TimeDiff;
由这个标量值可以插值出当前的变换矩阵:
// Calculate the difference in transformations D3DXMATRIX matInt = D3DXMATRIX(Keyframes[Keyframe2].matTransformation) - D3DXMATRIX(Keyframes[Keyframe].matTransformation); matInt *= Scalar; // Scale the difference
|
这样动画就可以平滑地“播放”了
时间相关的运动通常运动是相对于位移的,因此要计算它:
float CalcMovement(DWORD ElapsedTime, float PixelsPerSec) { return (PixelsPerSec / 1000.0f * (float)ElapsedTime); }
|
沿轨道的运动即不受用户控制沿预定轨道的运动
直线轨道这个简单,知道起点、终点和当前的标量值就可求出:
D3DXVECTOR3 vecPos = (vecEnd - vecStart) * Scalar + vecStart; |
曲线轨道曲线不只是圆弧,这里我们采用更为广泛的曲线:Bezier曲线
我们需要4个点来确定曲线的方向和弯曲程度
那么它是怎么画出来的呢?看下面的图:
对每条线段进行均分,分得越多,曲线越光滑。然后把分割点像这样连接起来:
Beaier曲线就这样画出来了,HOHO~
计算位置有个公式,怎么推导这里就不介绍了,可以查阅相关资料:
P0~P3是那4个控制点,s是scalar值
定义路径复杂路径是一系列的轨道的组合,不仅是直线或曲线的问题,有时候是两者的结合
可以把它定义成类似于链表的形式:
enum { PATH_STRAIGHT = 0, PATH_CURVED }; typedef struct { DWORD Type; //直线还是曲线 D3DXVECTOR3 vecStart, vecEnd; //直点和终点 D3DXVECTOR3 vecPoint1, vecPoint2; //如果是曲线,这就是中间那两个控制点 } sPath;
|
路径用来移动游戏中的角色和其它相关物体是很酷的,比如你的袜子随风飘下
其中一个重要的应用就是用来控制摄像机实现电影中的各种镜头效果
例子,NND,编译不了!不说了
Reference:《Advanced Animation With DirectX》
分享到:
相关推荐
演示Direct3D程序的基本框架,以及如何创建Direct3D对象和Direct3D设备对象。 第3章 坐标系与基本图元 1、VertexBuffer 演示使用顶点缓冲区对象绘制基本图元。 2、BasicPrimitive 演示Direct3D中6种基本图元的绘制...
第32章 运动模糊效果 MotionBlur 演示运动模糊效果的实现,通过窗口下面的滑竿控件可以调节小球的运动速度。
第五部分是附录,包括学习direct3d之前所必须掌握的基础知识和directx sdk提供的各种工具的简要说明。 本书配套光盘提供了书中所有示例程序的可执行文件、工程文件和完整源代码,以方便读者编译、调试示例程序。 ...
第1章 做好学习本书的准备工作 1.1 安装DirectX SDK 1.2 选择调试或发布库 1.3 设置编译器 1.4 使用本书的功能函数 1.5 更进一步 第2篇 动画基础 第2章 计时动画和运动 2.1 运用计时运动 2.2 在Windows中...
第31章 三维场景交互 1、Pick 演示通过鼠标光标选择三维场景中的物体。 2、WalkByOrder 演示通过鼠标控制三维场景中人物角色的运动。当按下鼠标左键时,角色向鼠标点位置运动,当释放鼠标左键时,角色停止运动。
按下“F”和“V”键可以使飞机模型向前和向后运动。 3、StateControlUseQua 演示使用四元数旋转网格模型。程序运行时按下“D”和“A”键可以使飞机模型绕自身z轴旋转;按下“S”和“W”键可以使飞机模型绕x轴旋转;...
以3dmax作为基本三维建模工具,利用OpenGL作为图形和场景驱动工具,VC++作为软件开发平台,借鉴目前成熟的三维...重点研究以下关键技术:3dmax纹理烘焙和数据读取、DirectSound音效控制、LOD、碰撞检测和三维动画等技术。
本文深入分析了用.X文件存储的三维人体模型的运动仿真控制原理,并给出了一种基于DirectX SDK的三维人体仿真运动控制的应用方法。结合MFC应用程序框架,简要地介绍了Direct3D 应用程序的设计方法。
25.变形和从文件中加载3D物体 在这一课中,你将学会如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型。 26.剪裁平面,蒙板缓存和反射 在这一课中你将学会如何创建镜面显示效果,它使用剪裁平面,蒙板...
变形和从文件中加载3D物体 在这一课中,你将学会如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型。 26.剪裁平面,蒙板缓存和反射 在这一课中你将学会如何创建镜面显示效果,它使用剪裁平面,...
2009年10月1日 Ver:01.01.05 注意事项 首先,感谢您选用我公司最新产品。 在使用本监控卡之前,请详细阅读本说明书所涉及的相关事项,熟悉 硬件、软件各部分的功能后,方能使用,以确保该系统为您...
基于VC_和Direct3D的****PPI显示器仿真.pdf 基于VC_和MATLAB混合编程的可见水印系统设计.pdf 基于VC_和Matlab混编的DICOM医学图像分割实现.pdf 基于VC_和Matlab的图像处理比较研究.pdf 基于VC_和Matlab的数字信号内...
基于VC_和Direct3D的****PPI显示器仿真.pdf 基于VC_和MATLAB混合编程的可见水印系统设计.pdf 基于VC_和Matlab混编的DICOM医学图像分割实现.pdf 基于VC_和Matlab的图像处理比较研究.pdf 基于VC_和Matlab的数字信号内...
基于VC_和Direct3D的****PPI显示器仿真.pdf 基于VC_和MATLAB混合编程的可见水印系统设计.pdf 基于VC_和Matlab混编的DICOM医学图像分割实现.pdf 基于VC_和Matlab的图像处理比较研究.pdf 基于VC_和Matlab的数字信号内...