Как я могу получить нормальный вектор сферы? - PullRequest
0 голосов
/ 23 февраля 2012

Мне нужно реализовать простой алгоритм трассировки лучей, но я не могу понять, как мне получить нормальный вектор сферы, если у меня есть начало координат, радиус сферы и направление луча.спасибо Wiki о сфере но я не могу понять это

1 Ответ

0 голосов
/ 16 марта 2012

Я нашел решение: вот код на C #:

Double alpha = Math.Asin(sphere.Radius / (Math.Sqrt(Math.Pow(sphere.Origin.X-ray.Origin.X,2)+Math.Pow(sphere.Origin.Y-ray.Origin.Y,2)+Math.Pow(sphere.Origin.Z-ray.Origin.Z,2))));
Double beta = Math.Acos((ray.Direction * (sphere.Origin - ray.Origin)) / (ray.Direction.Length * (sphere.Origin - ray.Origin).Length));

ray.HitParam = VypA(sphere.Origin - ray.Origin, beta, sphere.Radius) / ray.Direction.Length;
Vector4 g = ray.Origin + ray.Direction * ray.HitParam;
ray.HitNormal = (g - sphere.Origin).Normalized;

////the VypA function

    public static Double VypA(Vector4 b, Double beta, Double radius)
            {
                return b.Length * (Math.Cos(beta) - Math.Sqrt(((radius * radius) / (b.Length2) - (Math.Sin(beta) * (Math.Sin(beta))))));
            }
...