2015-12-29 2 views
0

В моем расовом двигателе у меня есть эта действительно раздражающая ошибка. Если игрок приближается к объекту, возникает огромный эффект линзирования. Я уже посмотрел на этот вопрос и попытался исправить его. Вот код в моей текущей реализации части raycasting (он находится в моем методе рисования). Затем я рисую текст на экране.Lensing in my raycasting engine

double distance; 
double lineHeight=-1; 
double angleOff;    
double angleCast; 
for(int i=0;i<900;i++){ 
    //i is the line across from the side. 
    angleOff=Math.atan(((i-450.0)/4000.0)/.1); 
    boolean hit=false; 
    board.setColor(GameFrame.m.getBackground()); 
    board.drawLine(i, 922, i, 0); 
    for(double rayDist=0;!hit;rayDist+=.01){ 
     try{ 
      char block=Map.map[(int) (Map.p.x+Math.sin(angleOff+Map.p.angle)*rayDist)][(int) (Map.p.y-Math.cos(angleOff+Map.p.angle)*rayDist)]; 
      if(block!='o'){ 
       lineHeight=800/(rayDist*Math.abs(Math.cos(angleOff+Map.p.angle))); 
       switch(block){ 
        case 'w': 
         board.setColor(Color.BLACK); 
         break; 
        case 'z': 
         board.setColor(Color.red); 
         break; 
        case 'g': 
         board.setColor(Color.green); 
         break; 
        case 'a': 
         board.setColor(Color.DARK_GRAY); 
         break; 
       } 
       hit=true; 
      } 
     }catch(Exception e){ 
      hit=true; 
      lineHeight=800/(rayDist*Math.abs(Math.cos(angleOff+Map.p.angle))); 
      board.setColor(Color.black); 
     } 
    } 

    board.drawLine(i,(int) (461-(lineHeight/2)), i,(int) (461+(lineHeight/2))); 
} 

Обратите внимание, что Map.p.angle угла (от лицевой стороны вверх) в радианах объекта игрока. Также обратите внимание, что Карта хранится как char[][], где «w» - стена, «z» - зомби, «g» - это пушка, а «а» - боеприпасы. Если кто-то может сообщить мне, что вызывает этот объектив, я буду очень благодарен. Вот некоторые скриншоты Нормальная функция See how currently it looks (passably) 3d Bug Note the huge fisheye lensing effect Еще изображения enter image description here

Если кто-нибудь может мне сказать, что коррекция должна применяться я буду очень доволен.

ответ

0

Обнаружили проблему. Это я эта линия lineHeight = 800/(rayDist Math.abs (Math.cos (angleOff + Map.p.angle))); он должен быть lineHeight = 800/(rayDist Math.abs (Math.cos (angleOff))); это сделало мой код хорошо работать при углах около 0, но чем больше угол, тем больше искажений