Ray Casting:光线投射

news/2024/11/24 13:20:30/

本次作业完成的是通过正交相机投影+ray casting方式渲染,得到一个场景中有若干个球形的图片,并以深度测试后直接显示色彩和简单限制深度后显示两种方式来显示。

目录

原理

 结果

github连接


原理

        在不考虑二次反射和多次反射的情况下,Ray casting只需要从相机到当前画布的各个像素投射出一条光线,判断光线是否和场景中的各个物体相交,如果相交,比较出距离相机最近的那个物体予以显示即可;如果不相交,则不做任何其他处理。

       首先给出场景中包含的各项数据,然后我再一一说明如何处理。

OrthographicCamera {
    center 0 0 10 
    direction 0 0 -1
    up 0.5 1 0
    size 5
}

Background { color 0.2 0.2 0.2 }

Materials {
    numMaterials 3
    PhongMaterial {
    diffuseColor 1 0 0 
    }
    PhongMaterial {
    diffuseColor 0 1 0 
    }
    PhongMaterial {
    diffuseColor 0 0 1
    }
}

Group {
    numObjects 5

    MaterialIndex 0
    Sphere {
    center 0 0 0 
        radius 1 
    }

    MaterialIndex 1
    Sphere {
    center 1 1 1 
        radius 0.75
    }
    Sphere {
    center -1 -1 1 
        radius 0.75
    }

    MaterialIndex 2
    Sphere {
    center -1 1 -1 
        radius 0.75
    }
    Sphere {
    center 1 -1 -1 
        radius 0.75 
    }
}

        按照伪代码的顺序,我们首先看如何创建一条从相机(或眼睛)出发的光线。

        这里需要区分一个点,相机的size和最终显示图片的尺寸并不相等,二者之间的关系可以理解为原本相机的size经过等比放大可变为最终图片。“For every pixel”是针对照片而言的,但具体发射光线是从相机出发的,从照片的尺寸到相机的尺寸是需要压缩的,故先将此时的坐标(x0,y0)归一化得到(x,y)。又因为camera通过中心坐标以代表相机位置,而(x,y)坐标的起始点(0,0)并不是中心,如下图所示。故,要将归一化的(x,y)变为相机size的“成像面”上的某点,则需要进行下图公式所示的变换:

         再来说明一下如何判断光线是否和场景中的物体有交点。这里需要说明一下,此次我仅完成了场景中只有球体的类型,如果要考虑其他几何体,只需根据各自几何体的特征,列出代数式子判断是否相交以及相交需要的时间即可,也可通过几何方式来计算。

        这一步的任务其实就是求光线和物体是否能在有效时间相遇,这里只讲代数方法。相遇即代表光线的方程和物体的方程相等有解,那么需要先把这二者表示出来,如下:

        令二者相等再求解即可,需要注意的是上图示意的球体的球心在坐标原点,实际上的球体可能在任意位置,则H(P) = (P-O)(P-O) - r^{2} = 0,在实际处理时,我直接将Ro减去了球体的球心。

        最终求出来的时间,需大于tmin(tmin是由相机属性决定的,对于正交相机认为光线起源于无限远的地方,故tmin最开始为-inf),若有两个物体都相交,则要选择距离相机更近的,即t更小的那个。

        对于深度图可以将其颜色按照灰度图来理解,颜色分布在[0,1],大于depth_max的深度限制为depth_max,小于depth_min的限制为depth_min,最终深度为\frac{depth_{max}-depth}{depth_{max}-depth_{min}}

 结果

github连接

Graphics-6.837/assignment 1 at main · A-pril/Graphics-6.837 · GitHub


http://www.ppmy.cn/news/786765.html

相关文章

Cesium无人机实时视频投射及关键点拍照展示

最近做了这个无人机实时视频投射的功能,其中介入了实时无人机的坐标数据、姿态以及视频流。 说下思路: 其中锥体用了自定义的geometry,视频面用的是polygon给的video材质,坐标用了samplepositionproperty进行储存,姿态…

系统架构设计师笔记第29期:人工智能技术

人工智能(Artificial Intelligence,AI)是指使机器能够模拟和展现人类智能的一门学科和技术。它涉及构建智能系统,使其能够感知、理解、学习、推理、决策和交互,以解决复杂的问题并执行各种任务。 人工智能的目标是使机…

算法刷题Day 29 递增子序列+全排列+全排列II

Day 29 回溯算法 491. 递增子序列 如果直接像下面这样写的话,会出错,出错的案例类似: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9nrEEc2S-1688623883770)(LC491-递增子序列LC.assets/image-20230703201315…

教你用手机模拟加密门禁卡-不用电脑,不ROOT手机

目标:将门禁卡、考勤卡、会员卡、停车卡、电梯卡等等各种卡模拟进手机里,模拟后可用手机代替刷卡,无需root,不用电脑 ## 背景介绍:1、前言  目前,IC卡已被广泛应用于身份识别、金融消费、安全认证等领域。…

android 判断有无sim卡,Android判断手机里是否有SIM卡

由于项目的需要,要判断手机里是否有sim卡。在网上找了一下资料结果发现,网上的资料很多都是一样的,都是判断sim卡的状态,把代码添加进去后发现不能满足需求。然后就自己看了一下文档。代码如下。 /** * author CX- * 判断 是否含有…

小米NFC手机复制加密IC门禁卡

几年没有发过任何文字信息了。闲来无事发一个NFC手机复制加密门禁卡的教程 思路: 第一步通过破解加密的门禁卡得到dump文件,获取卡号。修改dump文件只保留0扇区0块的内容也就是卡号,通过读卡器写入一张卡空白卡。这时就得到了一张未加密的白卡了。手机NFC可以模拟这张未加密…

Android手机无法识别SD卡的处理方法

1. 首先将SD卡放到读卡器中2. 使用Windows磁盘检查工具检查,选择“自动修复文件系统错误”,如果检查出有错误,再查一遍,直到提示“您的磁盘没有问题”。注:磁盘检查工具位置:SD卡的盘符上右键>属性>工…

连接手机、PC后,SD卡文件不显示怎么解决?

文章来源:https://www.reneelab.com.cn/sd-card-files-not-showing.html 目录 一、SD卡上文件不显示的原因二、如何恢复SD卡中丢失的数据三、SD卡修复方法的详细介绍1、检查SD卡的系统文件错误2、格式化SD卡3、使用Chkdsk修复损坏的SD卡 一、SD卡上文件不显示的原因…