computer graphics
文章平均质量分 57
图形跟班
we've got to find what we love.
展开
-
问题六十六:怎么用ray tracing画CSG(Constructive Solid Geometry 构造实体几何)图形
66.1 概述什么是CSG图形? 若干简单图形通过集合运算后得到的复杂图形,被称为“CSG图形”。其中“简单图形”,包括:sphere, box, cylinder, and so on.其中“集合运算”,包括:并集、交集、相减(差集) 示意图如下:(CSG图形可以用二叉树表示)蓝色框标注的是“简单图形”:两个box、一个cylinder红色框标注的原创 2017-02-04 20:05:02 · 6449 阅读 · 0 评论 -
问题二:用C++输出第一张图片
将书上对应的代码抄写了一遍。#include <iostream>#include <fstream>using namespace std;int main(){ int nx = 200; int ny = 100; ofstream outfile( "mytest.txt", ios_base::out); outfile << "P3\n" << nx <原创 2017-01-13 22:56:52 · 16674 阅读 · 6 评论 -
问题三:类的头文件和实现文件分别写什么(用向量表示RGB输出“第一张图片”)
书上接下来是介绍一个表示向量的类(vec3)。所以,我要先创建一个新的类vec3。创建该类之后,生成两个文件:vec3.cpp和vec3.h。像之前一样,还是将书上的代码原封不动地抄写下来,如下:#ifndefVEC3_H#defineVEC3_H #include#include#include usingnamespace std; class vec3{ pu原创 2017-01-13 23:02:13 · 1758 阅读 · 0 评论 -
问题十三:怎么用ray tracing画个球
当然这个球是画在之前的背景图上。通过画第一张图,已经直到画图有两个步骤:其一,确定位置(范围、大小);其二,设置颜色。画球也不例外。第一步:确定球的位置。球上每个像素点的位置即为光线与球的交点,所有这些交点就组成了球。所以,问题转化为找光线和球的交点。第二步:设置球的颜色。即设置光线和球交点的颜色。 (图都是一个像素点一个像素点画出来的,一个光线代表着一个像素点。此处和球有原创 2017-01-14 00:05:33 · 2005 阅读 · 0 评论 -
问题十二:怎么用ray tracing画第一张图
ray 类:(位于ray.h中。ray.cpp为空)#ifndef RAY_H#define RAY_H#include "vec3.h"class ray{ public: ray() {} ray(const vec3& a, const vec3& b) { A = a; B = b; } vec3 orgin() con原创 2017-01-13 23:49:43 · 2594 阅读 · 2 评论 -
问题六十七:ray tracing学习总结(2016.11.13, 2017.02.05)
从2016.11.13开始接触ray tracing到今天2017.02.05,差不多80天的时间。截至当前,学习ray tracing的过程,也是我重新找回自己或者说是“find what I love”的过程。不再浮躁,不再急功近利,不再认为“人活着就是为了赚钱”。我现在的观点是:对个人而言,活着的意义就是“find what we love”。找到爱的人,快乐生活;找到爱的事,快乐工作。原创 2017-02-05 18:02:09 · 1778 阅读 · 2 评论 -
问题十四:怎么可视化球的法向量
书上的原话是:visualize the normals with a color map,但是代码实现的是光线撞上球,然后色彩表(RGB)可视化“撞点”的法向量。开章第一句是“First, let’s get ourselves a surface normal so we can shade.”。这句话是看懂了“获取法向量是为了shade”,但是不知道具体是讲的是啥。为什么要可视化?为原创 2017-01-14 00:08:27 · 3604 阅读 · 5 评论 -
问题十八:怎么对ray tracing图形进行消锯齿
先将上一章节的图放大8倍,看看局部:边界的锯齿很清晰很明显很刺眼啊,有木有?我们现在要做的就是使得这些锯齿不那么清晰不那么明显不那么刺眼。简单地说,使边界模糊。之前的图是每个像素点设置一个颜色值,相当于将像素中心位置的颜色设置给了整个像素。所以,如果两个像素点中心位置的颜色值相差比较大时,这两个像素点就会产生清晰的边界。那么问题来了,怎么使得两个像素点的边界模糊呢?书上的做法是原创 2017-01-14 19:21:33 · 1590 阅读 · 2 评论 -
问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials)
前面画一个球时,球体的颜色设置为红色;前面画多个球时,球体的颜色设置为球在该点的单位法向量的色彩表映射值;现在画多个漫射材料的球,球体的颜色设置为背景颜色的系数倍。(姑且表述为“背景颜色”吧,将在“问题二十一”中确切说明) 漫射材料不发光,只吸收和反射环境的光(反射光的方向是随机的),所以将漫射材料的球体的颜色设置为背景颜色乘以某系数是合理的。系数怎么确定呢?光线每被反射一次*1/原创 2017-01-14 19:30:29 · 1981 阅读 · 0 评论 -
问题二十:C++全局debug “ray tracing图形”实例
紧接上文,漫射材料的球体颜色是不是太黑了呢?为什么会这么黑?接下来要debug啦!!! 第一步:取消“消锯齿”首先想到的是:应该减少光线条数。所以,将“消锯齿”的哪个ns系数设置为1先,原本的系数是100。简单算一下200*100的图片是2万个像素点,为了消锯齿,每个像素点采样100次然后求平均值,也就是一共采样200万次(by the way, 最后一次还真尝试打出了200万条l原创 2017-01-14 19:38:33 · 1619 阅读 · 8 评论 -
问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal)
在漫射材料章节,我们将多个球都模拟成漫射材料的颜色。那么问题来了,我们能不能将不同的球模拟成不同材料的颜色呢?可以哈!我们这一章节就干这事。 21.1总结一下设置颜色的几种方法我们还是先回忆一下:ray tracing画图时,我们用过的设置颜色的方法: 1,第一张图(背景):vec3 unit_direction = unit_vector(r.directio原创 2017-01-14 20:11:21 · 2178 阅读 · 1 评论 -
问题二十三:C++中debug简单的运行死机问题
其实,“模拟不同材料颜色”章节中,刚添加完相关code之后,运行出现过死机。 将采样次数尽可能降低,简化过程,方便分析问题。在main()函数添几条log,为了判断死在main()中什么位置Log的最后位置是main()--2处,main()--3的log没有出来,说明死在了color()函数中。所以在color()函数中添加如下log。原创 2017-01-14 20:35:14 · 1663 阅读 · 0 评论 -
问题二十四:怎么模拟ray tracing图形中介质材料的颜色(dielectric)
这里的“介质”是指光可以通过的物质。比如,水,玻璃等。也就是我们常说的具有一定透明度的物质。24.1 预备知识24.1.1 反射和折射光线的方向向量 反射光线的方向向量: 漫反射:n + p。其中n为单位法向量,p为“起点在原点,长度小于1,方向随机”的随机向量。 镜面反射:v - 2*dot(v,n)*n。其中n为单位法向量,v原创 2017-01-14 20:49:59 · 2433 阅读 · 4 评论 -
问题十七:怎么用ray tracing画多个球?
回忆一下,一个球是怎么画的呢?第一步:光线撞上球。找“撞点”第二步:将“撞点”的像素位置设置为球的颜色。之前采用过两种方式设置颜色:1,简单粗暴,将整个球的颜色设置为红色(return vec3(1, 0, 0));2,将球面上每个像素位置的颜色设置为球在该点的单位法向量的色彩表映射值(每个点的法向量都不一样,所以,每个点的颜色被设置得不一样)。 所以,那么,现在怎么画多个球呢?一原创 2017-01-14 19:11:21 · 1665 阅读 · 2 评论 -
问题二十七:ray traing中的positionable camera
27.1 引入张角theta和宽高比值aspect 回忆一下,“问题十二”中有介绍这么一张图。当时是这么说的:已知Z=-1平面上四点的坐标,我们可以求出下面三个值。 vec3 lower_left_corner(-2.0, -1.0, -1.0); vec3 horizontal(4.0, 0.0, 0.0); vec3 ve原创 2017-01-15 11:51:05 · 1312 阅读 · 2 评论 -
问题二十八:ray tracing中的散焦模糊(defocus blur)
“散焦模糊”在摄影上又称“景深”。在现实的相机中,我们需要做“散焦模糊”的原因是:我们需要一个更大的孔来收集光线增加图片的亮度(而不是“针孔”)。我们称“更大的孔”为“光圈”。For a real camera, if you need more light,you make the aperture bigger, and will get more defocus blur.For原创 2017-01-15 11:59:12 · 6897 阅读 · 1 评论 -
问题二十九:测试ray tracing中camera几个主要参数
camera(vec3 lookfrom, vec3 lookat, vec3vup, float vfov, float aspect, float aperture, float focus_dist)我们相机当前的构造函数的参数有这么七个:vec3 lookfrom:相机的位置vec3 lookat:目标物体的位置vec3 vup:相机的倾斜方向(一般设置为(0,1,0))原创 2017-01-15 12:08:16 · 1489 阅读 · 2 评论 -
问题三十:《Ray Tracing In One Weekend》封面图形生成
30.1 封面图片先完成封面图片。Code如下:----------------------------------------------main.cpp------------------------------------------main.cpp hitable *random_scene() { int n = 500; hit原创 2017-01-15 12:32:22 · 3488 阅读 · 3 评论 -
问题三十一:ray tracing中Convex Quadrilateral Inverse Mapping
从这一章节开始,主要是学习《An Introduction to Ray Tracing》光线和多边形相交问题的求解:1,光线和多边形所在的平面相交,求出交点;2,判断交点是否在多边形内;3,交点在多边形的什么位置(相对于多边形的边)。 前面两步分别在“2.3.1 Ray/Plane Intersection”和“2.3.2 PolygonIntersectio原创 2017-01-15 12:40:25 · 987 阅读 · 0 评论 -
问题三十二:怎么用ray tracing画多边形(polygon, triangle)
画多边形主要分为两步:1,光线和多边形所在的平面相交,求得交点;2,判断交点是否在多边形内; 32.1 光线和多边形所在的平面相交分别定义光线、多边形和多边形所在平面。光线和平面的方程如下:(注意:用到法向量的地方一般都将其标准化。尽管有时候没有必要,但是在某些公式或算法中只能使用标准法向量(而不是法向量)。所以,为了避免特别记忆,统一都进行标准化。) 光线方程:原创 2017-01-15 12:57:03 · 1908 阅读 · 1 评论 -
问题三十三:怎么用ray tracing画特殊长方体(box)
33.1 怎么用ray tracing画特殊长方体在光线追踪中被用到的一种常见形态是长方体盒子。这种基本物体被用于可见物体和包围盒,包围盒被用于加速复杂物体的相交测试。吐槽:单词都认识,就是不知道讲的是什么。“包围盒”是什么鬼?不懂!不过感觉好像很厉害的样子。表面法向量和坐标轴平行的长方体是最简单的形式之一。 我们先就画“表面法向量和坐标轴平行”的长原创 2017-01-15 13:23:06 · 1905 阅读 · 0 评论 -
问题三十四:怎么用ray tracing画任意长方体(generalized box)
34.1 思路分析这个内容书上没有,但是觉得实际应用中的长方体的位置应该是任意的(表面法向量不一定平行坐标轴)。怎么画?1,光线撞击到长方体2,撞击点到光线起点的距离3,撞击点的法向量 怎么确定空间中任意个长方体? 对于前下边的方向向量u(Xu, Yu, Zu)不平行于ZOX平面(即Yu不等于零)的情况:以下六个参数可以确定唯一的空间长方体。原创 2017-01-15 13:35:46 · 1116 阅读 · 4 评论 -
问题三十五: 怎么用ray tracing画二次曲面(quadratic surfaces)(1)——椭球面
二次曲面包括:球面、椭圆球面、单页双曲面、双页双曲面、椭圆锥面、椭圆柱面、椭圆抛物面、双曲抛物面等等。注意到:只有球面和椭球面是封闭面,其他的都是开放面。二次曲面是有方程的(我们已经学过的多边形、长方体等是没有方程的),所以其画法应该要比多边形和长方体要简单。思路是这样的:1,联立曲面方程和光线方程。判断光线是否撞击曲面;求得撞击点到光线起点的距离t;2,将t代入光线方原创 2017-01-15 14:22:30 · 1200 阅读 · 4 评论 -
问题三十五: 怎么用ray tracing画二次曲面(quadratic surfaces)(2)——单页双曲面、双页双曲面、椭圆锥面、椭圆柱面
35.2.1 数学推导单页双曲面、双页双曲面、椭圆锥面、椭圆柱面。这四个二次曲面方程共同形式:但是,注意到,这些曲面都是开放曲面。在画图时,需要限制曲面的范围(以免曲面覆盖整个画面)。我们在这里是限制曲面在y轴方向距离中心点的长度为height_y(引入该参数)。所以,我们可以在根据实根t求得交点坐标后,对交点坐标作如下判断:((re原创 2017-01-15 14:41:03 · 2912 阅读 · 2 评论 -
问题三十五: 怎么用ray tracing画二次曲面(quadratic surfaces)(3)——椭球抛物面
35.3 椭球抛物面35.3.1 数学推导椭球抛物面的方程如下:所以,其一:我们需要对两个实根进行排序(先处理小的) 另外,由于,是开放曲面,也就是,光线有可能撞击到曲面的正反两面,所以,对于撞击点处的标准化之后的法向量,我们需要做如下判断: if (dot(rec.normal,r.directio原创 2017-01-15 15:00:24 · 804 阅读 · 0 评论 -
问题三十五: 怎么用ray tracing画二次曲面(quadratic surfaces)(4)——双曲抛物面(马鞍面)
35.4 双曲抛物面(马鞍面)35.4.1 数学推导双曲抛物面的方程如下:35.4.2 看C++代码实现---------------------------------------------quadratic_hyperbolic_paraboloid.h ------------------------------------quadratic_hyper原创 2017-01-15 15:13:38 · 1876 阅读 · 0 评论 -
问题三十五: 怎么用ray tracing画二次曲面(quadratic surfaces)(5)——汇总
二次曲面来张合照: hitable *list[9]; list[0] = new sphere(vec3(0.0,-100.5,-1), 100, new lambertian(vec3(0.8, 0.8, 0.0))); list[1] = new quadratic_ellipsoid(vec3(-6.4, 1, 0), 0.7, 1.0,原创 2017-01-15 15:27:12 · 541 阅读 · 0 评论 -
问题三十六:ray tracing中的Inverse Mapping(0)——概要
Inverse Mapping指的是某点在某面的相对位置,这个“相对位置”用u、v表示。 Inverse Mapping完成后,相当于将某面映射到了uv平面,u、v的取值范围为[0, 1]。 这一章节会讲到球面、凸四边形(含三角形)、圆、圆柱面、圆锥面五类面的Inverse Mapping。为了原创 2017-01-15 15:29:57 · 777 阅读 · 0 评论 -
问题三十六:ray tracing中的Inverse Mapping(2)——凸四边形(含三角形)Inverse Maping
36.2 凸四边形(含三角形)Inverse Maping36.2.1 数学推导参考“问题三十一” 36.2.2 看C++代码实现----------------------------------------------polygon.cpp ------------------------------------------polygon.cpp #include原创 2017-01-15 15:45:05 · 573 阅读 · 0 评论 -
问题三十六:ray tracing中的Inverse Mapping(3)——圆盘Inverse Mapping
36.3 圆盘Inverse Mapping36.3.1 数学推导我们只考虑圆盘垂直于ZOX平面的情况。36.3.2 看C++代码实现----------------------------------------------elliptic_plane.cpp ------------------------------------------elli原创 2017-01-15 15:49:43 · 434 阅读 · 0 评论 -
问题三十六:ray tracing中的Inverse Mapping(4)——圆柱面Inverse Mapping
36.4 圆柱面Inverse Mapping36.4.1 数学推导36.4.2 看C++代码实现----------------------------------------------quadratic.cpp ------------------------------------------quadratic.cpp #include "q原创 2017-01-15 15:57:11 · 838 阅读 · 0 评论 -
问题三十六:ray tracing中的Inverse Mapping(5)——圆锥面Inverse Mapping
36.5 圆锥面Inverse Mapping36.5.1 数学推导36.5.2 看C++代码实现----------------------------------------------quadratic.cpp ------------------------------------------quadratic.cpp#include "qu原创 2017-01-15 16:04:23 · 525 阅读 · 0 评论 -
问题三十六:ray tracing中的Inverse Mapping(6)——汇总
----------------------------------------------main.cpp ------------------------------------------main.cpp //triangle vec3 vertexes3_1[3]; vertexes3_1[0] = vec3(-6.75, 0.0, 0.0);原创 2017-01-15 16:14:20 · 449 阅读 · 0 评论 -
问题三十六:ray tracing中的Inverse Mapping(1)——球面Inverse Mapping
36.1 球面Inverse Mapping36.1.1 数学推导球面(球心在(X0, Y0, Z0),半径为R)上任意一点P的坐标(Xi, Yi, Zi)的参数表示为:Xi = X0 + R*sinα*sinβYi = Y0 + R*cosαZi = Z0 + R*sinα*cosβ 所以,P点的法向量Sn的坐标(Xn, Yn, Zn)可以表示为:Xn原创 2017-01-15 15:36:04 · 1194 阅读 · 4 评论 -
问题三十七:C++怎么解一元四次方程?(1)——怎么解一元二次方程
37.1 怎么解一元二次方程?----------------------------------------------main.cpp ------------------------------------------main.cppfloat* roots_quadratic_equation(float a, float b, float c) { //the原创 2017-01-15 16:28:16 · 2425 阅读 · 0 评论 -
问题三十七:C++怎么解一元四次方程?(2)——怎么解一元三次方程
37.2 怎么解一元三次方程?用“盛金公式”求解:----------------------------------------------main.cpp ------------------------------------------main.cppfloat* roots_cubic_equation(float a, float b, float c, float d原创 2017-01-15 16:33:47 · 2098 阅读 · 0 评论 -
问题三十七:C++怎么解一元四次方程?(3)——怎么解一元四次方程
37.3 怎么解一元四次方程?用“费拉里”方法求解:将四次方程化为两个二次方程,然后求解二次方程。 ----------------------------------------------main.cpp ------------------------------------------main.cpp float* roots_quart原创 2017-01-15 16:35:53 · 5479 阅读 · 1 评论 -
问题三十九:怎么用ray tracing画圆环
39.1 数学推导书上这么说:39.2 看C++代码实现----------------------------------------------tori.h------------------------------------------tori.h #ifndef TORI_H#define TORI_H#include原创 2017-01-15 16:52:50 · 807 阅读 · 0 评论 -
问题四十:对ray tracing圆环图形进行debug(1)
针对上一章节的最后输出图片,进行debug。中间那个白色夹杂着红色的圈是什么鬼???第一步:去掉绿圆环第二步:将单个像素点的采样次数改为1那个多余的白色夹杂着红色的圈的颜色之所以是白色偏红色,是因为:多次采样中可能一次出现红色而其他其次都是白色,所以作为最终像素点颜色的多次采样的平均值就是白色偏红色。之前单个像素点采样是100次。原创 2017-01-15 17:06:13 · 606 阅读 · 0 评论 -
问题四十:对ray tracing圆环图形进行debug(2)——C++,用“笛卡尔”方法解一元四次方程
第七步:用“笛卡尔”方法解一元四次方程 “笛卡尔”方法也就是“待定系数法” 通过“式子八”可以解出s(可能有0到3个实根,这里真的可以随便取一个大于等于0的实根,因为“式子四”是两个式子乘积等于0,而不像“费拉里”方法中参数y的选择);将s代入“式子七”得到k;将k代入“式子五”得到m、t;将k、m、t代入“式子四”得到两个一元二次方程,可以解出实根原创 2017-01-15 17:18:27 · 1702 阅读 · 0 评论