2014-02-20 8 views
-4

그래서이 RT 코드는 원시 코드를 통해 흐림 효과가있는 3D 이미지를 만듭니다. 실제로 어떤 모델링 도구없이이 작업을 수행 할 수 있습니까?이 RayTracer 코드를 이해하는 법

저는 RT 작업과이를 구현하는 다른 방법을 이해하기 위해 현재 노력하고 있습니다. 그래서 매우 인상적인 3D 이미지를 생성하는 코드의 작은 양을 보니 멋있습니다.

#include <stdlib.h> // card > aek.ppm 
#include <stdio.h> 
#include <math.h> 
#include <fstream> 

typedef int i; 
typedef float f; 

struct v { 
f x, y, z; 
v operator+(v r) { 
    return v(x + r.x, y + r.y, z + r.z); 
} 
v operator*(f r) { 
    return v(x * r, y * r, z * r); 
} 
f operator%(v r) { 
    return x * r.x + y * r.y + z * r.z; 
} 
v() {} 
v operator^(v r) { 
    return v(y * r.z - z * r.y, z * r.x - x * r.z, x * r.y - y * r.x); 
} 
v(f a, f b, f c) {x = a; y = b; z = c;} 
v operator!() { 
    return*this * (1/sqrt(*this % *this)); 
} 
}; 
i G[] = {247570, 280596, 280600, 249748, 18578, 18577, 231184, 16, 16}; 
f R() 
{ 
return(f)rand()/RAND_MAX; 
} 
i T(v o, v d, f&t, v&n) 
{ 
t = 1e9; i m = 0; 
f p = -o.z/d.z; 

if(.01 < p)t = p, n = v(0, 0, 1), m = 1; 

for(i k = 19; k--;) 
    for(i j = 9; j--;)if(G[j] & 1 << k) { 
      v p = o + v(-k, 0, -j - 4); 
      f b = p % d, c = p % p - 1, q = b * b - c; 

      if(q > 0) { 
       f s = -b - sqrt(q); 

       if(s < t && s > .01) 
        t = s, n = !(p + d * t), m = 2; 
      } 
     } 

return m; 
} v S(v o, v d) 
{ 
f t; 
v n; 
i m = T(o, d, t, n); 

if(!m)return v(.7, .6, 1) * pow(1 - d.z, 4); 

v h = o + d * t, l = !(v(9 + R(), 9 + R(), 16) + h * -1), r = d + n * (n % d * -2); 

f b = l % n; if(b < 0 || T(h, l, t, n))b = 0; 

f p = pow(l % r * (b > 0), 99); 

if(m & 1) { 
    h = h * .2; 
    return((i)(ceil(h.x) + ceil(h.y)) & 1 ? v(3, 1, 1) : v(3, 3, 3)) * (b * .2 + .1); 
} return v(p, p, p) + S(h, r) * .5; 
} i 

main() 
{ 

FILE * pFile; 
pFile = fopen("d:\\myfile3.ppm", "w"); 
fprintf(pFile,"P6 512 512 255 "); 
v g = !v(-6, -16, 0), a = !(v(0, 0, 1)^g) * .002, b = !(g^a) * .002, c = (a + b) * -256 + g; 

for(i y = 512; y--;) 
    for(i x = 512; x--;) { 
     v p(13, 13, 13); 

     for(i r = 64; r--;) { 
      v t = a * (R() - .5) * 99 + b * (R() - .5) * 99; 
      p = S(v(17, 16, 8) + t, !(t * -1 + (a * (R() + x) + b * (y + R()) + c) *  16)) * 3.5 + p; 
     } 

     fprintf(pFile, "%c%c%c", (i)p.x, (i)p.y, (i)p.z); 

    } 
} 
+0

''이 (가) 포함되어 있지 않으면 C 코드라고 말합니다. 그리고 아주 못 생겼어. 소문자가 있다면, 한 문자의'struct' 이름은 정말 틀린 것 같습니다. – crashmstr

+0

@crashmstr C가 언제 연산자 과부하가 있습니까? :) –

+0

@ user3333072 우리가 무엇을 기대합니까? 이 코드를 한 줄씩 설명 하시겠습니까? 주제를 약간 좁히고 어떤 부분을 이해할 수 없습니까? – Hulk

답변

2

Paul Heckbert 코드가 맞습니까?

적어도 언급 할 수 있습니다. 이 코드를 생각하는 사람들을 위해

여기에, 읽을 이유 : http://www.cs.cmu.edu/~ph/

:

이 사람은 신용 카드에 저장할 수있는 코드를 만들어, 그 목표 :

그의 웹 사이트이었다

편집 :이 코드의 출처를 알면 이해하는 데 도움이 될 수 있습니다. 비록 당신의 주요 동기가 아니더라도 ...

레이 트레이싱에 관심이 있다면 다른 출처에서 시작하십시오. 이 웹 사이트를보십시오 http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-1-writing-a-simple-raytracer/source-code/ (플러스 코드에 대해 이야기합니다)

+1

그가 언급해야한다는 것에 동의하지만 귀하의 게시물은 답변이 아닙니다 : ( –

+1

@phresnel Paul Heckbert에 대해 기억하는 데 도움이됩니다. 나는 그의 질문에 정말로 대답 할 수는 없을 것이라고 생각하지만이 코드를 다음과 같이 이해할 수 있습니다. –

+0

@phresnel 몇 년 전에 나의 첫 번째 광선 추적기를 만들기 위해 따라 왔던 경로를 편집하여 답변했습니다. –

2

이 코드는 실제로 특별하지 않습니다. 그것은 기본적으로 레이 트레이서로서 명함에 적합하게 만드는 형태로 난독 화되었습니다 (https://www.cs.cmu.edu/~ph/ 참조).

실제로 모델링 도구없이 어떻게 이루어 집니까?

아무 것도 렌더링 할 도구가 필요하지 않습니다. 모델링 도구 없이도 WoW (또는 지금은 힙합)의 완벽한 게임을 만들 수도 있습니다. 모델링 도구로 생생한 작업을 간편하게 수행 할 수 있습니다. 어떤 종류의 장면 (읽기 : 매우 복잡한 장면).

항상 이러한 데이터를 하드 코딩하거나 수동으로 외부 파일에 해킹 할 수 있습니다.

파라 메트릭 생성기를 사용할 수도 있습니다. 펄린 노이즈 (Perlin Noise)는 그보다 보편적 인 예 중 하나입니다.

레이 트레이서에서는 렌더링 프리미티브 "레이"와 유한 기하학 프리미티브 사이의 기하학적 교차점을 계산하는 것이 매우 간단하므로 모델링 도구를 사용하지 않고 시작하는 것이 매우 간단합니다. 예를 들어, 근사가 아닌 "완벽한"구의 교차점은 몇 줄의 코드 일뿐입니다.

tl; dr : 데이터는 단지 데이터입니다. 당신이 그것을 창조하고 경작하는 방법은 당신에게 전적으로 달려 있습니다.

+0

TL; DR,이 코드는 bmp에 쓰는 중입니다. : p –

+0

@Mayerz : 오, 당신이 묻는 사람과 내가 모델링 도구의 다른 맥락을 의미한다는 것을 의미합니까? 마찬가지로 "나는 레이 트레이서 용 모델을 어떻게 얻습니까?"와 "모델링 툴에 임베드되지 않고 어떻게 작동 할 수 있습니까?"라고 생각했습니다. –