Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 作业6 做完了4步之后运行仍是一片蓝

Tagged: 

Viewing 6 reply threads
  • Author
    Posts
    • #5041 Score: 3
      FlowingCrescent
      Participant
      3 pts

      如题,排查了数个小时,还是没能发现到底是哪里出了纰漏,程序也没有报错。因为不方便直接贴代码,我大概地描述一下我在这4步中具体做了什么,还请各位大佬帮忙看看有没有什么问题。

      第一步,将上次作业中的计算复制了过来(替换了本来框架中的x,y计算),并且根据新的eye_pos计算了dir,然后创建一个了一个新的Ray(Ray(eyes_pos, dir, 0)),然后framebuffer[m++] = scene.castRay(ray, 0)

      第二步,判断t_tmp是否小于0,小于0则直接返回inter,反之则进行inter的happened、coords、normal、distance的赋值,再返回inter。

      第三步,使用pMin与pMax的x/y/z数值分别减去ray.origin.x/y/z,并将结果分别乘以invDir.x/y/z来计算进入以及离开各个轴对齐平面的时间值,计算完后判断方向是否为负,比如,若(!dirIsNeg)成立,则将计算出的t_xMax与t_xMin取相反数,并交换值。最后取计算出的三个“出去值”的最小值,三个“进入值”的最大值,若“最小出去值”大于“最大进入值”,则返回true,否则返回false

      第四步,声明并初始化一个std::array作为之后要传入的dirIsNeg,然后使用node->bounds.IntersectP()进行相交判断,若相交,则判断是否为叶节点(node->right == nullptr),若是,则返回 node->object->getIntersection(ray)。若不是,则对两个叶节点进行递归,获取hit1与hit2之后根据其distance来判断距离,返回distance较小的Intersection。若打从一开始光就不与这个节点相交,那就返回Intersection()。

      因为反复确认后仍发现不了哪里错,猜测可能是我在某处的思维上就已经陷入了误区,还请各位大佬指出。
      顺便说点题外话,还是更喜欢之前有几次的作业,每一步都能进行运行调试,并且出来一个对应结果,很容易就知道具体哪一步写错了,这次的作业要做到最后才能知道做得对不对,也不好排查,实在难受……

      This post has received 3 votes up.
    • #5044 Score: -1
      Bear
      Participant
      -11 pt

      愿意看完的绝对是好人。。。我觉得你可以想想简洁的表达方式

      This post has received 1 vote down.
      • #5045 Score: 0
        FlowingCrescent
        Participant
        3 pts

        emmm…因为如果想要直观的话就会是贴代码了,但是也不知道具体是哪里有问题,一下子全贴的话当然也不好……相当无奈……

    • #5048 Score: 0
      夏莉莉
      Participant

      我想请问一下楼主的inter.distance 和 inter.coords是怎么赋值的,我不太理解这两个量。

      • #5066 Score: 0
        FlowingCrescent
        Participant
        3 pts

        distance我用的t,而coords用ray.origin + t * ray.dir算的

        • #5073 Score: -1
          zsw
          Participant
          -2 pt

          请问一下coords代表的是什么呀= = 我之前用的v3f(1-v-u,u,v),怪不得显示的不对

          This post has received 2 votes down.
          • #5263 Score: 0
            Keneyr
            Participant
            6 pts

            //inter.coords = u*v0 + v*v1 + (1-u-v)*v2;
            我这么写的,我不明白这为啥不对?我觉得解释起来也没问题啊,就是插值呗

            • #6560 Score: 0
              wuzhou
              Participant

              这个指得是光线打中的地方的坐标,具体的用法在 Scene::castRay 这个方法里。

              • This reply was modified 2 years, 3 months ago by wuzhou.
    • #5061 Score: 0
      奋斗的蜗牛
      Participant
      3 pts

      第二步:inter.obj, m是否有赋值呢?
      第三步:为什么要取相反数……

      • #5063 Score: 0
        FlowingCrescent
        Participant
        3 pts

        obj不知道如何赋值……m的话我发帖后试了一下,暂时没作用。关于第三取相反数确实是我想得有问题,这里时间可以是负的,不过改了之后也同样……

    • #5065 Score: 2
      奋斗的蜗牛
      Participant
      3 pts

      赋值的话……
      inter.obj = this;
      inter.m = m;

      This post has received 2 votes up.
      • #5067 Score: 0
        FlowingCrescent
        Participant
        3 pts

        原来是this吗……赋值了之后确实能看见兔子了,不过还有点小问题,我自己再改一下,万分感谢!

      • #5069 Score: 0
        YY
        Participant
        1 pt

        十分感谢,终于成了。语言不熟,这个this卡了几个小时,一直找不到问题出在哪。

        • #5133 Score: -1
          Troy
          Participant
          -1 pt

          真心的,这作业代码量和注释量的比例简直逆天了,其实每次作业都不怎么难,难在理解这代码框架到底在说啥…
          看论坛里的一些帖子能看出很多同学对于C++并不很熟悉,这时候如果有文档可查或者有丰富的注释解释一下作业框架背后的功能就十分重要了,希望以后能稍微改进一下

          This post has received 1 vote down.
          • #5318 Score: 0
            kingil
            Participant
            1 pt

            确实需要cpp的一些功底,再不济oop要懂一些。这个确实没办法,该补的课自己还是要补的,老师开课的时候也说了。

      • #5139 Score: 0
        戴皓天
        Participant
        9 pts

        非常感谢!
        之前对框架里obj的赋值感到很疑惑,卡了好久,这样一说就明白了

    • #5317 Score: 0
      kingil
      Participant
      1 pt

      我觉得吧,代码框架老师的意思就是让我们一步步去仔细研究。
      本来整个算法里面我们写的就没几句代码,再把代码调用、计算等注释完全说清楚了,你就根本不会去探究到底怎么调用怎么计算的。
      个人看法,确实讲道理一句句去看确实挺恶心的,这次作业光看调用的框架就看了半天。。。

      This post has received 1 vote up and 1 vote down.
    • #6691 Score: 0
      ijrys
      Participant

      我也是出来纯蓝,折腾了下能出现一个黑色三角形了~
      现在都想自己从0写一份代码了都

Viewing 6 reply threads
  • You must be logged in to reply to this topic.