《Windows游戏编程》读书笔记

  • 窗口的定义,注册,创建,显示流程。事件处理器,即WinProcLRESULT CALLBACK WindowProc(窗口句柄,消息标识,左参数,右参数)。WM_PAINT:对于DirectX可以30-60帧/秒重画窗口,但对于Windows程序就切力了。

基本windows应用程序框架

主事件循环:

while(GetMessage(&msg, NULL, 0, 0))  { 
  TranslateMessage(&msg);  //虚拟加速键翻译器,输入工具
  DispatchMessage(&msg); //调用WinProc()
}

截屏(2011-08-28 10_03_21).jpg

 主程序入口:定义窗口类→注册窗口→创建窗口→主事件循环;且每个Windows程序都有独立的事件句柄WinProc

 

一个实时事件循环:加入测试消息队列机制,PeekMessage(),使用PM_REMOVE

 

对应同一个窗口类的多个窗口的消息

截屏(2011-08-28 10_22_11).jpg

截屏(2011-08-28 10_45_54).jpg

     动态加载菜单资源。在加载资源时,需要注意字符串形式还是符号常量MAKEINTRESOURCE()
      传入的消息,wparam从技术安全考虑取低位LODWORD(wparam)
 
      在屏幕上渲染是编写一个视频游戏最重要的部分。一般Windows程序用GDI,GDI+,而DirectX则是更专业的DirectDraw,Direct3D
截屏(2011-08-29 10_20_36).jpg  
使用GetDc()函数总可以获得一个窗口的图像描述表hdc
GetDC()-ReleaseDc()→BeginPaint()-EndPaint()  vs ValidateRect()
区别Windows Coords和Client Coords
手动使一个窗口无效:InvalidateRect()
图形&色彩术语
      像素Pixel
      分辨率Resolution
      色深Color depth
      隔行扫描/逐行扫描Interlaced/noninterlaced
      刷新速率Refresh rate (用Hz或fps表示)
      2D/3D加速 2D/3D acceleration
颜色查找表的工作原理
窗口事件
       输出文本:TextOut(Coords); DrawText(Area)
       不透明和透明(SetBkMode)的打印模式
        WM_PAINT,改变窗口大小,移动等情况下产生
键盘事件 →DirectInput
       Win32库,GetAsynKeyState()跟踪状态表中该键的最后已知状态(好处:可跟事件循环无关)
鼠标事件
自我传递消息
       PostMessage() 传递消息序列,异步
       SendMessage() 直接传消息,同步
      
第四章_WindowsGDI,控件和突发奇想     
     >图形设备描述表
             当访问一个图形设备描述表或句柄时,实际上就表示安装在计算机系统上的视频卡具体描述及其分辨率和色彩容量
     >色彩、画笔和画刷
             GDI一般一次只使用一个画笔和一个画刷
     >使用画笔
             创建CreatePen(), 获取默认GetStockObject()
             将任何GDI对象选择到图形设备描述表SelectObject(), 用完DeleteObject()
     >使用画刷
             GDI画刷为2类:纯色的和阴影的←MS愚蠢的规定(?)
             创建纯色填充画刷CreateSoildBrush()
             ....带阴影线的.........CreateHatchBrush()
     >直接绘点 SetPixel()
     >绘制线条 MoveToEx(), LineTo()
   >绘制矩形 Rectangle()
             填充矩形 FillRect()
             右边界的中空矩形FrameRect()
       **对于任何一个实例,必须都要一个窗口hWnd,HDC
      >绘制椭圆 Ellipse()
      >绘制多边形 Polygon()
      >字体 CreateFont()
      >WM_TIMER
            设置定时器 SetTimer,GetTickCount() 一般30fps
      >碰撞逻辑
     > 使用控件
      > 获取消息   GetSystemInfo()  SYSTEM_INFO结构指针
                          GetSystemMetrics()  通用的检索Windows和Desktop所有信息
                          GetTextMetrics()  检索文本规格函数
      > 一个字符的构成  《VC++技术内幕》p75
      > T3D游戏控制程序

 

第五章_ DirectX基础和COM 

> COM  所有的DirectX组件都是由COM构成的
     > HEL(硬件模拟层) 硬件不支持时用软件算法模拟出硬件功能,效率降低,但至少能实现
         HAL(硬件抽象层) 硬件支持需要的性能
     >DirectX基础类v6.0
        DirectDraw:控制视频显示的基本着色和2D图形引擎
        DirectSound:声音组件
        DirectSound3D:3D声音组件
        DirectMusic
        DirectInput:所有输入设备
        DirectPlay:网络方面内容
        Direct3DRM:Direct3D保留模式(用途:编写预排程序,模拟显示,速度极慢的演示)
Direct3DIM:Direct3D即时模式
   DirectSetup/AutoPlay:准DirectX组件
> COM升级的便利性
          COM对象:实际上就是实现大量界面的一个C++类或一套C++类
          COM对象的分布或包含,如何实现即插即用特性
      > GUID(全局单值标识符),或称IID(界面标识符) ← 可以利用微软的GUIDGEN.EXE生成
      > 创建COM
                 1,定义界面: struct  IGraphics : IUnknown {  }
                 2,创建界面容器类(核心) class COM_OBJECT : public  IGraphics, ISound, IInput {  }
      > DLL才是COM对象
      > COM和函数指针
           原型:int (*SetPixel) (int x, int y, int color);
                     int SetPixel_ATI (int x, int y, int color);
                     int SetPixel_VOODOO (int x, int y, int color);
                     int SetPixel_SIII (int x, int y, int color);
                     SetPixel = SetPixel_ATI ; // assigning a function pointer
           C++和虚函数都是建立在函数指针的基础上的,虚函数只是被很好地内置到了编程语言中,加强了功能,实际上就是这么一回事
     > 创建和使用DirectX接口 
        理解COM对象其实就是接口集,该接口集也就是函数指针(VTABLE)
          用DirectX COM对象来工作,只要创建COM对象,获得一个接口指针,然后正确调用该接口即可。
                1,安装SDK时,安装程序会自动对DLL进行装载并注册
                2,Win32 App中必须包含DDRAW.LIB
                3,#include “DDRAW.H”
        本质上讲,任何DirectX的调用都采用的方式: interface_pointer -> method_name (parameter list);
    > 接口查询
               所有的DirectX各个版本里的号码都是不同步的! (命名混乱
               确保使用最新版本的接口:1使用底层COM函数; 2使用QueryInterface()函数
                      LPDIRECTDRAW lpdd;   // version1.0
                      LPDIRECTDRAW lpdd7;  //version7.0
                      DircectDrawCreate(NULL, &lpdd, NULL);  // create version 1.0 DirectDraw object interface
                      lpdd->QueryInterface(IID_IDirectDraw7, &lpdd7); //find IDIRECTDRAW7 interface ID and use it to query for the interface
                      lpdd->Release();  
                      lpdd = NULL;
               
                      DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL);
    > COM / COM++ / DCOM

 

第六章_初次邂逅DirectDraw

>DirectDraw接口
             IUnknown 基本接口
             IDirectDraw 必须创建的主接口对象,支持MMS
             IDirectDrawSurface 用DirectDraw创建,控制和显示的实际显示表面
             IDirectDrawPalette 
             IDirectDrawClipper 帮助剪切DirectDraw光栅和位图操作到一些可见显示表面的子集
     > 组合使用接口
             1,创建主DirectDraw对象,并使用QueryInterface()来得到一个IDirectDraw7接口,或直接DirectDrawCreateEx()创建
             2,IDirectDrawSurface7接口至少创建一个主显示表面用以绘图
             3,IDirectDrawPalette接口创建一个调色板,用RGB三元组初始化并配置到相关显示表面中
             4,至少需要创建一个剪裁器并将尺寸设置为可见窗口的范围
             5,主显示表面上绘图
     > 创建DirectDraw对象 (昨天的内容)
     > DirectDraw的错误处理
              2个宏:FAILED() SUCCEEDED() 一般使用前者
   > DirectDrawCreateEx(NULL,(void**)&lpdd,IDD_IDirectDraw7,NULL);
      > 视频显示设备:
                 全屏模式(容易),直接写到视频设备里。没有其他应用程序能接触到该设备
                 窗口模式(更难掌握),其他应用程序的介入
      >设置DirectDraw的协作级别,IDirectDraw7::SetCooperativeLevel()
> 创建一个显示画面
                  屏幕上所显示的图像只不过是内存的某种形式,调色板或RGB彩色像素矩阵
                  1,写一个DDSURFACEDESC2数据结构
                  2,调用CreateSurface()
      > 选用调色板 SetPalette()
      > 绘图像素
                 所有DirectDraw视频模式和画面都是线性的,内存从上到下,从左到右线性增加
      > 锁定
                或解锁显存,顺序很重要 ::Lock()
      > 屏幕上绘制随机像素的全部过程
                1,// first create base IDirectDraw 7.0 interface
                     DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL);
                2, lpdd->SetCooperativeLevel // set the cooperative level for full-screen mode
                3,  lpdd->SetDisplayMode  // set the display mode   
                4,memset(&ddsd,0,sizeof(ddsd));
                     ddsd.dwSize = sizeof(ddsd); // clear ddsd and set size
                     ddsd.dwFlags = DDSD_CAPS; 
                     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
                5,lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL);// create the primary surface
                6,// build up the palette data array,fill in entry 0 and 255 with black and white
                7,lpdd->CreatePalette// create the palette object
                8,lpddsprimary->SetPalette// finally attach the palette to the primary surface
                9,lpddsprimary->Lock
                10,//TODO
                11,lpddsprimary->Unlock(NULL);// now unlock the primary surface
 

第七章_高级DirectDraw和位图图形

    IDIRECTDRAWSURFACE7::Blt()

    IDIRECTDRAWSURFACE7::BltFast()  需要剪裁时用前者,不需要时用后者

    基础裁剪知识(像素裁剪、位图裁剪),3D裁剪将会十分复杂

        像素按视口裁剪

        位图裁剪技巧

    使用IDirectDrawClipper进行DirectDraw裁剪

        步骤1,创建DirectDraw裁剪器对象,CreateClipper()

            2, 创建Clipper序列 //最麻烦,需要填写RGNDATA结构

            3,用IDIRECTDRAWCLIPPER::SetClipList

            4,用IDIRECTDRAWSURFACE7::SetClipper

    使用位图

        载入.bmp文件 (位图头文件,位图信息段(有调色板的话),位图数据段)

        载入8bit位图 SetEntries

        载入16bit位图 (24bit转16bit)

        载入24bit位图

    离屏表面

        创建的表面跟主表面是兼容的,具有一致的色深


    在离屏表面上进行blitting

      装载位图,创建表面,使用blitting

    色彩键

      源色彩键 DDCOLORKEY Object优先于background

      目标色彩键,方法跟源色彩键相同SetColorKey,需要改变2个标志位

      源叠加色彩键

      目标叠加色彩键


    如何更新DirectDraw调色板项

    256色模式下的色彩旋转(Color Roation)

       模拟水或液体的流动效果

    使用RGB模式的技巧

       1,利用手动色彩变换或查询表

       2,采用新的DirectX彩色和Gamma补偿,实时地在主表面上执行色彩操作


    手动色彩变换及查询表

       透明·alpha混合·光照·暗化处理

    DirectX新的色彩和Gamma控制接口

       IDirectDrawColorControl可以控制高度,对比度,色调,饱和度,锐度和Gamma值

       各种效果:如水下感觉,屏幕闪烁,灯光,黑暗

    将GDI和DirectX联用

       只需在DirectDraw中找到一个兼容DC

       在独占模式下,Windows不能够用GDI在任何DirectDraw表面绘制

    主DirectDraw对象

       GetCaps获得HEL,HAL,用于获取任意表面能力

       GetPixelFormat或GetSurfaceDesc结构DDSURFACEDESC2::ddpfPixelFormat

    在窗口模式下使用DirectDraw

       必须考虑使用者可能在任意分辨率和任意色彩深度模式下启动游戏

    在窗口中绘制像素

       1,主表面是整个屏幕,GetWindowRect()实际上获得的是整个窗口

       2,不知道色深,GetPixelFormat()以决定色彩的深度

    查找实际客户区

       AdjustWindowRectEx 计算不同样式的窗口尺寸

    剪裁DirectX窗口

       裁剪只对blitter起作用

       CreateClipper()

       SetHWnd() 将裁剪器同窗口相关联

       SetCClipper() 裁剪器同想要裁剪的表面相连

    本章总结:

              高彩模式,blitter,裁剪,彩色键,采样理论,窗口方式的DirectDraw



第八章_矢量光栅化及2D变换

   绘制线条

     问题1,计算机屏幕是一个由整数坐标表示的2D网格,如何显示浮点型坐标

     Bresenham算法

     解决实际问题:把像素以最接近实际直线的位置从点p1到点p2进行填充的这个过程成为光栅化。

               1,计算斜率K

               2,画点(x0,y0)

               3, 在x方向上每前进1.0个单位,在y方向上就前进K个单位,把这两个值加到(x0,y0)上

   基础2D图形裁剪知识

     图像空间级(像素级)裁剪,对象空间级裁剪

     两直线之交点

       利用矩阵式求逆阵

     裁剪直线

     Cohen-Sntherland算法

       判断线段跟矩形(剪裁区域)的情况

   线框多边形

     在游戏中,集中注意一件事,那就是速度!

     为了画多边形,所要做的就是对顶点循环,并连接点与点


   2D平面里的变换

     平移

     旋转(计算机中sin、cos采用弧度而不是角度)

     坐标变换很像极坐标向笛卡尔坐标的转变

     旋转时,逆时针θ为正,顺时针θ为负。在显示屏上,y轴是相反方向,正负也相反

     实时程序中使用三角函数很糟糕,需要建立一个查询表,将算好的0-360度的sin、cos值保存在查询表内

     关于精度,选择int还是float还是double

     缩放,每个坐标乘以缩放因子

     矩阵引论

       基础的矩阵知识已经在《3D数学基础》内补完,这里学起来就异常轻松了。

       使用矩阵进行各种变换(平移,缩放,旋转)

    

   填充实心多边形

     第一个约束条件,多边形必须为凸多边形

     第二个约束条件,确定所要画的多边形到底有多复杂


            

   绘制三角形和四边形

     每个端点变成整数之前加0.5

   四边形光栅化的一般情况

   多边形的三角化

     递归分割思想

     通用凸N边形渲染算法


   多边形碰撞检测

     边界球/圆

       对象具有一个平均半径,然后检测半径是否重叠(会有漏判)

       开方函数sqrt会消耗大量CPU周期,想办法优化

         1,只计算一次float差

         2,泰勒级数展开

     边界盒、边界箱

       Find_Bounding_Box_Poly2D

     点包含

       测试一个点是否被包含在一个矩形内部

       ↓如何判断一个点是否被包含在任意凸多边形之内

       半空间检测(Halfspace Test)需要运用到向量点积

   

   深入定时和同步

     基于Win32函数GetTickCount()

   卷轴和摇镜头

     页面卷轴Page Scrolling

     均匀平铺显示引擎

       采用基于tile的数据结构表示场景卷动

     稀疏位图平铺显示引擎(适合太空射击游戏)

     伪3D等轴测引擎

       等轴测Isometric,即采用一定倾斜视角的游戏

       方法一,基于单元,全2D

       方法二,基于全屏,具有一些2D或3D的碰撞网络

       方法三,采用全3D数学运算,使用一个固定的视角

         采用工具画碰撞对象非常消耗时间,且对画面的任何变动都意味着返工


   T3DLIB1函数库

     2D引擎架构,可以先全屏再调整窗口大小到窗口程序

     基本定义

     可用宏

     数据类型和结构

       BOB(Billter Object Engine)

     全局定义

     DirectDraw接口

       DDraw_Init

       DDraw_Shutdown

       DDraw_Attach_Clipper

       DDraw_Create_Surface

       DDraw_Flip

       DDraw_Wait_For_Vsync

       DDraw_Fill_Surface

       DDraw_Lock_Surface

       DDraw_UnLock_Surface

     2D多边形函数

       Draw_Triangle_2D

       Draw_TriangleFP_2D

       Draw_QuadFP_2D

       Draw_Filled_Polygon2D

       Translate_Polygon2D

       Rotate_Polygon2D

       Draw_Line

       Draw_Pixel

       Draw_Rectangle

       Draw_HLine

       Draw_VLine

       Screen_Transitions

       Draw_Text_GDI

     数学和误差函数

       Fast_Distance_2D //3.5% error

       Fast_Distance_3D //11% error

       Find_Bounding_Box_Poly2D

       Open_Error_File

       Close_Error_File

       Write_Error

     位图函数

       Load_Bitmap_File

       UnLoad_Bitmap_File

       Create_Bitmap_File

       Destroy_Bitmap

       Load_Image_Bitmap

       Flip_Bitmap

       Scroll_Bitmap

       Copy_Bitmap

     调色板函数

       Set_Palette_Entry

       Get_Palette_Entry

       Save_Palette_To_File

       Load_Palette_From_File

       Rotate_Colors

      *Blink_Colors

     实用工具函数

       Get_Clock

       Start_Clock

       Wait_Clock

       Collision_Test

       Color_Scan //另一种碰撞检测法

     BOB引擎

       BOB基本上是由一个或多个DirectDraw表面(最大到64个)

       BOB是由当前的DirectDraw裁剪器裁剪

       Create_BOB

       Destroy_BOB

       Draw_BOB

       Draw_Scaled_BOB

       Load_Frame_BOB

       Load_Animation_BOB

       Set_Pos_BOB

       Set_Vel_BOB

       Set_Animation_BOB

       Set_Anim_Speed

       Animation_BOB

       Move_BOB

       Hide_BOB

       Show_BOB

       Collision_BOB //检测2个BOB重叠


  本章总结:

            光栅化、裁剪、直线绘制、矩阵、碰撞检测、定时、卷动、等轴测引擎、完整的位图&多边形库



第九章_DirectInput输入和力反馈

  HEL(Hardware Emulation Layer) 硬件仿真层

  HAL(Hardware Abstraction Layer)硬件抽象层


  DirectInput组件

   DirectInput8Create

   DirectInputDevice8,从DirectInput8创建,和设备(...)通信的渠道

  设置DirectInput步骤

    1,通过DirectInput8Create创建DirectInput8接口

    2,查询设备GUID

    3,调用CreateDevice传递一个GUID

    4,DirectInputDevice8::SetCooperativeLevel 设置协作等级

    5,DirectInputDevice8::SetDataFormat 设置每个设备的数据格式

    6,DirectInputDevice8::SetProperty 设置设备性能

    7,DirectInputDevice8::Acquire 获得设备

    8,(可选)DirectInputDevice8::Poll 轮询设备

    9,DirectInputDirectDevice8::GetDeviceState 从设备获取数据

    用DirectInput的好处就是能与设备驱动无关的方式操作任何输入设备

    总是以创建顺序相反的顺序调用Release

  数据采集模式

    直接数据模式(默认)

    缓存数据模式

  创建主DirectInput对象

    键盘

      协作等级 DISCL_BACKGROUND | DISCL_NONEXCLUSIVE

      复杂的数据结构格式,允许如何格式化从输入设备得来的数据

      通用数据结构 SetDataFormat(&c_dfDIKeyboard)

      GetDeviceState,要在每次游戏循环中读取键盘,时机:循环顶部,在任何处理开始之前

      用完释放 Unacquire

    捕捉鼠标

      绝对模式(移动前后2个点)

      相对模式(移动过程中点的连续)

    使用游戏手柄(略)

    输入消息化

      所有的输入设备数据合并在一起,在根据这个结构做出决定

      Merge_Input(合并后事件的数据,键盘数据指针,鼠标数据指针,手柄数据指针)

    力反馈

    输入系统 T3DLIB2

 本章总结:

          DirectInput、键盘、鼠标、游戏手柄、输入数据消息化、力反馈、完整T3DLIB2库

      

第十章_用DirectSound和DirectMusic演奏乐曲

  DirectSound用于音效,跟单声道配合最好,立体声没有意义

  DirectMusic用于音乐

  一定使用长文件名!

  初始化DirectSound

    DirectSoundCreate

  理解协作等级

    可控制主声音缓冲的设定

    不可控制主声音缓冲的设定

  设定协作级别

    lpds->SetCooperativeLevel

  主声音缓冲与辅助声音缓冲

  创建辅助声音缓冲

    先创建DirectSoundBuffer描述性结构DSBUFFERDESC dsbd  

                                     WAVEFORMATEX pcmwf

    lpds->CreateSoundBuffer(&dsbd, &lpdsbuffer, NULL)

    若函数成功调用,则一个新的声音缓冲就建立了,并传给lpdsbuffer,该缓冲就是准备播放的

  把数据写入辅助声音缓冲

    辅助声音缓冲是循环的

    锁Lock 缓存 lpdsbuffer->lock

    写入数据,需长度

    解锁Unlock lpdsbuffer->Unlock

    释放 lpdsbuffer->Release

  播放声音

    播放缓冲区中的声音数据

      lpdsbuffer->play(0,0,DSBPLAY_LOOPING)

  停止播放

      lpdsbuffer->Stop

  控制音量

    SetVolume 非增大或减小增幅,而是播放的衰减

    配合宏 #define DSVOLUME_TO_DB(volume) ((DWORD)(-30*(100-volume)))

  调整频率

    SetFrequency 即改变音调

  调整声道平衡

    通过左右声道的调节(平移 Panning) 可做局部3D音效

    SetPan(LONG Pan)   0代表中间位置

  用DirectSound反馈信息

    GetCaps 大部分音频信息

    GetStatus 检查正在播放声音缓冲的状态

  从HDD读取声音数据

    DirectSound不支持声音文件的加载,需要自行编写

    读取.wav文件

  

  初始化DirectMusic

    是一个完全COM化组件,需自己COM库来创建COM对象

    因此每个应用程序仅仅需要DirectMusic

      dmksctrl.h

      dmusici.h

      dmusicc.h

      dmusicf.h

  初始化COM

    CoInitialize(NULL) 在任何直接COM调用之前写一次

  创建一个演奏对象,即DirectMusic对象

  调用完之后,dm_perf可以使用

  Init() 如果需要同时使用DirectSound和DirectMusic则需把pDirectSound传入,否则传NULL

  给演奏对象增加端口

    dm_perf->addPort(NULL)

  加载一个MIDI段

    IDirectMusicLoader* dm_loader = NULL

  加载MIDI文件

    DirectMusic称数据块chunk为段segments

  操作MIDI段

    播放MIDI段

    停止

    检查状态

    释放MIDI段

    关闭DirectMusic

  T3DLIB3库

    对DirectSound&DirectMusic API的封装


  本章总结:

            初步了解DirectSound,DirectMusic;

            了解制作(2D)游戏的每一件事情



第十一章_算法,数据结构,内存管理和多线程

  数据结构

    静态结构和数组

    链表

    树 (B树,二分查找树BST)

      3D场景建模,以数百颗树表示空间中的各个房间

      树结构构造二分空间解决渲染问题

  算法分析 

    算法好>>汇编,优化器

    算法分析技术(渐近分析Asymptotic Analysis),基于微积分

    !调用函数比直接绘图用时多,考虑宏或者内联

  递归 Recursion

    函数不能溢出堆栈,且要有终止条件

  优化理论

    内存对齐

  数学技巧

    游戏编程的实质上是数学问题

    位移 product = (n<<7)+(n<<9); //n*128+n*512=n*640

    一个大float数组清零:memset((void*)float_array, 0,0 sizeof(float)*num_floats)

    定点运算

  循环体展开

  查找表

  汇编语言


  多线程编程技术

    SMP(对称多处理,Symmetrical Multiprocessing)利用多处理器分担工作量

    多任务/抢先式操作系统(任何任务,进程,线程,都不能完全控制计算机)

    线程的所有变量都在属于自己的堆栈中创建

    结束线程

        向该线程发送消息通知其结束(√)

        使用内核级的调用强行结束该线程(×)

    在一个封闭的循环中,等待一个变量,会给多任务内核带来繁重的负担并严重占用CPU

  多线程和DirectX

  本章总结:

            数据结构,内存管理,递归,分析,定点数运算,多线程



第十二章_人工智能

  人工智能初步

    人工神经网络

    遗传算法

    模糊逻辑

  3D游戏里的东西长得很真实,但行动起来却很傻

  没有所谓的对错,只有是否有效

  

  确定性AI算法

    第一类AI —— 简单,可预知,可编程

  跟踪算法

    向量,比例缩放因子

  反跟踪·闪避算法

  模拟以及基本控制脚本编写

    [指令,操作数]格式编码

  条件逻辑处理的模式

  建模行为状态系统

  更多表现个性的行为

  用软件对记忆和学习进行建模

    AI由(状态机,条件逻辑,模式,随机数,概率分析)控制

  计划树和决策树

    编程语言对计划建模

  寻路 pathfinding

    试探路(Trial and Error)

    轮廓跟踪(Control Tracing)看起来蠢,没有走最短路径

    碰撞规避跟踪

    路点寻路 通常被采用,可是会增加人工

    寻找p1到p2路径,有很多算法可以做到。但没有一个是实时的


第十三章_基本物理建模

    质量

    时间,算法更多地与帧速率相关,而不是实际时间

    位置,不规则物→质心

    速率

    加速度

    力,力就是单位时间内动量的变化率

    动量,无论什么物体突然停止,例撞上什么的时候,这个物体会承受所有的力

    线性动量的物理性质:守恒与传递

    模拟万有引力效果

    模拟重力井 Gravity Well

    摩擦力

      μs 静态摩擦系数

      μk 动态摩擦系数

      摩擦力模型和重力模型很相似

    斜面上的摩擦力

    基本的特殊碰撞反应

      弹性碰撞 动量,动能守恒

      非弹性碰撞  不守恒

    计算任意方向上的平面碰撞反应

    矢量反射示例

    线段的交点

    简单运动学

        正向运动学

        方向运动学

    粒子系统

        一颗粒子的一般特征:位置,速度,颜色/动画,生命周期,重力,风力

        一个粒子系统:1,粒子数据结构

                      2,处理每个粒子的粒子引擎

                      3,产生特定粒子初始条件的函数

        水汽尾迹算法

        模拟爆炸效果

    基于帧的模拟与基于时间的模拟



第十四章_文字时代

第十五章_综合运用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值