`

Direct3D学习(六):动画基础(1)动画和运动中的时间

 
阅读更多
基于时间的动作
时间单位: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对象和Direct3D设备对象。 第3章 坐标系与基本图元 1、VertexBuffer 演示使用顶点缓冲区对象绘制基本图元。 2、BasicPrimitive 演示Direct3D中6种基本图元的绘制...

    精通Direct3D图形与动画程序设计 32_第三十二章 运动模糊效果.rar

    第32章 运动模糊效果 MotionBlur 演示运动模糊效果的实现,通过窗口下面的滑竿控件可以调节小球的运动速度。

    精通DirectX.3D图形与动画程序设计.pdf

    第五部分是附录,包括学习direct3d之前所必须掌握的基础知识和directx sdk提供的各种工具的简要说明。  本书配套光盘提供了书中所有示例程序的可执行文件、工程文件和完整源代码,以方便读者编译、调试示例程序。 ...

    DirectX高级动画制作 电子书+源代码

    第1章 做好学习本书的准备工作 1.1 安装DirectX SDK 1.2 选择调试或发布库 1.3 设置编译器 1.4 使用本书的功能函数 1.5 更进一步 第2篇 动画基础 第2章 计时动画和运动 2.1 运用计时运动 2.2 在Windows中...

    精通Direct3D图形与动画程序设计 31_第三十一章 三维场景交互.rar

    第31章 三维场景交互 1、Pick 演示通过鼠标光标选择三维场景中的物体。 2、WalkByOrder 演示通过鼠标控制三维场景中人物角色的运动。当按下鼠标左键时,角色向鼠标点位置运动,当释放鼠标左键时,角色停止运动。

    精通Direct3D图形与动画程序设计 07_第七章 使用文件模型.rar

    按下“F”和“V”键可以使飞机模型向前和向后运动。 3、StateControlUseQua 演示使用四元数旋转网格模型。程序运行时按下“D”和“A”键可以使飞机模型绕自身z轴旋转;按下“S”和“W”键可以使飞机模型绕x轴旋转;...

    基于OpenGL的井下开采虚拟现实系统关键技术研究

    以3dmax作为基本三维建模工具,利用OpenGL作为图形和场景驱动工具,VC++作为软件开发平台,借鉴目前成熟的三维...重点研究以下关键技术:3dmax纹理烘焙和数据读取、DirectSound音效控制、LOD、碰撞检测和三维动画等技术。

    三维人体建模与运动仿真 ——基于DirectX SDK

    本文深入分析了用.X文件存储的三维人体模型的运动仿真控制原理,并给出了一种基于DirectX SDK的三维人体仿真运动控制的应用方法。结合MFC应用程序框架,简要地介绍了Direct3D 应用程序的设计方法。

    OPenGL编程书籍

    25.变形和从文件中加载3D物体 在这一课中,你将学会如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型。 26.剪裁平面,蒙板缓存和反射 在这一课中你将学会如何创建镜面显示效果,它使用剪裁平面,蒙板...

    Nehe的OpenGL教程电子书

    变形和从文件中加载3D物体 在这一课中,你将学会如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型。 26.剪裁平面,蒙板缓存和反射 在这一课中你将学会如何创建镜面显示效果,它使用剪裁平面,...

    iSee视频监控 v5.2

    2009年10月1日 Ver:01.01.05 注意事项 首先,感谢您选用我公司最新产品。 在使用本监控卡之前,请详细阅读本说明书所涉及的相关事项,熟悉 硬件、软件各部分的功能后,方能使用,以确保该系统为您...

    VC与Labview、Matlab编程论文资料

    基于VC_和Direct3D的****PPI显示器仿真.pdf 基于VC_和MATLAB混合编程的可见水印系统设计.pdf 基于VC_和Matlab混编的DICOM医学图像分割实现.pdf 基于VC_和Matlab的图像处理比较研究.pdf 基于VC_和Matlab的数字信号内...

    VC与Labview、Matlab编程论文资料[2].rar

    基于VC_和Direct3D的****PPI显示器仿真.pdf 基于VC_和MATLAB混合编程的可见水印系统设计.pdf 基于VC_和Matlab混编的DICOM医学图像分割实现.pdf 基于VC_和Matlab的图像处理比较研究.pdf 基于VC_和Matlab的数字信号内...

    VC与Labview、Matlab编程论文资料[4].rar

    基于VC_和Direct3D的****PPI显示器仿真.pdf 基于VC_和MATLAB混合编程的可见水印系统设计.pdf 基于VC_和Matlab混编的DICOM医学图像分割实现.pdf 基于VC_和Matlab的图像处理比较研究.pdf 基于VC_和Matlab的数字信号内...

Global site tag (gtag.js) - Google Analytics