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.xdnf.cn/news/147000.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】进程地址空间和进程调度队列

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

RecyclerView的notifyDataSetChanged和notifyItemRemoved之间的区别

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 RecyclerView 提供了多种方法来通知适配器&#xff08;Adapter&#xff09;数据集发生变化&#xff0c;其中 notifyDataSetChanged() 和 notify…

数据库系统基础概述

文章目录 前言一、数据库基础概念 1.数据库系统的组成2.数据模型3.数据库的体系结构二、MySQL数据库 1.了解MySQL2.MySQL的特性3.MySQL的应用场景总结 前言 MySQL数据库是一款完全免费的产品&#xff0c;用户可以直接从网上下载使用&#xff0c;不用花费任何费用。这点对于初学…

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…

【AcWing】875. 快速幂

#include<iostream> using namespace std; typedef long long LL;LL qmi(int a,int b,int p){LL res1%p;//%p是为了p1的时候&#xff0c;余数是0while(b){if(b&1) resres*a%p;//位数是1的b>>1;aa*(LL)a%p;//a*a再modp是为了防止溢出}return res; }int main(){i…

【动态规划】(三)动态规划——完全背包

动态规划——完全背包 完全背包理论基础零钱兑换Ⅱ组合总和Ⅳ爬楼梯&#xff08;进阶版&#xff09;零钱兑换完全平方数单词拆分背包问题总结 完全背包理论基础 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

零食店小程序发展客户转化运营

零食店、折扣店近些年市场中跑出了不少区域性、多地化的品牌&#xff0c;直营及加盟模式&#xff0c;还有各种超市、商场、街边小店等&#xff0c;零食基本没有年龄群体限制&#xff0c;又属于常消费品&#xff0c;线上线下生意都可以进行发展。 线下客户到店&#xff0c;线上…

链表数据结构

链表可以解决顺序表的缺点 我们今天简单引用下链表 这边是代码讲解 头文件 #pragma once #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> using namespace std; typedef struct student {union {int data;int len;};s…

【计网】从零开始掌握序列化与反序列化 --- 基础知识储备与程序重构

从零开始掌握序列化与反序列化 1 初识序列化与反序列化2 再谈Tcp协议3 程序重构3.1 Socket类3.2 回调函数设计3.3 最终的Tcp服务器类 1 初识序列化与反序列化 在刚学习计算机网络时&#xff0c;我们谈到过网络协议栈&#xff0c;其中最上层的就是应用层&#xff0c;那么这个应…

Rosetta 一:手把手教你用Linux安装Rosetta(全网最简洁)

文章目录 1. Rosetta 介绍2.下载2. Rosetta 安装3. 验证安装 1. Rosetta 介绍 很久很久之前就对Rosetta有所耳闻&#xff0c;有一篇文章叫做denovo protein design&#xff0c;说的就是用rosetta来设计蛋白质。 rosetta是david baker团队设计的软件&#xff0c;早期只是一个蛋…

【Godot4.3】胶囊形的偏移获取法

概述 之前用半圆弧拼接的方式求过胶囊形&#xff0c;在逐渐熟练使用Geometry2D的过程中&#xff0c;发现通过线段求端点是圆角类型的偏移多边形&#xff0c;获得的就是胶囊形。 所以我们有了第二种胶囊形求法。 测试代码 tool extends Node2D## 横向宽度 export var width:…

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…

SQL server学习01-SQL server环境配置

目录 一&#xff0c;手动下载及安装 microsoft .net framework 3.5 1&#xff0c;下载 2&#xff0c;安装 二&#xff0c;安装SQL server2014 1&#xff0c;下载 2&#xff0c;安装 3&#xff0c;启动SQL server服务 三&#xff0c;下载及安装Microsoft SQL Server…

C Prime Plus 第6章习题

你该逆袭了 红色标注的是&#xff1a;错误的答案 蓝色标注的是&#xff1a;正确的答案 绿色标注的是&#xff1a;做题时有疑问的地方 橙色标注的是&#xff1a;答案中需要着重注意的地方 练习题 一、复习题1、2、3、4、5、我的答案&#xff1a;错误正确答案&#xff1a; 6、7、…

ubuntu 安装minikube,并拉取k8s镜像

不要使用最新版&#xff0c;重要的事情说三遍&#xff0c;刚开始也是最求新一点的版本&#xff0c;但问题很多&#xff0c;主要是版本之间的依赖问题&#xff0c;不是某个依赖的版本不支持某些功能&#xff0c;就是依赖之间的版本不能对应上&#xff0c;所以就降低几个版本&…

行业人工智能研究-Python自监督方式学习图像表示算法

学术界人工智能研究落后于工业界 摘要 行业或工业界在人工智能研究上超出学术界&#xff0c;并占据着大量的计算力&#xff0c;数据集和人才诱人的薪水和明朗的预期吸引大量人才离开学术界&#xff0c;涌入行业或工业界即使&#xff0c;比如Meta开源其人工智能模型&#xff0…

实验:WLAN无线综合实验

无线综合实验的概述&#xff1a; WLAN无线综合实验是一种针对无线网络技术的综合性实验&#xff0c;旨在通过实践操作加深对无线局域网&#xff08;WLAN&#xff09;技术的理解和应用能力。以下是对该实验的详细概述&#xff1a; 实验目的 掌握认证AP上线的配置方法&#xff…

[SAP ABAP] 创建域

我们可以使用事务码SE11创建域 输入要创建的域的名称&#xff0c;然后点击创建 输入简短描述&#xff0c;选择数据类型和输入字符数 激活并保存域&#xff0c;创建的域才能够生效

pg入门18—如何使用pg gis

1. 下载postgre gis镜像 2. 运行镜像 docker run -p 15432:5432 -d -e POSTGRES_PASSWORDAb123456! postgis/postgis:12-3.4-alpine 3. 使用gis # 进入容器&#xff0c;登录pgdocker exec -it bash# 登录数据库psql -U postgres# 创建数据库CREATE DATABASE mygeotest;# 使用…

Spring Boot 入门:解锁 Spring 全家桶

前言 Spring 全家桶是现代 Java 开发者不可或缺的工具集&#xff0c;它提供了从轻量级的框架到微服务架构的完整支持。本文将带你快速了解 Spring 框架、核心概念如 IoC&#xff08;控制反转&#xff09;和 AOP&#xff08;面向切面编程&#xff09;&#xff0c;并深入介绍 Sp…