每当我尝试绘制球体的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)));
我真的认为大部分都是正确的。但是,我认为我得到了不正确的正常计算,因为虽然我的球体的轮廓被正确绘制,但我的光照计算似乎没有了。为了验证正常问题,我将法线绘制到屏幕上并得到:
我会认为所有球体的所有法线都是完全相同的。我做错了什么?