# ray-casting **Repository Path**: wangjq4214/ray-casting ## Basic Information - **Project Name**: ray-casting - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-25 - **Last Updated**: 2021-12-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Ray Casting Ray Casting 算法实现。 ## 主要代码 ```cpp void RayCasting::composite(float *temp, int x, int y) { // 采样步长 int stepSize = 1; // 累计颜色值 float cumColor[4]{0.0, 0.0, 0.0, 0.0}; // 投射光线起点、方向 float pos[3], dir[3]; // 光线与包围盒近视点处的交点坐标 float startPos[3]; // 采样点坐标 float samplePos[3]; // 采样点颜色 float sampleColor[4]; // 采用平行投影,故在图像空间中投射光线的方向(0,0,-1),起点(x,y,0) pos[0] = x; pos[1] = y; pos[2] = 0; // 将光线描述转换到物体空间 // 光线方向在物体空间的表达 dir[0] = -R[2]; dir[1] = -R[5]; dir[2] = -R[8]; // 旋转 Utils::matrix_mul_vec(pos, R, pos); // 平移 pos[0] += T[0]; pos[1] += T[1]; pos[2] += T[2]; // 判断光线与包围盒是否相交 if (intersection(startPos, pos, dir)) { samplePos[0] = startPos[0]; samplePos[1] = startPos[1]; samplePos[2] = startPos[2]; // 当光线射出包围盒或累计不透明度超过 1 时中止合成 while (check_in_box(samplePos) && cumColor[3] < 1) { // 三线性插值获得采样点处的颜色及不透明度 tr_interpolation(sampleColor, samplePos); // 合成颜色及不透明度,采用的是从前到后的合成公式 cumColor[0] += sampleColor[0] * sampleColor[3] * (1 - cumColor[3]); // R cumColor[1] += sampleColor[1] * sampleColor[3] * (1 - cumColor[3]); // G cumColor[2] += sampleColor[2] * sampleColor[3] * (1 - cumColor[3]); // B cumColor[3] += sampleColor[3] * (1 - cumColor[3]); // A // 下一个采样点 samplePos[0] += dir[0] * stepSize; samplePos[1] += dir[1] * stepSize; samplePos[2] += dir[2] * stepSize; } temp[0] = cumColor[0]; temp[1] = cumColor[1]; temp[2] = cumColor[2]; temp[3] = cumColor[3]; return; } temp[0] = temp[1] = temp[2] = temp[3] = 1.0; //若光线与包围盒不相交,赋白色 } ``` 体绘制中的光线投射方法与真实感渲染技术中的光线跟踪算法有些类似,即沿着光线的路径进行色彩的累计。但两者的具体操作不同。首先,光线投射方法中的光线是直线穿越数据场,而光线跟踪算法中需要计算光线的反射和折射现象。其次,光线投射算法是沿着光线路径进行采样,根据样点的色彩和透明度,用体绘制的色彩合成算子进行色彩的累计,而光线跟踪算法并不刻意进行色彩的累计,而只考虑光线和几何体相交处的情况;最后,光线跟踪算法中光线的方向是从视点到屏幕像素引射线,并要进行射线和场景实体的求交判断和计算,而光线投射算法,是从视点到物体上一点引射线,不必进行射线和物体的求交判断。 ## 实验结果