2015-09-22 140 views
2

我想做一個編程RayTracerJava爲演示目的,同時給出關於一般射線追蹤的介紹(也提到3D,這個2D模型應該只是爲了更容易理解,並且訓練我的一般Java知識)。二維射線追蹤算法

我的問題是,我不知道從哪裏開始這件事。

我想嘗試的第一件事就是使用矢量從給定的座標(例如我的鼠標光標的位置)跟蹤屏幕上的每個像素。然後,我會計算矢量是否與一個多邊形相交,然後我將停止該矢量並將其僅繪製到該特定點。

也許我甚至可以通過計算法線來繪製一些陰影,並以較低的強度在另一個方向反射向量。

那麼從A = {everypixelonthescreen}繪製一個矢量到一個特定的Point P並計算交點是個好主意嗎?

完成的版本應該看起來有點像這樣:

enter image description here

回答

4

恐怕您提出的這種光線跟蹤應用程序更容易讓人誤解,然後才能使用真正的3D光線跟蹤器。

  • 2D射線示蹤劑用於有點不同
  • ,這可能會迷惑你的觀衆很多

我會嘗試選擇更天然的2D光線跟蹤使用情況,如:

  1. 光學模擬

    這是用於模擬鏡頭和鏡像光學器件。從礦山古2D光線跟蹤模擬的一個形象在這裏:

    optic sim

    1. 存儲你的世界

      您在折線+衍射指數和鏡子也爲折線的形式得到了鏡頭。你擁有世界衍射指數

    2. 鑄造的R,G,B光線從光

      鑄重要只或全部的人源。使用斯涅耳定律來模擬光學

    正如你所看到的色彩誤差可見(每種顏色都有自己的波長,衍射指數是不同的)。您也可以使用MultiBand rendering

    我用這個調整定製光纖系統,如果你添加drag&drop能力你有光學實驗室

  2. 德軍總部演示

    這個僞3D遊戲使用2D光線投射引擎看到Wiki: Wolfenstein_3D_engine。這張照片是從這個鏈接採取:

    wolf3d

    1. 一次抽籤地板和天花板/天爲2個半屏(屏幕由水平線劃分)
    2. 那麼你有你的迷宮/世界的2D地圖(右)

      因此從所有可見方向投射射線當前位置(類似於您的圖像,但通常使用60度視圖)。光線必須以亞像素(單元)精度完成。你的光線在牆上(在地圖上)獲得子像素(單元)的位置。它指示哪個紋理牆壁的一部分被擊中

    3. 拉伸適當列(垂直線)在屏幕上對每條射線擊中

      的大小和它比例由距離形式射線原點定量。如果我的記憶是通過僅使用垂直距離(乘以cos(ray_angle-player_angle)的乘積距離)完成的,則應用魚眼校正。什麼,我剛纔破獲爲了好玩

    這裏例如:

    my Wolf3D

    它在C++純GDI做(只使用位圖掃描線)沒有其他屆黨庫在所有。它使用單一紋理,漫反射+環境照明,2D光線投射。有2個位圖(屏幕,紋理圖集)和單個2D地圖。代碼小於9 KByte,包括rems。它僅受鍵盤控制(鼠標用於在地圖子窗口中編輯迷宮)。

    這裏動畫GIF 例如

    Wolf3D

    如果你有興趣看到相關的QA:

+0

@Einstein見[2D raycasting李在GLSL中的ght效應](http://stackoverflow.com/a/34708022/2521214) – Spektre

0

據我瞭解,這個問題將具體分析。給定某個位置(鼠標的當前位置或類似的位置),環境會從某個角度範圍內(如90度,在您的圖片中看起來像360度)跟蹤。在所需的角度分辨率下,來自初始位置的光線與所提到的多邊形相交。最近的交點被渲染。這種方法應該給出從給定位置「可見」的點。