レイトレーシングにおけるBRDFおよび球座標
標準のフォン/ブリンフォン照明モデルを使用するレイトレーサーを開発しました。物理ベースのレンダリングをサポートするように変更しているので、さまざまなBRDFモデルを実装しています。現在、私はOren-NayarとTorrance-Sparrowモデルに集中しています。これらはそれぞれ、入射wiおよび出射wo光の方向を表すために使用される球面座標に基づいています。 私の質問は次のとおりです。wiとwoをデカルト座標から球座標に変換する正しい方法はどれですか。 私はここで報告された標準の公式を適用していますhttps://en.wikipedia.org/wiki/Spherical_coordinate_system#Coordinate_system_conversions 私のベクトルが原点の尾にないので、私が正しいことをしているのかわかりませんデカルト座標系ですが、光線とオブジェクトの交点を中心とします。 ここに私の現在の実装を見つけることができます: https://github.com/chicio/Multispectral-Ray-tracing/tree/brdf/RayTracing/RayTracer/Objects/BRDF https://github.com/chicio/Multispectral-Ray-tracing/blob/brdf/RayTracing/RayTracer/Math/Vector3D.cpp 誰かがwiとwoのベクトルをデカルト座標から球座標に変換する正しい方法の説明を手伝ってくれる? 更新 ここにコードの関連部分をコピーします。 球面座標計算 float Vector3D::sphericalTheta() const { float sphericalTheta = acosf(Utils::clamp(y, -1.f, 1.f)); return sphericalTheta; } float Vector3D::sphericalPhi() const { float phi = atan2f(z, x); return (phi < 0.f) ? phi + 2.f * M_PI : phi; } オーレンナヤル OrenNayar::OrenNayar(Spectrum<constant::spectrumSamples> reflectanceSpectrum, float …