使用C语言实现二维,三维绘图算法(1)-透视投影
2013-11-15 14:53
411 查看
使用C语言实现二维,三维绘图算法(1)-透视投影
---- 引言----
每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想, Win32中既然存在画线画点函数, 利用计算机图形学的知识, 我们用可以用纯C调用Win32实现三维绘图, 完全不用借助OpenGL和DirectX, 这有重复造轮子的嫌疑, 但是自己动手实现一遍, 毕竟也是有意义的.
[效果演示]
线框效果, 隐藏面采用虚线
颜色填充后效果
[透视投影理论]
分析:假定投影中心在Z轴上(z=-d处),投影面在xoy面上,与z轴垂直,d为投影面与=投影中心的距离。现求空间一点p(x, y, z)的透视投影p'(x', y', z')点的坐标。
根据相似三角形对应边成比例关系有:
写成矩阵形式如下:
透视缩小效应:物体的透视投影的大小与物体到投影中心的Z方向距离成反比。
特点:透视投影的深度感更强,更加具有真实感,但透视投影不能够准确反映物体的大小和形状。
(1)透视投影的大小与物体到投影中心的距离有关。
(2)一组平行线若平行于投影平面时,它们的透视投影仍然保持平行。
(3)只有当物体表面平行于投影平面时,该表面上的角度在透视投影中才能被保持。
灭点:透视投影中不平行于投影面的平行线的投影会汇聚到一个点,这个点称为灭点(Vanishing Point)。
坐标轴方向的平行线在投影面上形成的灭点称作主灭点。 透视投影可以按照主灭点的个数分类:
(1)一点透视有一个主灭点,即投影面与一个坐标轴正交,与另外两个坐标轴平行。
(2)二点透视有两个主灭点,即投影面与两个坐标轴相交,与另一个坐标轴平行。
(2)三点透视有三个主灭点,即投影面与三个坐标轴都相交。
[编程实现要点]
计算三维投影点的函数
逐个画出各个侧面, 并进行消隐形探测
---- 引言----
每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想, Win32中既然存在画线画点函数, 利用计算机图形学的知识, 我们用可以用纯C调用Win32实现三维绘图, 完全不用借助OpenGL和DirectX, 这有重复造轮子的嫌疑, 但是自己动手实现一遍, 毕竟也是有意义的.
[效果演示]
线框效果, 隐藏面采用虚线
颜色填充后效果
[透视投影理论]
分析:假定投影中心在Z轴上(z=-d处),投影面在xoy面上,与z轴垂直,d为投影面与=投影中心的距离。现求空间一点p(x, y, z)的透视投影p'(x', y', z')点的坐标。
根据相似三角形对应边成比例关系有:
写成矩阵形式如下:
透视缩小效应:物体的透视投影的大小与物体到投影中心的Z方向距离成反比。
特点:透视投影的深度感更强,更加具有真实感,但透视投影不能够准确反映物体的大小和形状。
(1)透视投影的大小与物体到投影中心的距离有关。
(2)一组平行线若平行于投影平面时,它们的透视投影仍然保持平行。
(3)只有当物体表面平行于投影平面时,该表面上的角度在透视投影中才能被保持。
灭点:透视投影中不平行于投影面的平行线的投影会汇聚到一个点,这个点称为灭点(Vanishing Point)。
坐标轴方向的平行线在投影面上形成的灭点称作主灭点。 透视投影可以按照主灭点的个数分类:
(1)一点透视有一个主灭点,即投影面与一个坐标轴正交,与另外两个坐标轴平行。
(2)二点透视有两个主灭点,即投影面与两个坐标轴相交,与另一个坐标轴平行。
(2)三点透视有三个主灭点,即投影面与三个坐标轴都相交。
[编程实现要点]
计算三维投影点的函数
void Calc3DPoint(void) { x = (-1)*x; xa = cr1*x - sr1*z; za = sr1*x + cr1*z; x = cr2*xa + sr2*y; ya = cr2*y - sr2*xa; z = cr3*za - sr3*ya; y = sr3*za + cr3*ya; x=x+mx; y=y+my; z=z+mz; sx = d*x/z; sy = d*y/z; return; }
逐个画出各个侧面, 并进行消隐形探测
... surface1: x1=B1[6][0]; y01=B1[6][1]; z1=B1[6][2]; x2=B1[5][0]; y2=B1[5][1]; z2=B1[5][2]; x3=B1[4][0]; y3=B1[4][1]; z3=B1[4][2]; VisibilityTest(); if(sp>0) goto surface2; sx1=B2[6][0]; sy1=B2[6][1]; sx2=B2[5][0]; sy2=B2[5][1]; sx3=B2[4][0]; sy3=B2[4][1]; sx4=B2[7][0]; sy4=B2[7][1]; sx5=B3[1][0]; sy5=B3[1][1]; DrawPoly(); surface2: x1=B1[3][0]; y01=B1[3][1]; z1=B1[3][2]; x2=B1[2][0]; y2=B1[2][1]; z2=B1[2][2]; x3=B1[5][0]; y3=B1[5][1]; z3=B1[5][2]; VisibilityTest(); if(sp>0) goto surface3; sx1=B2[3][0]; sy1=B2[3][1]; sx2=B2[2][0]; sy2=B2[2][1]; sx3=B2[5][0]; sy3=B2[5][1]; sx4=B2[6][0]; sy4=B2[6][1]; sx5=B3[2][0]; sy5=B3[2][1]; DrawPoly(); ...
相关文章推荐
- 使用C语言实现二维,三维绘图算法(1)-透视投影
- 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
- 使用C语言实现二维,三维绘图算法(3)-简单的二维分形
- 使用C语言实现二维,三维绘图算法(3)-简单的二维分形
- 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
- 算法学习入门之使用C语言实现各大基本的排序算法
- Windows环境是使用C语言计算程序或算法执行时间的不同粒度实现
- 使用C语言实现串的匹配朴素算法(BF算法)
- android实现使用绘图作出一种裁剪任意多边形快速算法 (转自 cafelette)
- 二维、结构网格单相流SIMPLE 算法的C语言实现
- poj算法-使用C语言在VC++6.0实现poj1753(递归枚举)
- 已知三点坐标求外接圆方程和RANSAC算法的介绍,用C语言实现,其使用随机抽样一致性算法来求最合适圆时使用
- 数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法
- 使用自制绘图实现viewpager无限轮播的小圆点
- 如何使用c语言实现双向链表的插入删除操作
- 算法--实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。(详细讲解)
- Linux下使用socket传输文件的C语言简单实现
- Java入门学习-使用Math,实现lg、平方、开方、round、floor、ceil的算法。
- c语言实现输出二维蛇形矩阵
- Sunday 算法的 O-C语言实现