PC Animation 播放器提供了一个简洁的二维、三维图形绘制引擎。动画文件使用该引擎实现场景绘制。动画的实际绘制工作由绘制引擎实现,动画文件中关注的主要是场景、动画的组织。
绘图引擎以课本线条插图为蓝本,只需要提供常见黑板手绘元素,不需要引入绘图能力更强的软件功能(如三维场景渲染)。例如:三维绘图,仅需要表达基本的三维透视关系,如下图所示:
图1 绘图示例
绘制接口提供的绘图功能包括以下几个方面:
一、当前绘图工具的选择。包括画笔、画刷、字体等等。
典型接口函数为:
//选择画笔,参数为笔类型,宽度,颜色,透明系数
void SelectPen(PenType nPenStyle, float fWidth, COLORREF crColor,BYTE nAlpha);
//选择字体,参数为字体名称,字体风格
void SelectFont(WCHAR * szFontName,FontType nStyle);
//选择文字颜色,参数为颜色值
void SelectTextColor(COLORREF clr);
//选择画刷,参数为颜色值,透明系数
void SelectSolidBrush(COLORREF crColor,BYTE nAlpha);
二、二维坐标系变换。
包括坐标系平移、缩放、旋转等。
典型接口函数为:
//平移变换, 参数为x,y轴偏移
void Transform2DOffset(const float& tx,const float & ty);
//放缩变换,参数为x,y轴缩放系数
void Transform2DZoom(const float & cx,const float& cy);
//旋转,参数为旋转角度
void Transform2DRotate(const float& angle);
//变换复位,复位到初始状态
void Transform2DReset();
三、二维坐标系下基本图形的绘制。
包括二维、三维直线、弧线、贝塞尔曲线、矩形、椭圆形等的绘制。
典型接口函数为:
//绘制线段、箭头,参数为起点、终点、箭头类型
void Draw2DLine(const C2DPoint &startPt,const C2DPoint &endPt,ArrowType arrow);
//绘制折线、箭头,参数为坐标点数组,点数,箭头类型
void Draw2DLines(const C2DPoint *pPoints,const int &nPtCount,ArrowType arrow);
//用MoveTo,LineTo连线方式绘制折线,参数为,点坐标,箭头类型
void MoveTo2D(const C2DPoint & pt);
void LineTo2D(const C2DPoint & pt,ArrowType arrowNone);
//绘制Bezier曲线,参数为控制点数组,控制点数目,箭头类型
void Draw2DBezier(const C2DPoint *pPoints,const int &nPtCount,ArrowType arrow);
//绘制多边形,参数为坐标点数组,点数目,填充开关
void Draw2DPolygon(const C2DPoint *pPoints,const int &nPtCount,bool fill);
//绘制矩形,参数为参考点,宽度,高度,绘制方式,填充开关
void Draw2DRectangle(const C2DPoint &pt,const float &width,const float &height,
RectPos pos,bool fill);
//椭圆,参数为参考点,宽度,高度,绘制方式,填充开关
void Draw2DEllipse(const C2DPoint &pt,const float &width,const float &height,
RectPos pos,bool fill);
//(椭圆)弧线,参数为参考点,长,宽,起始角,跨越角度,绘制方式
void Draw2DArc(const float &x,const float &y,const float &width,const float &height,const float &startAngle,const float &sweepAngle,RectPos pos=PosCenter);
//绘制文字,参数为坐标点,字符串,高度,绘制方式
void Draw2DText(const C2DPoint& point,WCHAR * string,const float &fHeight=18.0f,RectPos pos=PosLeftBottom);
四、三维坐标系变换
包括坐标系平移、缩放、旋转等。
典型接口函数为:
//设置透视视点,视点在物体坐标系中位置(x,y,z),投影屏距离视点的距离far
void Set3Dperspective(float x,float y,float z,float fartoscreen);
//平移变换,参数为x,y,z偏移量
void Transform3DOffset(const float& tx,const float & ty,const float& tz);
//放缩变换 base 基准点 cx,cy,cz变换倍数
void Transform3DZoom(const float& rx,const float & ry,const float &rz);
//旋转(x,y,z为轴向量)
void Transform3DRotate(float x,float y,float z,const float& angle);
//将变换矩阵复位
virtual void Transform3DReset();
五、三维基本图像绘制
典型接口函数为:
//绘制线段,参数为起点,终点,箭头类型
void Draw3DLine(const C3DPoint &startPt,const C3DPoint &endPt,ArrowType arrow);
//绘制折线,参数为三维坐标点数组,点数,箭头类型
void Draw3DLines(const C3DPoint *pPoints,const int &nPtCount,ArrowType arrow);
//用MoveTo,LineTo连线方式绘制折线,参数为,三维坐标点,箭头类型
void MoveTo3D(const C3DPoint & pt);
void LineTo3D(const C3DPoint & pt,ArrowType arrow);
//绘制多边形,参数为坐标点数组,点数,填充开关
void Draw3DPolygon(const C3DPoint *pPoints,const int &nPtCount,bool fill);
//绘制文字,参数为坐标点,字符串,高度,绘制方式
void Draw3DText(const C3DPoint& point,WCHAR * string,const float&fHeight,RectPos pos);
六、三维到二维之间的信息转换
典型接口函数为:
//三维坐标变换到二维坐标,可通过pDeep返回深度(可比较点的前后关系)
C2DPoint _3DToScenes(const C3DPoint& point3d,float *pDeep);
//将空间点处的长度映射成上屏幕长度(用于使绘制的二维对象有深度感)
float _3DLengthToScenes(const C3DPoint & point,float length);
七、位图操作
典型接口函数为:
//位图加载/卸载
BMPID LoadBitmap(HINSTANCE hInstance,UINT nResourceID);
void UnloadBitmap(BMPID nID);
//位图绘制,参数为坐标点,位图ID,绘制位置
void DrawBitmap(const C2DPoint &pt,
BMPID nBmpID,RectPos pos);
//位图缩放绘制,参数为坐标点,位图ID,宽度,高度,绘制位置
void DrawBitmap(const C2DPoint &pt,
const float &width,const float &height,
BMPID nBmpID,RectPos pos=PosLeftBottom);
八、表达式绘制
绘图引擎中定义了表达式描述脚本语言,场景文件中可通过该语言绘制包含上下标、分式、矢量等等形式的符号、公式。
图2 表达式示例
为描述表达式,定义了一种类XML语法。表达式分解为若干"块","块”可嵌套。
典型接口函数为:
//绘制表达式,
参数为二维坐标点,表达式脚本,高度,绘制位置
void Draw2DNotation(const C2DPoint & point,WCHAR * szNotation,const float &fHeight,RectPos pos);
//绘制表达式,参数为三维坐标点,表达式脚本,高度,绘制位置
void Draw3DNotation(const C3DPoint & point,WCHAR * szNotation,const float &fHeight,RectPos pos);
九、扩展二维、三维图形的绘制
矢量箭头、含标识的箭头、斜线标识的线段等等教学课程中常用的图形符号。
典型接口函数为:
//二维坐标系中画带标注箭头(标注位置可选择)
,参数为起点,终点,表达式脚本,标注位置,箭头类型,表达式高度,表达式位置偏移量
void Draw2DLineWithNotation(
const C2DPoint & startPt,const C2DPoint & endPt,WCHAR * szNotation,NotationPos pos,ArrowType arrow,const float &fHeight,const float &fFar);
//三维坐标系中画带标注箭头(标注位置可选择)
,参数为起点,终点,表达式脚本,标注位置,箭头类型,表达式高度,表达式位置偏移量
void Draw3DLineWithNotation(const C3DPoint &startPt,const C3DPoint &endPt,WCHAR * szNotation,NotationPos pos,ArrowType arrow,const float &fHeight,const float &fFar);
//二维坐标系中描点,注表达式
,参数为坐标点,半径,颜色,表达式脚本,高度,绘制点偏移
void Draw2DDotWithNotation(
const C2DPoint &pt,const float &radius,COLORREF clr,WCHAR * szNotation,const float &fHeight,const float &fOffsetX,const float &fOffsetY);
//三维坐标系中描点,注表达式
,参数为坐标点,半径,颜色,表达式脚本,高度,绘制点偏移
void Draw3DDotWithNotation(const C3DPoint &pt,const float &radius,COLORREF clr,WCHAR * szNotation,const float &fHeight,const float &fOffsetX,const float &fOffsetY);
十、绘制弹簧、墙壁等常见图元素
图3 物理绘图元素示例
典型接口函数为:
//绘制弹簧,参数为起点、终点,宽度,圈数
void DrawSpring(
const C2DPoint &startPt,const C2DPoint &endPt,const float &fRadius,const int &nRing);
//绘制墙壁(带斜线标识的直线)
,参数为,起点,终点,斜线间距,斜线方向
void DrawWallLine(
const C2DPoint &startPt,const C2DPoint &endPt,const float &biasSpan,int nOrient);