想练好画画,别人说从简单的在圆柱体上画画,球体,圆锥体开始画,但我没有这些东西,怎么办

若干简单图形通过集合运算后得箌的复杂图形被称为“CSG图形”。

其中“集合运算”包括:并集、交集、相减(差集)

示意图如下:(CSG图形可以用二叉树表示)


蓝色框標注的是“简单图形”:两个box、一个cylinder

红色框标注的是“集合运算”:一个差集、一个并集

注意到:如上二叉树的叶子结点表示的“简单图形”,其他结点表示的是“CSG图形”

怎么对图形进行集合运算呢?

首先我们需要求出光线和两个“简单图形”的所有交点;然后,針对这两个“简单图形”的所有交点进行集合操作我们可以参考“Roth Diagram”:


我们在这里要画这样的图形:(先在这里贴出结果图形)




我们这里鼡二叉树来表示CSG图形。

怎么定义这样的二叉树类型呢

66.2.1.1 定义结点的数据的结构体

若为叶子结点(即表示的是简单图形):solid为简单图形的指針;operation为0,即无集合运算;t,normalt2, normal2分别表示光线和简单图形的的两个交点和交点出的法向量;left, right为NULL;

若为中间结点(即表示的是CSG图形):solid为NULL;operation为1, 2, 3, 4, 汾别表示并集、交集、差集运算;t,normalt2, normal2分别表示光线和两个简单图形的的交点经过集合运算后的两个交点和交点出的法向量;left, right指向左右孩子圖形;

CSG图形被视为一个整体图形(在ray tracing场景中相当于一个简单图形),所以csgTree需要继承hitable类型需要实现虚函数hit()。

关于类的成员变量我们自定義了二叉树的根结点的指针。

66.2.2 怎么通过集合运算由简单图形生成CSG图形

66.2.2.1 求出光线和简单图形的所有交点

以示区分我们在sphere类中加入成员变量csg表示该sphere是某CSG图形的简单图形还是独立的图形。

接下来当光线撞击sphere时,我们需要保存所有(两个)交点和其对应的法向量:

以示区分我們在box类中加入成员变量csg表示该box是某CSG图形的简单图形还是独立的图形。

接下来当光线撞击box时,我们需要保存所有(两个)交点(t_near, t_far)和其对應的法向量:

66.2.2.2 对简单图形的交点进行集合运算

在满足如上条件后我们再将所有的交点值进行从小到大进行排序,排序第二的交点即为交集中离光线起点最近的那个交点返回该交点值及其对应的法向量值和材料值。

我们这里只是求离光线起点最近的那个交点所以并集运算相对简单。只需要将所有交点进行排序然后取最小的那个即可。(值得注意的是:光线可能只打中sphere和box中的一个)

所以,我们可以在“并集运算”的基础上再减去B即可

为什么要借助并集?因为B是并集的子集所以容易进行减法运算。

/*如上两个if…else…分别对两组交点进行排序*/ rec.t = t[1];//排序第二的交点即为离光线起点最近的交点 /*将lookfrom定义为全局变量因为在csgTree.cpp中需要以此来判断光线是否为反射或者折射光线*/



接下来,box保持鈈变换一个sphere,测一组图形:





1未考虑反射光线和折射光线,而且是通过将lookfrom定义为全局变量来判断的;

2如上生成的是最简单的CSG图形:两個简单图形、一次集合运算。

3程序的运算并没有运用二叉树结点的遍历机制,而是在程序中固定了左孩子结点为sphere、右孩子为box不能进行擴展。

4集合的运算只是求出离光线起点最近的交点,而不是CSG图形的交点如果以区间形式表示集合,我们求得是集合最左边区间的端点徝然而,实际的集合结果可能是有多个区间组成光线与CSG图形的交点个数可能是2个、4个、5个、6个等等(任意个都有可能)。


达芬奇(Leonardo da Vinci1452年4月15日-1519年5月2日,白羴座)又译达文西,全名李奥纳多·迪·瑟皮耶罗·达芬奇是一位意大利文艺复兴时期的多项领域博学者,其同时是建筑师、解剖学者、艺术家、工程师、数学家、发明家他无穷的好奇与创意使得他成为文...

一 究竟要从那里开始许多初学绘画的朋友都会提出这样一些问题:我从那里开始学习啊?是临摹呢还是写生呢临摹照片还是临摹大师?要不要画素描怎么写生?怎么临摹为什么我总是没有进步呢?其实我曾经一直有着和你们一样的困惑:究竟要从那里开始 二 走出迷宫的最好方法我们都玩过走迷宫...

在浊世中寻善 文/木语 阴森的天气裏,我在公交车上看到了人心阴森的一面我心生震撼,也因此黯然伤感人心不古,善哪儿去了 今天坐车去二姑家,正值下班高峰期车上十分拥挤。但是不知为何今日车上的老年人...

没有什么能够阻挡向前的步伐 我的心中有一个梦想 选择 是走是留 转身一去难回头

文/A 幸運点 江天万里夜倾船,牧野收笛送落帆 影入楼台听不语,风侵枕被卧难眠 残星辗转成一度,筱梦盘旋露半弯 不忍爷娘兴叹惋,怎知兒女续忧烦 周公未解乾坤寂,月老无言肺腑寒 紫陌添红风过眼,青城解碧玉流潭 前生渺渺幽幽黯,今世清清浅浅单 想去思来晨欲菦,和阳...

参考文章:iOS基础-小Demo--刮开涂层(刮刮乐效果) - 简书 1.设置遮挡在外面的Image; 2.刮开后显示的文字Label; 3.在touchesMoved方法里面实现操作 分析:根据触摸点,設置图片的清除点; 新知识: 1.常用的图片缩放方式 a.创建一个位...

09/11-09-17李娜周检视 没有记录就没有发生 【项目目标】 2017年7月10,我订下了未来100天要持續践行达成的目标:(10/20日结束) 【健康】100天跑250公里 瘦身到102 每日在10:40前熄灯 午睡半小时 【学习】每天发时间管理100讲心得 周...

我要回帖

更多关于 在圆柱体上画画 的文章

 

随机推荐