2017-02-02 1 views
0

私は現在、Cで単純なraytracerをコーディングしています。回転を除いて、すべてがうまくいきます。私は私のオブジェクト(その点でシリンダー)を回転しようとしています。シリンダーは回転しますが、シェーディングは完全にオフになり、オブジェクトは0°〜90°の間を回転し、360°で正常に戻ります(これは明らかです)。私が間違っていることに誰かが私にヒントを与えることができたら、私は感謝しています。ここにいくつかのサンプルコードがあります。シリンダーのための交差点を見つけるRaytracing Rotations

機能:

double  mininter; 
    double  inter; 
    t_vect  *normal; 
    t_color  *c; 
    t_cyl  *cyl; 

    cyl = e->scene.cyls; 
    mininter = -1; 
    while (cyl != NULL && limiter-- != 0) 
    { 
     ray = rotate_eye(ray, cyl->rotate, -1); 
     inter = cylinder_inter(cyl, ray); 
     if (inter > ACCURACY && (inter < mininter || mininter == -1)) 
     { 
      mininter = inter; 
      p = vect_add(ray->og, vect_mult(ray->dir, inter)); 
      ray = rotate_eye(ray, cyl->rotate, 1); 
      normal = cylinder_normal(cyl->og, p); 
      c = cyl->color; 
     } 
     cyl = cyl->next; 
    } 
    return (new_inter(normal, mininter, c, p)); 

マイrotation.cファイル:

static t_vect *x(t_vect *v, double rot, int stage) 
{ 
    rot = DEG_TO_RAD(rot * stage); 
    v->y = v->y * cos(rot) + v->z * -sin(rot); 
    v->z = v->y * sin(rot) + v->z * cos(rot); 
    return (v); 
} 

static t_vect *y(t_vect *v, double rot, int stage) 
{ 
    rot = DEG_TO_RAD(rot * stage); 
    v->x = v->x * cos(rot) + v->z * sin(rot); 
    v->z = v->x * -sin(rot) + v->z * cos(rot); 
    return (v); 
} 

static t_vect *z(t_vect *v, double rot, int stage) 
{ 
    rot = DEG_TO_RAD(rot * stage); 
    v->x = v->x * cos(rot) + v->y * -sin(rot); 
    v->y = v->x * sin(rot) + v->y * cos(rot); 
    return (v); 
} 

t_ray   *rotate_eye(t_ray *ray, t_vect *rot, int stage) 
{ 
    ray->og = x(ray->og, rot->z, stage); 
    ray->og = y(ray->og, rot->y, stage); 
    ray->og = z(ray->og, rot->x, stage); 
    ray->dir = x(ray->dir, rot->z, stage); 
    ray->dir = y(ray->dir, rot->y, stage); 
    ray->dir = z(ray->dir, rot->x, stage); 
    return (ray); 
} 

影/カラーファイル:

static double shadows(t_env *e, t_inter *inter) 
{ 
    t_ray  *iray; 
    t_vect  *v; 
    t_vect  *l; 

    l = e->scene.spot->pos; 
    v = new_vector(l->x - inter->point->x, l->y - inter->point->y, 
     l->z - inter->point->z); 
    iray = new_ray(inter->point, l); 
    return (calc_inter(e, iray)->dist); 
} 

t_color   *find_color_at(t_env *e, t_ray *ray) 
{ 
    t_color  *result; 
    t_inter  *mininter; 
    t_vect  *dist_l; 
    double  shade; 

    mininter = calc_inter(e, ray); 
    if (mininter->dist > ACCURACY) 
    { 
     dist_l = normalize(vect_add(e->scene.spot->pos, negative(ray->og))); 
     shade = dot_product(dist_l, mininter->normal); 
     if (shadows(e, mininter) > ACCURACY) 
      result = color_scalar(AMBIENTLIGHT * shadows(e, mininter), 
       mininter->color); 
     else 
      result = shade < 0 ? color_scalar(AMBIENTLIGHT + DIFFUSELIGHT * 
       0, mininter->color) : color_scalar(AMBIENTLIGHT + 
       DIFFUSELIGHT * shade, mininter->color); 
    } 
    else 
     result = new_color(0, 0, 0); 
    return (result); 
} 

一部screeshots。

シーンファイル:0°回転

camera: 
pos: 
0, 0, 100 
dir: 
0, 0, 0 
---- 
spheres: 
new: 
pos: 
20, 0, 20 
radius: 
30 
color: 
42, 255, 255 
---- 
---- 
cylinders: 
new: 
pos: 
-20, 0, -30 
radius: 
20 
color: 
255, 42, 23 
rotate: 
0, 0, 0 
---- 
---- 
spot: 
pos: 
50, 0, 150 
---- 
END 

https://gyazo.com/6ab10dbfba27a889ac6397c30aa4adda

シーンファイル:42°回転

camera: 
pos: 
0, 0, 100 
dir: 
0, 0, 0 
---- 
spheres: 
new: 
pos: 
20, 0, 20 
radius: 
30 
color: 
42, 255, 255 
---- 
---- 
cylinders: 
new: 
pos: 
-20, 0, -30 
radius: 
20 
color: 
255, 42, 23 
rotate: 
42, 0, 0 
---- 
---- 
spot: 
pos: 
50, 0, 150 
---- 
END 

https://gyazo.com/f244f6c7e2d2a81b6001fc175c16c289

シーンファイル:91°回転

camera: 
pos: 
0, 0, 100 
dir: 
0, 0, 0 
---- 
spheres: 
new: 
pos: 
20, 0, 20 
radius: 
30 
color: 
42, 255, 255 
---- 
---- 
cylinders: 
new: 
pos: 
-20, 0, -30 
radius: 
20 
color: 
255, 42, 23 
rotate: 
91, 0, 0 
---- 
---- 
spot: 
pos: 
50, 0, 150 
---- 
END 

ます。https://gyazo.com/86cda440cfca079d07e04d1ef19b8a21

ものは、事前に感謝を助けます!

+0

あなたの回転行列は非従来型のようです。 [here](https://en.wikipedia.org/wiki/Rotation_matrix) –

答えて

1

X軸の周りにあなたの回転を考慮してください。Yは、入力ベクトルの座標が

static t_vect *x(t_vect *v, double rot, int stage) 
{ 
    rot = DEG_TO_RAD(rot * stage); 
    v->y = v->y * cos(rot) + v->z * -sin(rot); 
    v->z = v->y * sin(rot) + v->z * cos(rot); 
    return (v); 
} 

注意がのYZ座標の両方に寄与結果ベクトル。計算結果zの計算で実際に使用しているのは入力yではなく、計算結果yです。これは誤りです。

他の回転機能も同様です。

+0

私のコードを変更し、入力値で計算しました。私はこの結果を得た:https://gyazo.com/ce3e4c35fefa3eb29d9804e4395ca2fb シリンダーの上部に影があることを感じる。すべての手がかりは?ありがとう。 – Exilia

+0

心配しないで、私は交差点を計算するときに再び回転する必要がありました。私はまだ私のシャドーイングについていくつかのことを理解しなければなりませんでしたが、あなたは十分な以上にしました。再度、感謝します ! – Exilia

関連する問題