本文整理汇总了C++中ray::origin方法的典型用法代码示例。如果您正苦于以下问题:C++ ray::origin方法的具体用法?C++ ray::origin怎么用?C++ ray::origin使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ray
的用法示例。
在下文中一共展示了ray::origin方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: hit
bool yz_rect::hit(const ray& r, double t_min, double t_max, hit_record& rec) const {
double t = (k - r.origin().x()) / r.direction().x();
if (t<t_min || t>t_max) return false;
double y = r.origin().y() + t*r.direction().y();
double z = r.origin().z() + t*r.direction().z();
if (y<y0 || y>y1 || z<z0 || z>z1) return false;
rec.u = (y - y0) / (y1 - y0);
rec.v = (z - z0) / (z1 - z0);
rec.t = t;
rec.mat_ptr = mat_ptr;
rec.point = r.point_at_parameter(t);
rec.normal = vec3(1.0, 0.0, 0.0);
return true;
}
示例2: hit
bool sphere::hit(const ray& r, float t_min, float t_max, hit_record& rec) const
{
vec3 oc = r.origin() - center;
float v2 = dot(r.direction(), r.direction());
float voc = dot(oc, r.direction());
// 判別式.
float discriminant = voc * voc - v2 * (dot(oc, oc) - radius*radius);
if (discriminant > 0) {
// 手前.
float temp = (-voc - sqrt(discriminant)) / v2;
if (temp < t_max && temp > t_min) {
rec.t = temp;
rec.p = r.org + rec.t * r.dir;
rec.normal = (rec.p - center);
rec.normal.noramlize();
getUV(rec.u, rec.v, rec.normal);
rec.mat_ptr = mat_ptr;
return true;
}
// 奥.
temp = (-voc + sqrt(discriminant)) / v2;
if (temp < t_max && temp > t_min) {
rec.t = temp;
rec.p = r.org + rec.t * r.dir;
rec.normal = (rec.p - center) / radius;
rec.normal.noramlize();
getUV(rec.u, rec.v, rec.normal);
rec.mat_ptr = mat_ptr;
return true;
}
}
return false;
}