Graphics
文章平均质量分 95
cppyin
这个作者很懒,什么都没留下…
展开
-
32BPP窗口模式下24位位图的像素操作(1)
刚学习了几天DirectDraw,书中作者示例多是8位调色板的全屏程序,而且是读取8位位图,可以很方便的使用SetDisplayMode来改变显示模式,按字节写入像素。而在窗口模式中,现在普遍的32BPP和使用24位位图就没有那么方便了,而且书中没有很完整的示例。使用窗口模式的DirectDraw主要有以下几个问题:1.24位位图的像素格式到32位像素格式的转换2.不能使用Flip,需要使用Blt从离屏表面来复制到主显示表面。3.确定真正的用户窗口。4.剪裁。后3个问题书中给了很好的示例,但是对于第1点,像原创 2010-12-27 22:41:00 · 4234 阅读 · 2 评论 -
从零实现3D图像引擎:(12)构建支持欧拉和UVN的相机系统
<br />1. 相机需要哪些参数<br />先看下图了解一下上次我们建立的相机在3D世界中的意义:<br /><br />如Hello3DWorld中介绍的,在相机坐标系下,相机朝向正Z轴,相机有视野角度,因为视野角度,形成了上图的视锥体,视平面就是要被透视投影到的2D平面。<br /> <br />在这幅图里增加了近裁剪面与远裁剪面。他们是做什么的呢?在现实中,我们会发现,离眼睛太远的东西我们就看不到了,离眼睛太近的东西又会挡住大部分景色。于是就定义了远裁剪面和近裁剪面——比近裁剪面还近的物体和比远裁剪原创 2011-02-21 22:02:00 · 13522 阅读 · 24 评论 -
从零实现3D图像引擎:(13)把宽高比、透视投影矩阵、屏幕变换矩阵说透
<br />1. 问题的引出<br />这个问题的引出又是因为《3D游戏编程大师技巧》这书里面有的问题没讲明白,有的东西又不对。<br />首先宽高比这个名词的出现是因为我们的PC屏幕不是正方形的,屏幕宽度 : 屏幕高度 就是宽高比。但是我们上次搭建的相机系统的视平面是正方形的,那么当很多物体投影到视平面上后,必然最后完成的是一幅正方形的画,而屏幕是长方形的,这时只有两种办法:<br />1) 把照片压扁,这样画上的所有物体都被压扁了。<br />2) 把照片上下多余的两条分别裁下来,只保留屏幕大小的画,这原创 2011-02-23 16:58:00 · 8653 阅读 · 8 评论 -
从零实现3D图像引擎:(15)三角形的光栅化
<br />1. 为什么要光栅化一个三角形<br />我们不能总让我们的引擎显示线框,要支持实心颜色、光照还有纹理贴图,这些都需要光栅化一个三角形作为支持。<br /> <br /> <br />2. 三角形的类型<br />为了方便光栅化,一般将三角形分为以下4种:<br /><br /> <br /> <br /> <br />3. 平底三角形光栅化<br />先上图:<br /><br />光栅化平底三角形的原理很简单,就是从上往下画横线。在图里我们取任意的一条光栅化直线,这条直线左边的端点x值为XL原创 2011-03-08 20:15:00 · 21161 阅读 · 7 评论 -
从零实现3D图像引擎:(10)Hello3DWorld
<br />1. 数学分析<br />前面我们已经把预先想到的可能会用到的数学工具都封装好了,从这篇开始,应该很少出现一大篇都是数学推导的了,终于看见光明了,这次我们将开始第一个3D程序的编写,所以题目就叫Hello3DWorld吧。<br /> <br />0) 3D程序的本质<br />很多书都会先介绍“3D流水线”的词,但其实明白3D程序的人一下子就知道这是什么,而不了解的人看了这个词也没有意义。其实我也觉得没什么特殊意义,因为所有计算机程序都是一个一个流程执行下来的,不全都是某某流水线么。简单来说,原创 2011-02-17 14:35:00 · 8732 阅读 · 4 评论 -
从零实现3D图像引擎:(9)四元数函数库
<br />1. 数学分析<br />1) 四元数是什么东西?<br />这个东西算盘、矩阵、复数是一类东西,即数学工具,数学家们创造了这个东西来解决一些数学问题。其实四元数是一种超复数,他不是只有一个虚数的复数,而是有三个虚数的复数。我们先回顾一下复数吧。<br /> <br />2) 虚数的来源<br />实数集中没有-1的平方根,因为没有哪个实数的平方等于-1,所以数学家们就创造它——虚数i,并且定义了i * i = -1。<br />所以我们可以计算sqrt(-4)了,sqrt(-4) = 2*i<原创 2011-02-10 21:24:00 · 9500 阅读 · 19 评论 -
从零实现3D图像引擎:(8)参数化直线与3D平面函数库
<br />1. 数学分析<br />1) 参数化直线<br />还记得我们在学习向量时介绍的位移向量吗?参数化直线的原理和他相同。其实所谓参数化直线,就是通过一个参数t来表示直线上的一个线段,当t为0时,则取线段的一端的端点,当t取1时,则取到另一端的端点。如图:<br /><br />核心原理就是向量加法的几何意义,Vd是加数,通过t(从0到1)去乘以这个Vd,则可以描述向量p,而p在某个t时的坐标值,就是从点P1到点P2的线段在t时的坐标值。注意这里我们使用的是图中的p = p1 + t * vd,这原创 2011-02-10 15:46:00 · 7194 阅读 · 6 评论 -
从零实现3D图像引擎:(7)矩阵函数库
<br />1. 数学分析<br />1) 矩阵到底是什么,用它来干嘛?<br /> 千万不要把矩阵想复杂了,说白了,他和算盘是一类东西,矩阵根本就没有实际意义,他就是个数学工具而已,就好像敲算盘,珠子上上下下的按照一定的规律去拨弄,就能得到结果一样,矩阵是数学家们发明的一个工具,这个工具也有一系列规则,通过这些规则也可以计算出一些结果,只不过他不像算盘是用来做数字加减乘除用的,他是用来求解方程组的。学习完了矩阵的运算规则,就可以发现,所有对向量、点坐标的变换都可以通过矩阵运算来完成,这也是为什么3D图像的原创 2011-02-09 16:35:00 · 5956 阅读 · 4 评论 -
从零实现3D图像引擎:(6)向量函数库
1. 数学分析1) 基本定义:向量由多个分量组成,2D/3D向量表示一条有向线段。下面的ux,uy就是两个分量。向量u = ,如果从点P1(x1, y1)指向点P2(x2, y2),则:U = p2 - p1 = (x2-x1, y2-y1) = 向量被定义后,总是相对于原点的,所以可以用一个点来表示从原点指向该点的向量。2) 向量的范数(norm)范数就是向量长度,是从原点到终点的距离。用|u|表示,所以:|U| = sqrt(Ux2 + Uy2)|U| = sqrt(Ux2 + Uy2 + Uz2)3)原创 2011-02-07 22:46:00 · 8766 阅读 · 3 评论 -
从零实现3D图像引擎:(5)3D坐标系函数库
1. 数学分析1) 2D笛卡尔坐标系与2D极坐标系2D笛卡尔坐标系就是平面直角坐标系,不说了。2D极坐标系,是用方向和距离来定义2D空间中的点,而非x,y坐标,如下图:其中极坐标的参数用红色表示,笛卡尔坐标的参数用蓝色字表示。非常显而易见,他们之间的转换关系如下:x = r * cos(theta)y = r * sin(theta)r = sqrt(x2 + y2)theta = arctg(y/x)2) 3D笛卡尔坐标系在2D笛卡尔坐标系上增加了Z轴,形成3D笛卡尔坐标系。分为左手坐标系和右手坐标系。区原创 2011-02-07 15:47:00 · 6871 阅读 · 3 评论 -
从零实现3D图像引擎:(4)三角函数库
3D图形中常用的三角函数库原创 2011-02-04 16:40:00 · 21715 阅读 · 28 评论 -
从零实现3D图像引擎:(3)超级重要的2D矩形裁剪
1. 数学分析为什么我们要画2D直线,要做2D的直线-矩形裁剪?原因很简单,无论游戏世界是2D的还是3D的,最终都要投影到玩家的屏幕上,3D的东西最终要是要投影到视平面上。所以3D游戏仍然有很多东西要在2D视平面上做。对于3D游戏的裁剪就有两种方法:一是在3D空间做裁剪,利用视域体的各个面与三角形中直线的关系来做,这叫做立方体空间裁剪;另一种是,把3D物体先投影在2D视平面上,然后在视平面上对2D直线做矩形裁剪,叫作图像空间裁剪。三角形都是由直线组成的,屏幕是矩形的,所以用矩形裁剪一条直线是非常重要的,而且原创 2011-02-04 13:00:00 · 11796 阅读 · 6 评论 -
从零实现3D图像引擎:(2)画2D直线不简单
<br />1. 数学分析<br />1) 画直线的问题<br />本来我以为画直线会很容易,随便拿个直线公式,遍历X求Y画出来不就完了么,但事实并非如此。以2D直线为例,因为3D直线也只是多引入了个Z坐标而已。关键的问题:我们在数学中所学的直线是基于实数域的,而在计算机屏幕上,所画的直线是基于正整数域的,可以想象这么一个情形,在直线的某一点X=1,Y=0.01时,在屏幕上如何画呢?下图对比了实数域的直线,与基于正整数域的直线:<br /><br />为什么直线在正整数域是不连续的呢,还记得斜率的的定义么:原创 2011-02-03 16:20:00 · 12651 阅读 · 7 评论 -
从零实现3D图像引擎:(1)环境配置与项目框架
<br />0. 要学懂3D程序设计,必然要精通3D相关的线性代数、3D几何、复分析等相关知识,我也因为如此才开始这个博客系列的写作,不自己实现,就不是自己的东西,从今天开始,将会把所学的数学知识,从数学推导到代码实现的心得全部记录于此。最终得到一个独立的3D图像引擎,也就完成了对3D图像知识的基本学习。<br /> <br />1. 文章布局。除了本文,所有文章都将由3部分组成。<br />1) 数学理论推导。<br />2) 不参看任何示例,只根据数学原理进行的代码实现。<br />3) 项目代码下载。原创 2011-02-01 23:30:00 · 10910 阅读 · 6 评论 -
从零实现3D图像引擎:(14)背面消隐的三大陷阱
<br />1. 为什么要背面消隐<br />通过之前的DEMO,能够知道如果在渲染过程中多边形越多,那么要不处理的内容就越多,就越消费计算机的处理能力。对于物体来说,一般我们只看到它面对我们的面,可能不是正对着,但是肯定有很多面是完全背对我们的,我们就应该在渲染时跳过他们。这将减少大约一半的三角形渲染量。原理其实很简单,就是向量与平面的关系,这个原理我在参数化直线与平面的那篇文章中特意推导了整个来龙去脉。<br />我喜欢在2D俯视图中来分析问题,如下图:<br /><br /> <br /> <br /原创 2011-02-25 11:48:00 · 13004 阅读 · 10 评论 -
32BPP窗口模式下24位位图的像素操作(2)
等测距卷轴的逻辑写的差不多了,结果发现之前写的位图至显示表面的代码有些问题,所以重写了一个函数,给定一个表面,基于表面的尺寸和传入的坐标,直接在BITMAP24_PTR上取图,取图后的表面直接就可用,先给出完整代码:int PickBitmap(LPDIRECTDRAWSURFACE7 lpdds, BITMAP24_PTR bitmap, LONG ddsWidth, LONG ddsHeight, LONG cx, LONG cy){ LONG bitmapWidth = bitmap->inf原创 2011-01-02 22:51:00 · 1886 阅读 · 0 评论 -
从零实现3D图像引擎:(11)讲解3D变换矩阵的推导
1. 数学分析上一篇中间在做旋转的时候我直接用了旋转变换矩阵,当时觉得很尴尬,因为之前没说过是怎么产生的该矩阵。 1) 矩阵和向量的微妙关系如果您还记得向量加法的几何意义,那么不难看懂下面的等式: [x] [x] [0] [0] [1] [0] [0]v = [y] = [0] + [y]原创 2011-02-18 12:36:00 · 14764 阅读 · 23 评论