【问题标题】:Light/Ray casting in java?java中的光/射线投射?
【发布时间】:2013-09-10 13:03:18
【问题描述】:

我一直在尝试在 java 中制作一个动态灯光系统,而不使用库。但是,出于某种原因,我似乎无法获得光线以有效地运行。它闪烁并滞后一吨。我这样做之前对游戏中的光照引擎一无所知,所以我愿意接受建议。这是我目前的更新方法:

public void updateLight( ArrayList<Block> blocks )
    {
        //reset light
        light.reset();
        //add the x and y of this light
        light.addPoint( x, y );

        //precision for loops
        int ires = 1;
        int jres = 2;

        for( int i = 0; i < width; i += ires )
        {
            //get radians of current angle
            float rdir = (float)Math.toRadians( dir + i - width/2 );

            //set up pixel vars
            int px, py;

            for( int j = 0; j < length; j += jres )
            {
                //get position of pixel
                px = (int)ZZmath.getVectorX( x, rdir, j );
                py = (int)ZZmath.getVectorY( y, rdir, j );

                //if point gets found
                boolean foundpoint = false;

                for( int n = 0; n < blocks.size(); n ++ )
                {
                    //check if block is solid
                    //also check that collision is possible really quickly for efficiency
                    if( blocks.get( n ).solid )
                    {
                        //get info on block
                        int bx = blocks.get( n ).x;
                        int by = blocks.get( n ).y;

                        //quick trim
                        if( Math.abs( bx - px ) <= 32 && Math.abs( by - py ) <= 32 )
                        {
                            int bw = blocks.get( n ).w;
                            int bh = blocks.get( n ).h;

                            if( ZZmath.pointInBounds( px, py, bx, by, bw, bh ) )
                            {
                                //add point to polygon
                                light.addPoint( px, py );
                                //found point
                                foundpoint = true;
                            }
                        }
                    }
                }

                //if a point is found, break
                if( foundpoint )
                {
                    break;
                }

                //if at end of loop, add point
                //loose definition of "end" to prevent flickers
                if( j >= length - jres*2 )
                {
                    light.addPoint( px, py );
                }
            }
        }
    }

这会修改显示灯光的多边形。我稍后会改变它。有什么方法可以让这个运行更好吗?此外,不,没有图书馆。我对他们没有任何意见,只是现在不想使用。

【问题讨论】:

  • 你能描述一下你的过程吗?
  • 灯光对象有宽度、长度和方向(方向)。光照更新方法遍历宽度,然后是长度,并根据 dir 定位一个像素。然后,它会检查所有块(我游戏中的另一个类)是否有坚固的块(不要让光线通过)。然后它会进行快速启发式“是否可能”检查,然后进行碰撞检查。如果它发生碰撞,那么它会向用于渲染的多边形添加一个点。如果它从来没有,然后达到最大长度,它会在那里增加一个点。然后,为了渲染,我只是在屏幕上拍打多边形。
  • 这还不清楚。我们没有看到物体光的代码,但看起来它有一个点的集合,每个点都有一个宽度、长度和方向。如果它有效,我会写一个答案。

标签: java light raycasting


【解决方案1】:

你的实现似乎没有使用我在这里看到的很多东西:

http://www.cs.utah.edu/~shirley/books/fcg2/rt.pdf

我建议完全消化这个。如果您的目标是深入了解光线追踪,那就应该这样做。

【讨论】:

    【解决方案2】:

    也许您的目标是通过编写自己的光线追踪器来学习。根据我的经验,我最终会多次重写这段代码,但仍然不能完全正确。弄脏你的手是件好事,但不一定是最有效的处理方式。

    总体而言,您似乎需要学习(面向对象)编程概念,并参加数据结构和算法课程。

    最重要的是可读性。记录你的代码,如果没有其他人的话,为了你未来的自己。这意味着在updateLight() 之前和期间清除 cmets。现有的 cmets 还可以(尽管他们解释代码而不是证明它),但是“为了效率真的很快”是个谎言。

    对于可能对性能造成微小拖累的可读性小问题,请为 blocks.get(n) 创建一个局部变量。将其命名为简短但具有描述性的名称,节省输入,只需调用一个方法即可检索它。

    “如果在循环结束”:我不知道你指的是哪个循环,for 循环有明确的结束。评论 }//end for 或 }//end for width 通常很有帮助。

    不需要检查方块是否坚固!只需将您的块存储在两个列表中,并且只通过实心块。即使您希望拥有闪烁的块,一次删除和添加也比 O(width*length*numbernotsolid) 额外的工作便宜。

    您可以通过多种方式构建块的存储方式,以方便快速测试。您只想或需要测试坐标接近特定灯光的块。基本策略是将空间划分为网格,并根据块所在网格的哪个部分进行排序。然后,当您在网格的特定部分有光时,您知道您只需要测试该部分中的块(可能还有相邻部分 - 详细信息取决于它们的宽度和灯光)。

    我不知道这是否符合正确的方法。我对光线追踪知之甚少,尽管它现在或过去相当慢。看起来你有一个体面的幼稚实现。可能有一种稍微不同的幼稚方法,它更快,一些更难(编码完成)的算法中等但更快。

    另外,我认为没有必要先做这个广度。为什么不一次解决一条线(你称它们为像素?)。计算此代码调用Math.toRadians 的次数。看起来这只是一条无关紧要的线,因为您可以沿着相同的角度工作,直到准备好下一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2016-10-14
      相关资源
      最近更新 更多