2

그래서 C++로 작성된 오래된 광선 추적 프로그램을 다시 작성하고 C#에서 XNA 프레임 워크를 활용하기로 결정했습니다.XNA를 사용한 광선 추적에 대한 World View 투영 매트릭스 질문에 혼동이 있음

나는 아직도 나의 오래된 책을 가지고 있고 노트를 따라갈 수있다. 그러나 나는 약간의 아이디어와 관련하여 혼란 스럽다. 그리고 누군가가 그것을 멋지게 표현할 수 있는지 궁금해하고 있었다. 위의 코드 U '및 v'에서

 

    for each x pixel do 
     for each y pixel do 
     //Generate Ray 
     //1 - Calculate world coordinates of current pixel 
      //1.1 Calculate Normalized Device coordinates for current pixel 1- to -1 (u, v) 
      u = (2*x/ WIDTH) - 1 ; 
      v = (2*y/HEIGHT) - 1 ; 
      Vector3 rayDirection = -1*focalLength + u'*u + v'*v 

 

내가 책을 따라 그에게 방법을 할 경우

(I는 같은 이름이 혼동하게 알고) 지정된 카메라에 대해 계산 된 orthnormal의 기초가된다 표현, 그것은 작동합니다. 그러나 XNA를 활용하고 동일한 작업을 수행하는 방법에 혼란 스럽지만 매트릭스를 사용하려고합니다.

그래서 나는이 방향 벡터를 얻기 위해 적용하기로하고있는 XNA 코드 그것은이 시점에서의

 

    class Camera 
     { 
      public Camera(float width, float height) 
      { 
      AspectRatio = width/height; 
      FOV = Math.PI/2.0f; 
      NearPlane = 1.0f; 
      FarPlane = 100.0f; 
      ViewMatrix = Matrix.CreateLookAt(Position, Direction,this.Up); 
      ProjectionMatrix=Matrix.CreatePerspectiveFieldOfView(FOV, 
               AspectRatio,NearPlane,FarPlane); 
      } 
     } 
 

내가 작업의 순서로 혼란 스러워요과 함께 다음 단계를 대체하려고했습니다 어떤 픽셀 (x, y)에 대해서? 내 머리 내가 생각하고 있어요에서

: 는 (u는, V) = ProjectionMatrix * ViewMatrix * ModelToWorld * 정점은

(모델 공간에서) 그러므로 감각을 만들 것 그 세계 공간에서

정점 (

또한 정사각형이기 때문에 뷰 매트릭스가 전조 될 수있는 방법에 대해서도 기억하고 있습니다.

+0

에서 카메라를 기준으로 좌표 넣어. 예를 들면 다음과 같습니다. http://www.scratchapixel.com/lessons/3d-basic-rendering – user18490

+1

이것은 아주 오래된 질문입니다.하지만이 스레드는 여러분이 묻는 것과 똑같은 것을 검색했습니다. @FreaknBigPanda의 답은 실제로 대답이 아닙니다. 기본적인 질문은 광선 추적기 (카메라 위치, 방향, 초점 거리 등)에 대한 매개 변수가 주어지면 변환 및 투영 행렬을 어떻게 구합니까? 이는 외부에서 수행되는 작업을 레이 트레이서의 출력과 결합해야 할 때 특히 유용합니다. 대답을 알아 냈어? – TSGM

답변

-1

는 NDC 이유는 임의의 크기의 이미지 (반드시 1 : 1)로 픽셀 이미지 높이/폭을 매핑 할 수 있음이다 : 당신이 원하는

  1. 다음이었다 내가 이해 본질적으로 무엇을 픽셀 X & Y를 -1에서 1까지 균일 한 사각형으로 변환합니다 (본질적으로보기 프레임 내에서 카메라 중심에 위치).
  2. FOV, 종횡비 및 근거리 평면을 사용하여 역 투영 행렬을 수행하여 픽셀을 배치합니다 (NDC 좌표)를 월드 공간 좌표로 변환
  3. 카메라 행렬의 역은 세계 공간은 www.scratchapixel.com에서 찾을 수 있습니다 찾고있는 설명의 대부분
  4. 계산 방향
1

Theres는 광선 추적을 위해 매트릭스를 사용할 필요가 없습니다. 투시 투영은 시스템 밖으로 떨어집니다. 이는 광선 추적의 이점 중 하나입니다.

ur 의견이 혼란 스럽습니다.

// 1 - //1.1 정규화 장치 -1로 현 픽셀 1- 좌표 계산 세계 현재의 픽셀의 좌표를 계산 (U, V) 그래서 돈을 광선 추적 어떤 역할이 그다지

NDC 네가 여기서 무슨 말을하는지 알지 못한다. 이 코드로 수행하고있는 모든 작업은 월드 공간에 설정 한 픽셀의 가상 그리드를 기반으로 광선에 대한 방향 을 계산합니다. 광선을 추적하여 그 광선이 과 교차하는지 확인하십시오.

정말 지금은 다른 공간에 대해 걱정할 필요가 없습니다. 모든 것을 세계 코디네이트에 넣고 하루 만 부르면됩니다. 복잡한 모델 (스케일 회전 및 똥과 같은 모델 변환)을 수행하려면 모델 -> 세계 변환이 필요할 수도 있지만 처음으로 광선을 쓰는 경우 추적 프로그램을 사용하면 해당 내용을 걱정할 필요가 없습니다.

XNA를 사용하려는 경우 해당 카메라 클래스를 사용할 수 있지만 일부 멤버는 쓸모가 없을 것입니다. 즉 성직자 및 근/원 평면.