
计算机图形学基础
文章平均质量分 54
_寒江雪_
这个作者很懒,什么都没留下…
展开
-
【寒江雪】UV+Depth信息计算世界坐标
最近要实现Depth反计算世界坐标的效果,于是看了其他网友的博客,实现如下 float d = texture(depthStencilTexture,TexCoords).r; vec4 NDC = vec4(TexCoords.x*2.0 - 1.0, TexCoords.y*2.0 - 1.0, d*2.0 - 1, 1.0); vec4 worldPos = inv_view * i...原创 2019-10-20 01:59:42 · 566 阅读 · 0 评论 -
【寒江雪】两异面直线之间的距离
两异面直线之间的距离 两异面直线之间的距离的计算方法,根据两异面直线的公垂线的方向向量,和直线上任意两点组成的方向向量来计算距离。 假设两直线分别为p1=t1a1→+b1p1=t1a1→+b1p_1=t_1\vec{a_1}+b_1,p2=t2a2→+b2p2=t2a2→+b2p_2 = t_2\vec{a_2}+b_2 两直线的公垂线的方向向量即为n⃗ =a1→×a2...原创 2018-07-24 23:44:47 · 3293 阅读 · 0 评论 -
【寒江雪】直线的表示
直线的表示 在一个平面中,两点确定一条直线,通过高中的知识,可以根据两点计算直线的斜率,以y=kx+b的形式表示直线,但是为了更好地在计算机中表示直线,可以通过两点来表示一条直线。 要表示一条直线,原理无非是表示直线上的点集。y=kx+b表示的就是直线点集中的纵坐标与横坐标之间的关系。 撇开表达式表示法,用向量来表示一条直线,可以表示成p=at+b。这里a和b就是两个...原创 2018-07-13 21:45:07 · 957 阅读 · 0 评论 -
【寒江雪】圆与胶囊型物体的碰撞检测
圆与胶囊型物体的碰撞检测 本文主要讲述平面中一个,圆与胶囊型物体的碰撞检测的一种算法。 圆形由圆心+半径表示。 胶囊型物体的两端是两个半圆,中间部分是一个矩形。所以胶囊型物体的表示由两个圆心+半径来表示。 要对这两种图形做碰撞检测,就要涉及到圆心到胶囊型物体的最短距离的计算。这时候就要用到点到线段的最短距离的计算方法。 计算出最小距离的平方D^2。然后根据D^2...原创 2018-07-20 01:43:54 · 1253 阅读 · 1 评论 -
【寒江雪】空间内两直线相交
空间内两直线相交 在三维空间内,两直线相交公式的推导。整个推导过程假设两直线一定相交。 设空间内有直线l1,l2l1,l2l_1,l_2相交于点pppl1=t1a1→+b1l1=t1a1→+b1l_1 = t_1\vec{a_1}+b_1 l2=t2a2→+b2l2=t2a2→+b2l_2 = t_2\vec{a_2}+b_2 p=t2a2→+b2p=t2a2→+b2p = t_...原创 2018-07-26 00:27:54 · 6848 阅读 · 0 评论 -
【寒江雪】空间中的点线和面
空间中的点线和面 在三维空间中,最基本的元素莫过于基本的点,线和面。 他们之间的关系,可以这样理解,点按着一定的方向平移可以得到直线,线按照一定的方向平移可以得到平面,这个结论想象一下就可以理解了。 可是要在数理逻辑上来表示这些元素,就需要根据一定的公理,定理来确定了。表示空间中任意一个点 在三维空间中,要表示任意一个点可以使用三维坐标来表示点的位置信息。 ...原创 2018-07-21 18:37:24 · 1388 阅读 · 1 评论 -
【寒江雪】点面距离的计算
点面距离的计算 空间中一个平面可以用三个点来表示,那么计算空间中一个点到平面的距离其实也相当简单。 直接上推导过程 假设平面内任意一点O(x0,y0,z0)(x0,y0,z0)(x_0,y_0,z_0) 基向量 a⃗ a→\vec{a}(ax,ay,az)(ax,ay,az)(a_x,a_y,a_z) 和 b⃗ b→\vec{b}(bx,by,bz)(bx,...原创 2018-07-21 19:49:04 · 2712 阅读 · 0 评论 -
【寒江雪】判断空间中两直线的位置
判断空间中两直线的位置 假设空间中有两直线l1,l2l1,l2l_1,l_2 其中l1=t1a1→+b1l1=t1a1→+b1l_1 = t_1\vec{a_1}+b_1,l2=t2a2→+b2l2=t2a2→+b2l_2 = t_2\vec{a_2} + b_2 两直线在空间中的位置关系,有异面,平行和相交。通过以下几个步骤判断他们的位置关系作向量c⃗ =b1−...原创 2018-07-26 22:14:42 · 3548 阅读 · 0 评论 -
【寒江雪】计算直线与平面的交点坐标
计算直线与平面的交点坐标 直线与平面交点坐标的计算公式推导 直线l=p+a⃗ tl=p+a→tl = p + \vec{a}t 取平面内一点s,法向量n⃗ n→\vec{n} 则由ps→cos<ps→,n⃗ >=ps→⋅n⃗ ps→cos<ps→,n→>=ps→⋅n→\vec{ps}\cos = \vec{ps}\cd...原创 2018-07-27 13:02:42 · 6429 阅读 · 0 评论 -
【寒江雪】计算两个面的交线
计算两个面的交线 空间中两个平面要么相交要么平行,相交平面得到的是一条直线。 根据之前的博文有讲述,空间中不共线三点确定一个平面。那么已知两个平面,且两平面相交,应该如何去计算两平面之间的交线呢? 思路分析:如果两平面相交,获得一条直线,那么该直线就同时属于两个平面。那么该直线会同时垂直于两个平面的法线。那么两个平面的法向量的外积,就可以计算出交线的方向。这时候还需要计算交线上一...原创 2018-07-27 13:06:17 · 25827 阅读 · 2 评论 -
【寒江雪】判断一个点是否在网格内
判断一个点是否在多边形网格内 根据前几天看到的博客——《判断一个点是否在多边形内》——突发奇想,设计一个算法判断一个点是否在多面体网格内。 这里假设该网格物体都是由许多个三角面构成的,同时假设该网格物体是封闭的。 那么要判断一个点是否在网格内,就由该点朝某个坐标轴方向发射一条射线(也就是构造一条射线)。 如果该射线穿入的三角形面数与穿出的三角形面数之和为奇数,那么可以确定该...原创 2018-07-24 19:15:38 · 2737 阅读 · 7 评论 -
【寒江雪】平面内点坐标的分解
平面内点坐标的分解 看题目有点绕,但其实要做的事情很简单。 假设一个平面,由不共线三点OAB构成。设OA→=i⃗ OA→=i→\vec{OA} = \vec{i},OB→=j⃗ OB→=j→\vec{OB} = \vec{j} 则平面内任意一点P=O+αi⃗ +βj⃗ P=O+αi→+βj→P = O + \alpha\vec{i} + \...原创 2018-07-24 11:55:46 · 450 阅读 · 0 评论 -
【寒江雪】圆与扇形物体的碰撞检测
圆与扇形物体的碰撞检测 扇形物体包括一个圆心和两个端点,两个端点在扇形物体的弧上。可以用三点+半径来表示一个扇形,或者也可以用三点来表示一个扇形。 要对圆与扇形物体做碰撞检测,先来分析圆与扇形物体的位置关系。 圆心可能的位置有两种:在扇形物体的扇面朝向的方位不在扇形物体的扇面朝向的方位 这两种情况的判断方法是有区别的。 对于第一种情况,直接根据圆...原创 2018-07-17 16:24:32 · 2172 阅读 · 3 评论 -
【寒江雪】中点画圆法
圆的特征每一个圆都拥有一个圆心(x,y)和半径R。一个圆如果位于原点,则有四条对称轴x=0.y=0.x=y,x=-y;这样,利用圆上任意一点,可以画出其他7个点。这种性质称为圆的八分性质 显示圆弧上八个对称点的算法如下:Void CirclePoints(int x,int y,int color){ DrawPixel(x,y,color);DrawPixel原创 2016-11-16 23:55:19 · 1257 阅读 · 0 评论 -
【寒江雪】中点画椭圆算法
中点画椭圆算法与中点画圆算法非常类似但是其中有区别的地方就是,椭圆不是八对称的。不能像圆那样扫描八分之一就可以绘制出整个圆。所以,必须要考虑在扫描四分之一椭圆的过程中,遇到斜率为-1的切线。如下图因此要绘制椭圆,就要把椭圆分成上部区域和下部区域先考虑椭圆的曲线方程x^2/a^2+y^2/b^2=1记F(x,y)=b^2*x^2+a^2*y转载 2016-11-16 23:58:07 · 1773 阅读 · 0 评论 -
【寒江雪】扫描线区域填充算法
多边形可以用多个点进行描述。假定点是按逆时针排序给出的。这样一来要填充由这些点所围区域,就需要扫描这一区域内点的点。如果我们知道区域内的所有顶点,显然,我们可以直接对点着色。但这样的输入就显得不太方便了。倘若我们以数学武装起来,可以把不方便变为方便,把繁琐的事化简,那就是世界上再美妙不过的事了。现在我们得到的输入只有按逆时针排序的顶点。我们把点连成线,再以y轴为扫描线,自底相上求交原创 2016-11-17 00:06:48 · 557 阅读 · 0 评论 -
【寒江雪】边界标志算法
边界标志算法对多边形的每条边进行扫描并对该像素打上标志。然后再利用扫描线扫描该多边形,对于与多边形相交的扫描线依从左到右的顺序,逐个访问该扫描线上的像素。使用一个布尔值量inside来表示当前点是否在多边形内。Inside的初值为假,每当当前访问的像素是被打上边标志的点时,就把inside取反。对未标志的像素,inside不变。若访问当前像素时,inside为真,说明该像素在多边形内,则把该像素置原创 2016-11-17 00:08:32 · 3923 阅读 · 0 评论 -
【寒江雪】区域填充算法递归实现
区域填充算法分为按内点填充和按边界填充该算法假设区域内有一个像素已知。由此像素出发,利用连通性找到其他像素。连通性可以是四连通(上下左右方向)和八连通(上下左右,对角线),在搜索的过程中对每一个方向进行尝试按边界填充需要先把多边形的边进行标记。之后再调用算法进行填充。整个算法的过程和DFS(深度优先搜索)的思想是一模一样的。代码如下:VOIDCG原创 2016-11-17 00:09:47 · 710 阅读 · 0 评论 -
【寒江雪】区域填充算法——扫描线
区域填充递归算法已经领教过了。内存消耗大,时间效率低,经典的深搜思想。为了解决这个问题,于是有人提出了种子填充扫描线算法。其实就是深搜不行,换宽搜(BFS)该算法假设已知其中一个像素点,然后从这个像素点出发,去寻找周围可以着色的点。这个已知点,我们称其为种子点。每一轮着色之后,记录下着色的区间大小,并对该区间上方和下方的扫描线进行扫描,观察能否对其进行着色,如果能,则把种子原创 2016-11-17 00:11:36 · 656 阅读 · 0 评论 -
【寒江雪】直线裁切算法
Cohen-Sutherland直线裁切算法当一条直线横跨在平面内时,它的端点与裁切矩形的位置关系可以有9种情况。也就是说,矩形把平面分成了9个区域,端点可能分布在这九个区域中的一个ABCDEFGHI原创 2016-11-17 00:12:40 · 430 阅读 · 0 评论 -
【寒江雪】凸多边形矩形裁切算法
最近都在准备着考试,没有写博客,今天忙里偷闲,写点关于裁切算法的文字。这次要干的事情是给定一个凸多边形的点描述和矩形的点描述,按着矩形来对多边形区域进行裁切。大概如下图所示:蓝色矩形是裁剪框,相当于Photoshop里的选区,红色多边形是图像,裁剪后在红色以外的部分被剪掉,相交边用橙色线条表示。(注意:这里是按区域裁切,不是对线条裁切); 那么我原创 2016-11-17 00:14:33 · 1831 阅读 · 0 评论 -
【寒江雪】点到直线的最短距离
点到直线的最短距离 根据直线的表示方式p = at + b,可以设一个点P(px,py),任意一点A(x0,y0)到点P的距离可以根据两点间距离公式求出。 D^2 = (px-x0)^2+(py-y0)^2 = (axt+bx-x0)^2+(ayt+by-y0)^2 = (ax^2+ay^2)t^2 + 2{ax(bx-x0)+ay(by-x0)}t+(...原创 2018-07-17 16:21:11 · 5153 阅读 · 0 评论 -
【寒江雪】计算机图形学直线算法
DDA Algorithm由于计算机在绘制直线时,需要计算每一个点的纵坐标y的值,由y=kx+b可以枚举x计算y的值得直线上的离散的点。Y0=kx0+bY1=kx1+b=k(x0+1)+bY1-y0=k由此可转换为迭代式,乘法变加法。的代码实现:DDA(int x1,int y1,int x2,int y2,){ floatd原创 2016-11-16 23:52:43 · 586 阅读 · 0 评论