当前位置: 首页 > news >正文

GAMES101(作业4~5)

作业四

题目

由 4 个控制点表示的 Bézier 曲线,

bezier:该函数实现绘制 Bézier 曲线的功能。它使用一个控制点序列和一个 OpenCV::Mat 对象作为输入,没有返回值。它会使 t 在 0 到 1 的范围内进 行迭代,并在每次迭代中使 t 增加一个微小值。对于每个需要计算的 t,将 调用另一个函数 recursive_bezier,然后该函数将返回在 Bézier 曲线上 t 处的点。最后,将返回的点绘制在 OpenCV ::Mat 对象上。 • recursive_bezier:该函数使用一个控制点序列和一个浮点数 t 作为输入, 实现 de Casteljau 算法来返回 Bézier 曲线上对应点的坐标。

解:

首先在bezier内,for迭代t(0---1),每次增加0.001的微小增量,每次调用recursive_bezier函数计算曲线点,然后进行绘制

for(int t = 0; t <= 1; t+=0.001){cv::Point2f pt = recursive_bezier(control_points,t);cv::circle(window, pt, 1, cv::Scalar(255, 0, 0), cv::FILLED);
}
cv::imshow("Bezier Curve", window);

recursive_bezier内部递归计算曲线点,每次利用线性插值:(1-t) bi  + t * bi+1计算新的控制点,进入下一层递归,知道仅剩一个点为止并返回

if (control_points.size() == 1) {  return control_points[0];  
}  
std::vector<cv::Point2f> new_points;  
for (size_t i = 0; i < control_points.size() - 1; ++i) {  float x = (1 - t) * control_points[i].x + t * control_points[i + 1].x;  float y = (1 - t) * control_points[i].y + t * control_points[i + 1].y;  new_points.push_back(cv::Point2f(x, y));  
}
return recursive_bezier(new_points, t);
在屏幕随机点4下

作业五

题目:

使用光线追踪来渲染图像,需要完成  光线的生成Renderer  和   光线与三角的相交rayTriangleIntersect  (找到光线与物体的交点)

代码框架:

//自定义库

• global.hpp:全局函数和变量。

  • 材质类型:/* 漫反射和镜面,反射和折射 ,反射*/
  • get_random_float获取随机浮点数

  • UpdateProgress在控制台上显示一个进度条

• Vector.hpp: 不再使用 Eigen 库,

  • Vector3f类,重载支持了 浮点/向量 加减乘除等操作,

  • Vector2f类,同理

  • lerp,线性插值

  • normalize,向量归一化
  • dotProduct,点积
  • crossProduct。叉积

//场景和物体

main 函数:生成场景-》创建物体,并添加到场景-》创建光线追踪渲染器,调用Render渲染场景

• Scene.hpp: 定义要渲染的场景。包含场景的属性(范围,背景色等),负责管理所有资产,包括物体数组以及灯光数组。

• Object.hpp: 渲染物体的父类,包括渲染物体光照模型的参数值(材质类型,漫反射颜色等),和交点纯虚函数

sphere.hpp球体继承Object,构造函数设置位置和半径属性

  • intersect重载函数

MeshTriangle三角形继承Object,构造函数设置顶点位置,索引,个数,纹理坐标

  • rayTriangleIntersect():使用moller trumbore算法来更新参数

light,hpp 灯光,包含位置和强度属性

//渲染器

• Renderer.hpp: 光线追踪渲染器

  • Render(scene) :负责控制渲染逻辑执行,创建了帧缓冲-》屏幕宽高比-》遍历所有像素,生成对应的光线-》返回的颜色保存在帧缓冲区(颜色缓冲)
  • CastRay :发射光线,接受光的起点,方向,深度值,返回颜色hitColor(初始颜色为背景颜色)
    • hit_payload光线交点的载荷数据(STRUCT),时间t(tNear),顶点数据,纹理坐标,击中的物体

    • 通过trace查询光线与场景中最近的对象的交点,如果存在交点payload,通过orig + dir * payload->t  获取交点位置,并从打击物体上获取物体属性,根据物体的材质类型,选择不同的着色方式(着色器)
  • trace:查询交点,遍历所有物体,对每个物体调用intersect,传入光线,返回光线交点的载荷数据(STRUCT)

  • deg2rad:deg * M_PI/180.0;角度转弧度

  • fresnel菲涅耳

  • refract折射

  • reflect反射

解:

int width = 1280;
int height = 960;
double fov = 90;
float imageAspectRatio = scene.width / (float)scene.height;
float scale = std::tan(deg2rad(scene.fov * 0.5f));

查找像素的xy位置,从而获取光线方向,已知场景宽度,高度,宽高比,相机视角,和平面深度-1

x = 2 * scale * imageAspectRatio / scene.width * (i + 0.5) - scale * imageAspectRatio;
y = - 2 * scale / scene.height * (j + 0.5) + scale;

moller trumbore算法,直接带入老师上课讲的公式就可以

Vector3f E1, E2, S, S1, S2, re;
E1 = v1 - v0;
E2 = v2 - v0;
S = orig - v0;
S1 = crossProduct(dir, E2);
S2 = crossProduct(S, E1);
re = Vector3f(dotProduct(S2, E2), dotProduct(S1, S), dotProduct(S2, dir));
re = re / dotProduct(S1, E1);
tnear = re.x;
u = re.y;
v = re.z;
if(tnear > 0 && v >= 0 && v <= 1 && u >= 0 && u <= 1)return true;
return false;

输出文件就在新建的构建文件夹中 


http://www.mrgr.cn/news/33077.html

相关文章:

  • Spring中的Web Service消费者集成(应该被淘汰的技术)
  • 类和对象(上)
  • 一些音频文件转Wav
  • BUUCTF逆向wp [WUSTCTF2020]Cr0ssfun
  • 【笔记】第三节 组织与性能
  • 计算机毕业设计 数字化农家乐管理平台的设计与实现 Java实战项目 附源码+文档+视频讲解
  • C++入门(03)萌新问题多(二)
  • ftrace - 几种tracer的打印例子
  • OpenGL 原生库5 变换
  • 吉首大学--23级题目讲解
  • 山东潍坊戴尔存储服务器维修 md3800f raid恢复
  • OpenGL使用Glfw框架创建第一个窗体
  • 【巧用ddddocr破解算术运算验证码的经典示范】
  • 【OS】AUTOSAR OsStack监控原理
  • CMake中的PUBLIC、PRIVATE 和 INTERFACE用法
  • 楼宇自动巡检小车设计
  • 借10万块,年化利息明明是3.8%,为啥就变成了2.07%?
  • 【软考】传输层协议TCP与UDP
  • C++智能指针入门教程(C++11)
  • OpenGL渲染管线(Rendering Pipeline)介绍