---- 引言----
每次使用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;
}
逐个画出各个侧面, 并进行消隐形探测
...
surface0:
x1=B1[7][0]; y01=B1[7][1]; z1=B1[7][2];
x2=B1[0][0]; y2=B1[0][1]; z2=B1[0][2];
x3=B1[3][0]; y3=B1[3][1]; z3=B1[3][2];
VisibilityTest();
if(sp>0) goto surface1;
sx1=B2[7][0]; sy1=B2[7][1];
sx2=B2[0][0]; sy2=B2[0][1];
sx3=B2[3][0]; sy3=B2[3][1];
sx4=B2[6][0]; sy4=B2[6][1];
sx5=B3[0][0]; sy5=B3[0][1];
DrawPoly();
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();
....
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
二维卷积运算之C语言实现二维卷积运算之C语言实现 二维卷积运算之C语言实现二维卷积运算之C语言实现
用C语言实现SHA-1算法 用C语言实现SHA-1算法 用C语言实现SHA-1算法用C语言实现SHA-1算法 用C语言实现SHA-1算法
比较简单的一种实现方式,算法容易理解,关键在数据结构的设计。
典型密码算法及其C语言实现共13章节,详细讲述了一些典型密码算法的算法原理及C语言实现。密码算法包括:序列密码、分组密码、公钥密码和Hash算法。其中序列密码有祖冲之算法,分组密码有DES、3DES和SMS4算法,公钥...
算法C语言实现(第1-4部分)
主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
适合计算机辅助工程作业,有指导性和参考价值,可以根据自己的要求作出对应的修改
经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现经典算法 C语言实现
c语言 三维线性插值 简单明了,与matlab对比一致 。。。。。。。。。。。。
c语言常用算法-----列举C语言各种常用算法,详尽。对编程大有裨益!
C语言-二维数组two-dimensional-array-master.zip
使用c语言是实现的LRU算法,带测试用例,供大家学习参考使用
sha 算法c语言实现,编译成功,在nrf52832上验证的 。。
RAS加密算法的----——————-C语言实现
算法:C语言实现(第1-4部分)
算法:C语言实现(第1~4部分)答案。
C语言实现prim算法
c语言编写的DH算法,借鉴学习 A系统构建密钥:构建一对公私密钥Private Key1和Public Key1; A系统向B系统公布自己的公钥(Public Key1); B系统使用A公布的公钥(Public Key1)建立一对密钥:Private Key2和...
C语言实现多级反馈队列调度算法-计算机操作系统实验。C语言实现多级反馈队列调度算法-计算机操作系统实验。
算法:C语言实现算法:C语言实现算法:C语言实现算法:C语言实现