球体的法线不正确

时间:2014-04-14 21:14:09

标签: javascript raytracing

每当我尝试绘制球体的normals时,我的光线追踪器会给出一些奇怪的结果。

我的Ray的来源为o,方向为dir

我的Sphere有一个中心c和一个半径r

我从世界空间交叉点和球体的世界空间中心之间的归一化差异得到我的圆的半径,我试图得到正常的:

exports.Sphere.prototype.getNormal = function(point) {
   var n = math.normalize(math.subtract(point, this.c));
   return n;
};

从光线/球体交叉算法(这里是重要部分)中找到t之后,从抛物线方程中找到了这一点:

distProjToSphereSqrt = math.magnitude(math.subtract(projSphereRay, sphere.c));
distToCollisionPoint = Math.sqrt(
        (sphere.r * sphere.r) - (distProjToSphereSqrt * distProjToSphereSqrt));
if (math.magnitude(raySphereDist) > sphere.r) {
   t = (math.magnitude(
           math.subtract(projSphereRay, ray.o)) - distToCollisionPoint);
}
else {
   t = (math.magnitude(
           math.subtract(projSphereRay, ray.o)) + distToCollisionPoint);
}
var point = ray.getPoint(t);
return new math.CollisionRecord(
        t, point,
        math.normalize(math.subtract(point, sphere.c)));

我真的认为大部分都是正确的。但是,我认为我得到了不正确的正常计算,因为虽然我的球体的轮廓被正确绘制,但我的光照计算似乎没有了。为了验证正常问题,我将法线绘制到屏幕上并得到:

Ray-sphere Normals Raster

我会认为所有球体的所有法线都是完全相同的。我做错了什么?

0 个答案:

没有答案