私は自分のコンピュータグラフィックスクラス用のレイトレーサープログラムを書いています。これまでのところ、実装されている球とシャドウレイのみがあります。現在の問題は、球を中心から外すと伸びるということです。光線が球と交差しているかどうかを計算するために使用するコードは次のとおりです。
bool Sphere::onSphere(Ray r)
{
float b = (r.dir*2).innerProduct(r.pos + centre*-1);
float c = (r.pos + centre*-1).innerProduct(r.pos + centre*-1) - radius*radius;
return b*b - 4*c >= 0;
}
これが私が各光線をスポーンするために使用するコードです:
for(int i = -cam.width/2; i < cam.width/2; i++)
{
for(int j = -cam.height/2; j < cam.height/2; j++)
{
float normi = (float)i;
float normj = (float)j;
Vector pixlePos = cam.right*normi + cam.up*normj + cam.forward*cam.dist + cam.pos*1;
Vector direction = pixlePos + cam.pos*-1;
direction.normalize();
Vector colour = recursiveRayTrace(Ray(pixlePos, direction), 30, 1, 0);
float red = colour.getX()/255;
float green = colour.getY()/255;
float blue = colour.getZ()/255;
fwrite (&red, sizeof(float), 1, myFile);
fwrite (&green, sizeof(float), 1, myFile);
fwrite (&blue, sizeof(float), 1, myFile);
}
}
recursiveRayTrace:
Vector Scene::recursiveRayTrace(Ray r, float maxDist, int maxBounces, int bounces)
{
if(maxBounces < bounces)
return Vector(0,0,0);
int count = 0;
for(int i = 0; i < spheres.size(); i++)
{
if(spheres.at(i).onSphere(r))
{
Vector colour(ambiant.colour);
for(int j = 0; j < lights.size(); j++)
{
Vector intersection(r.pos + r.dir*spheres.at(i).getT(r));
Ray nRay(intersection, lights.at(i).centre + intersection*-1);
colour = colour + lights.at(i).colour;
}
return colour;
}
}
return Vector(0,0,0);
}
私が得るのは、円の中心から中心へとベクトルの方向に引き伸ばされた球です。宿題をしてくれる人を探していません。私はこれをデバッグするのに本当に苦労しています。ヒントは大歓迎です:)ありがとう!
編集:cam.distは、カメラからビュープレーンまでの距離です