C++ 如何理解此光线跟踪器代码
所以这个RT代码通过原始代码创建了一个带有模糊的3D图像。在没有任何建模工具的情况下,这实际上是如何实现的 我目前正在努力了解RT是如何工作的,以及实现它们的不同方式,所以看到如此少量的代码生成一幅令人印象深刻的3D图像,这有点酷C++ 如何理解此光线跟踪器代码,c++,raytracing,C++,Raytracing,所以这个RT代码通过原始代码创建了一个带有模糊的3D图像。在没有任何建模工具的情况下,这实际上是如何实现的 我目前正在努力了解RT是如何工作的,以及实现它们的不同方式,所以看到如此少量的代码生成一幅令人印象深刻的3D图像,这有点酷 #include <stdlib.h> // card > aek.ppm #include <stdio.h> #include <math.h> #include <fstream> typedef in
#include <stdlib.h> // card > aek.ppm
#include <stdio.h>
#include <math.h>
#include <fstream>
typedef int i;
typedef float f;
struct v {
f x, y, z;
v operator+(v r) {
return v(x + r.x, y + r.y, z + r.z);
}
v operator*(f r) {
return v(x * r, y * r, z * r);
}
f operator%(v r) {
return x * r.x + y * r.y + z * r.z;
}
v() {}
v operator^(v r) {
return v(y * r.z - z * r.y, z * r.x - x * r.z, x * r.y - y * r.x);
}
v(f a, f b, f c) {x = a; y = b; z = c;}
v operator!() {
return*this * (1 / sqrt(*this % *this));
}
};
i G[] = {247570, 280596, 280600, 249748, 18578, 18577, 231184, 16, 16};
f R()
{
return(f)rand() / RAND_MAX;
}
i T(v o, v d, f&t, v&n)
{
t = 1e9; i m = 0;
f p = -o.z / d.z;
if(.01 < p)t = p, n = v(0, 0, 1), m = 1;
for(i k = 19; k--;)
for(i j = 9; j--;)if(G[j] & 1 << k) {
v p = o + v(-k, 0, -j - 4);
f b = p % d, c = p % p - 1, q = b * b - c;
if(q > 0) {
f s = -b - sqrt(q);
if(s < t && s > .01)
t = s, n = !(p + d * t), m = 2;
}
}
return m;
} v S(v o, v d)
{
f t;
v n;
i m = T(o, d, t, n);
if(!m)return v(.7, .6, 1) * pow(1 - d.z, 4);
v h = o + d * t, l = !(v(9 + R(), 9 + R(), 16) + h * -1), r = d + n * (n % d * -2);
f b = l % n; if(b < 0 || T(h, l, t, n))b = 0;
f p = pow(l % r * (b > 0), 99);
if(m & 1) {
h = h * .2;
return((i)(ceil(h.x) + ceil(h.y)) & 1 ? v(3, 1, 1) : v(3, 3, 3)) * (b * .2 + .1);
} return v(p, p, p) + S(h, r) * .5;
} i
main()
{
FILE * pFile;
pFile = fopen("d:\\myfile3.ppm", "w");
fprintf(pFile,"P6 512 512 255 ");
v g = !v(-6, -16, 0), a = !(v(0, 0, 1) ^ g) * .002, b = !(g ^ a) * .002, c = (a + b) * -256 + g;
for(i y = 512; y--;)
for(i x = 512; x--;) {
v p(13, 13, 13);
for(i r = 64; r--;) {
v t = a * (R() - .5) * 99 + b * (R() - .5) * 99;
p = S(v(17, 16, 8) + t, !(t * -1 + (a * (R() + x) + b * (y + R()) + c) * 16)) * 3.5 + p;
}
fprintf(pFile, "%c%c%c", (i)p.x, (i)p.y, (i)p.z);
}
}
我亲爱的朋友那是Paul Heckbert密码对吗 你至少可以提一下 对于认为此代码不可读的人,以下是原因: 这家伙创造了一个可以放在信用卡上的密码,这就是目标: 他的网站: 编辑:了解此代码的源代码可能有助于您理解它。即使这不是你的主要动机 如果您真的对光线跟踪感兴趣,请从其他源开始。
看看这个网站,然后再谈谈你的代码这个代码其实并不特别。它基本上是一个光线跟踪器,经过模糊处理,形成了一个可以放在名片上的形状 在没有任何建模工具的情况下,这实际上是如何实现的 你不需要工具来渲染任何东西。你甚至可以在没有任何建模工具的情况下创建一个完整的魔兽世界游戏或是当下流行的东西。建模工具只会让你的生活变得更简单。某些类型的场景是:非常复杂的场景 您可以始终对这些数据进行硬编码,或者手动将它们编入某个外部文件 还可以使用参数化生成器;柏林噪声是其中一个比较流行的例子 在光线跟踪器中,由于计算渲染基本体光线和任何有限几何基本体之间的几何交点非常简单,因此在没有建模工具的情况下开始非常简单。例如,一个非近似的完美球体的交点只是几行代码
tl;数据就是数据。如何创建和处理它完全取决于您。如果我没有看到的包含,我会说这是C代码。而且非常难看。使用小写字母,单字符结构名称看起来很错误。@crashmstr从什么时候开始C有运算符重载?:@用户3333072您希望我们做什么?这段代码的逐行解释?你能不能把话题缩小一点,告诉我们你不明白哪一部分?@Mayerz-ooh,我错过了所有单字母小写名称/变量。我认为这段代码很难读懂。希望你能从中学习到一些东西。另外,vector结构上被重写的运算符会增加混淆。或者,在这个领域中,对元素乘法等使用运算符%是很典型的吗?我同意他应该提到这一点,但你的帖子并不是一个答案:@phresnel只是想帮助你记住Paul Heckbert。我想你不能真正回答他的问题,但你可以通过了解设计的动机来理解这段代码。@phresnel answer编辑,给出了几年前我制作第一个光线跟踪器所遵循的路径。我尝试了一下:事实上,我很高兴周围有人认识到这段代码。TL;DR,此代码正在写入bmp:p@Mayerz:哦,你是说asker和我指的是建模工具的不同背景?比如,我假设了如何为我的光线跟踪器获取模型,而不是在没有嵌入建模工具的情况下如何工作?