Ray Casting:光线投射

这篇具有很好参考价值的文章主要介绍了Ray Casting:光线投射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

目录

原理

 结果

github连接


原理

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

raycasting,MIT-Graphics,技术美术,线性代数,图形渲染

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

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的“成像面”上的某点,则需要进行下图公式所示的变换:

raycasting,MIT-Graphics,技术美术,线性代数,图形渲染

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

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

raycasting,MIT-Graphics,技术美术,线性代数,图形渲染

raycasting,MIT-Graphics,技术美术,线性代数,图形渲染

raycasting,MIT-Graphics,技术美术,线性代数,图形渲染

        令二者相等再求解即可,需要注意的是上图示意的球体的球心在坐标原点,实际上的球体可能在任意位置,则,在实际处理时,我直接将Ro减去了球体的球心。

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

raycasting,MIT-Graphics,技术美术,线性代数,图形渲染

        对于深度图可以将其颜色按照灰度图来理解,颜色分布在[0,1],大于depth_max的深度限制为depth_max,小于depth_min的限制为depth_min,最终深度为

 结果

raycasting,MIT-Graphics,技术美术,线性代数,图形渲染raycasting,MIT-Graphics,技术美术,线性代数,图形渲染

raycasting,MIT-Graphics,技术美术,线性代数,图形渲染raycasting,MIT-Graphics,技术美术,线性代数,图形渲染

github连接

Graphics-6.837/assignment 1 at main · A-pril/Graphics-6.837 · GitHub文章来源地址https://www.toymoban.com/news/detail-610758.html

到了这里,关于Ray Casting:光线投射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 『OPEN3D』1.7 Ray Casting

                    ray casting(光线衍射) 和 ray tracing(光线追踪)都属于计算机图形学内的基础方法;用于对三维的实体建模和图片渲染;ray casting一词来自于General Motors Research Labs from 1978–1980;出自论文《Ray Casting for Modeling Solids》。ray casting 极大的简化了3D物体或场景到图片的

    2024年02月06日
    浏览(36)
  • Unity 关于Ray、RaycastHit、Raycast及其使用

    Unity中,我们要进行物理模拟和碰撞检测时,有三个重要的概念Ray、RaycastHit、Raycast。 其中,Ray可以理解为射线,它是一条从起点沿着特定方向延伸的无限长线段。 它的语法是: 它定义了两个参数,一个起点位置和一个方向,通过Ray射线,可以用来模拟子弹、光线、玩家视线

    2024年02月03日
    浏览(46)
  • Physics.Raycast

    Physics.Raycast 是 Unity 中用于检测物体之间碰撞的函数之一。它使用一条射线来检测场景中的物体,返回一个 bool 值表示是否检测到了碰撞,以及一个 RaycastHit 结构体存储着射线碰撞到的物体的信息。 Physics.Raycast 的完整签名如下: 该函数的参数如下: ray :一条用于检测碰撞的

    2024年02月12日
    浏览(42)
  • 【工具】Raycast – Mac提效工具

    🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​ 💫个人格言: \\\"如无必要,勿增实体\\\" 以前看到同事们锁屏的时候,不知按了什么键,直接调出这个框,然后输入 lock 屏幕就锁了。 跟我习惯的按 Mac 开机键不大一样。个人觉得还是蛮炫酷的~ 但是由于

    2024年03月10日
    浏览(54)
  • Unity中Physics.Raycast 的使用

    Physics.Raycast 官方文档中提供的参数如下    Physics.Raycast 从指定的位置发射一条射线,如果射线与物体发生碰撞返回true否则返回false 其中射线的起点,方向是不可以省略的,其他参数可以省略 案例▼ 第1,2个参数定义了一条射线的起点与方向 第3个参数为RaycastHi用以从射线获

    2024年02月08日
    浏览(44)
  • Unity 之 RaycastHit(存储射线投射操作)

    RaycastHit 类是 Unity 中的一个结构,用于存储射线投射操作的结果。射线投射是一种常用的技术,用于检测场景中的碰撞、获取碰撞点、获取碰撞对象的信息等。 RaycastHit 提供了关于射线与场景中对象的交互信息,包括碰撞点、碰撞法线、碰撞对象等。以下是关于 RaycastHit 的详

    2024年02月05日
    浏览(38)
  • Unity 之`Physics.Raycast()`方法,射线检测

    当你在Unity中使用 Physics.Raycast() 方法时,你实际上是在进行一种射线检测,以查看一条射线是否与场景中的碰撞体相交。这可以用来实现很多不同的功能,如点击选择物体、射击命中检测等。以下是 Physics.Raycast() 方法的详细介绍: 参数解释: origin :射线的起点(3D世界坐标

    2024年02月11日
    浏览(41)
  • Android11去掉Setings里的投射菜单条目

    Android11去掉【设置】--【已连接的设备】--【连接偏好设置】里的投射菜单条目,具体如下:

    2024年02月10日
    浏览(42)
  • unity,Physics2D.Raycast函数

    Unity中用于进行2D射线检测的函数:Physics2D.Raycast。它会从给定的起点位置发射一条射线,检测是否与场景中的2D物体相交,并返回相交的信息。 Physics2D.Raycast函数的作用是进行2D射线检测,主要用于以下场景: 在2D游戏开发中,射线检测是一个常用的技术,可以用于实现多种功

    2024年02月01日
    浏览(79)
  • Unity UGUI的GraphicRaycaster(射线投射)组件的介绍及使用

    GraphicRaycaster是Unity UGUI系统中的一个组件,用于处理射线投射事件。它可以将射线投射到UI元素上,并检测是否有UI元素被点击或触摸到。 GraphicRaycaster通过射线投射的方式来检测UI元素的点击事件。当用户点击屏幕或触摸屏幕时,GraphicRaycaster会发射一条射线,然后检测射线是

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包