本文整理汇总了C++中Transformd::normal_to_parent方法的典型用法代码示例。如果您正苦于以下问题:C++ Transformd::normal_to_parent方法的具体用法?C++ Transformd::normal_to_parent怎么用?C++ Transformd::normal_to_parent使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Transformd
的用法示例。
在下文中一共展示了Transformd::normal_to_parent方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: add_cube
void add_cube(
Assembly& assembly,
const size_t ix,
const size_t iy,
const double fx,
const double fz,
const Color3b& color,
const Transformd& transform) override
{
// Push vertices.
const size_t base_vertex_index = m_mesh->get_vertex_count();
for (size_t i = 0; i < m_cube->get_vertex_count(); ++i)
{
m_mesh->push_vertex(
transform.point_to_parent(m_cube->get_vertex(i)));
}
// Push normals.
const size_t base_vertex_normal_index = m_mesh->get_vertex_normal_count();
for (size_t i = 0; i < m_cube->get_vertex_normal_count(); ++i)
{
m_mesh->push_vertex_normal(
normalize(
transform.normal_to_parent(m_cube->get_vertex_normal(i))));
}
// Push texture coordinates.
const size_t tex_coords_index =
m_mesh->push_tex_coords(
GVector2(static_cast<float>(fx), static_cast<float>(1.0 - fz)));
// Push triangles.
for (size_t i = 0; i < m_cube->get_triangle_count(); ++i)
{
Triangle triangle = m_cube->get_triangle(i);
triangle.m_v0 += static_cast<uint32>(base_vertex_index);
triangle.m_v1 += static_cast<uint32>(base_vertex_index);
triangle.m_v2 += static_cast<uint32>(base_vertex_index);
triangle.m_n0 += static_cast<uint32>(base_vertex_normal_index);
triangle.m_n1 += static_cast<uint32>(base_vertex_normal_index);
triangle.m_n2 += static_cast<uint32>(base_vertex_normal_index);
triangle.m_a0 = triangle.m_a1 = triangle.m_a2 = static_cast<uint32>(tex_coords_index);
m_mesh->push_triangle(triangle);
}
}
示例2: collect_emitting_triangles
//.........这里部分代码省略.........
pa_index < front_materials.size() ? front_materials[pa_index] : 0;
const Material* back_material =
pa_index < back_materials.size() ? back_materials[pa_index] : 0;
// Skip triangles that don't emit light.
if ((front_material == 0 || front_material->get_uncached_edf() == 0) &&
(back_material == 0 || back_material->get_uncached_edf() == 0))
continue;
// Retrieve object instance space vertices of the triangle.
const GVector3& v0_os = tess->m_vertices[triangle.m_v0];
const GVector3& v1_os = tess->m_vertices[triangle.m_v1];
const GVector3& v2_os = tess->m_vertices[triangle.m_v2];
// Transform triangle vertices to assembly space.
const GVector3 v0_as = object_instance_transform.point_to_parent(v0_os);
const GVector3 v1_as = object_instance_transform.point_to_parent(v1_os);
const GVector3 v2_as = object_instance_transform.point_to_parent(v2_os);
// Compute the support plane of the hit triangle in assembly space.
const GTriangleType triangle_geometry(v0_as, v1_as, v2_as);
TriangleSupportPlaneType triangle_support_plane;
triangle_support_plane.initialize(TriangleType(triangle_geometry));
// Transform triangle vertices to world space.
const Vector3d v0(assembly_instance_transform.point_to_parent(v0_as));
const Vector3d v1(assembly_instance_transform.point_to_parent(v1_as));
const Vector3d v2(assembly_instance_transform.point_to_parent(v2_as));
// Compute the geometric normal to the triangle and the area of the triangle.
Vector3d geometric_normal = cross(v1 - v0, v2 - v0);
const double geometric_normal_norm = norm(geometric_normal);
if (geometric_normal_norm == 0.0)
continue;
const double rcp_geometric_normal_norm = 1.0 / geometric_normal_norm;
const double rcp_area = 2.0 * rcp_geometric_normal_norm;
const double area = 0.5 * geometric_normal_norm;
geometric_normal *= rcp_geometric_normal_norm;
assert(is_normalized(geometric_normal));
// Retrieve object instance space vertex normals.
const GVector3& n0_os = tess->m_vertex_normals[triangle.m_n0];
const GVector3& n1_os = tess->m_vertex_normals[triangle.m_n1];
const GVector3& n2_os = tess->m_vertex_normals[triangle.m_n2];
// Transform vertex normals to world space.
const Vector3d n0(normalize(global_transform.normal_to_parent(n0_os)));
const Vector3d n1(normalize(global_transform.normal_to_parent(n1_os)));
const Vector3d n2(normalize(global_transform.normal_to_parent(n2_os)));
for (size_t side = 0; side < 2; ++side)
{
const Material* material = side == 0 ? front_material : back_material;
const Vector3d side_geometric_normal = side == 0 ? geometric_normal : -geometric_normal;
const Vector3d side_n0 = side == 0 ? n0 : -n0;
const Vector3d side_n1 = side == 0 ? n1 : -n1;
const Vector3d side_n2 = side == 0 ? n2 : -n2;
// Skip sides without a material.
if (material == 0)
continue;
const EDF* edf = material->get_uncached_edf();
// Skip sides without a light-emitting material.
if (edf == 0)
continue;
// Create a light-emitting triangle.
EmittingTriangle emitting_triangle;
emitting_triangle.m_assembly_instance = &assembly_instance;
emitting_triangle.m_object_instance_index = object_instance_index;
emitting_triangle.m_region_index = region_index;
emitting_triangle.m_triangle_index = triangle_index;
emitting_triangle.m_v0 = v0;
emitting_triangle.m_v1 = v1;
emitting_triangle.m_v2 = v2;
emitting_triangle.m_n0 = side_n0;
emitting_triangle.m_n1 = side_n1;
emitting_triangle.m_n2 = side_n2;
emitting_triangle.m_geometric_normal = side_geometric_normal;
emitting_triangle.m_triangle_support_plane = triangle_support_plane;
emitting_triangle.m_rcp_area = rcp_area;
emitting_triangle.m_edf = edf;
// Store the light-emitting triangle.
const size_t emitting_triangle_index = m_emitting_triangles.size();
m_emitting_triangles.push_back(emitting_triangle);
// Insert the light-emitting triangle into the CDFs.
m_emitter_cdf.insert(emitting_triangle_index + m_lights.size(), area);
m_emitting_triangle_cdf.insert(emitting_triangle_index, area);
// Keep track of the total area of the light-emitting triangles.
m_total_emissive_area += area;
}
}
}
}
}
示例3: collect_emitting_triangles
//.........这里部分代码省略.........
TriangleSupportPlaneType triangle_support_plane;
triangle_support_plane.initialize(TriangleType(triangle_geometry));
// Transform triangle vertices to world space.
const Vector3d v0(assembly_instance_transform.point_to_parent(v0_as));
const Vector3d v1(assembly_instance_transform.point_to_parent(v1_as));
const Vector3d v2(assembly_instance_transform.point_to_parent(v2_as));
// Compute the geometric normal to the triangle and the area of the triangle.
Vector3d geometric_normal = cross(v1 - v0, v2 - v0);
const double geometric_normal_norm = norm(geometric_normal);
if (geometric_normal_norm == 0.0)
continue;
const double rcp_geometric_normal_norm = 1.0 / geometric_normal_norm;
const double rcp_area = 2.0 * rcp_geometric_normal_norm;
const double area = 0.5 * geometric_normal_norm;
geometric_normal *= rcp_geometric_normal_norm;
assert(is_normalized(geometric_normal));
// Retrieve object instance space vertex normals.
Vector3d n0_os, n1_os, n2_os;
if (triangle.m_n0 != Triangle::None &&
triangle.m_n1 != Triangle::None &&
triangle.m_n2 != Triangle::None)
{
n0_os = Vector3d(tess->m_vertex_normals[triangle.m_n0]);
n1_os = Vector3d(tess->m_vertex_normals[triangle.m_n1]);
n2_os = Vector3d(tess->m_vertex_normals[triangle.m_n2]);
}
else
n0_os = n1_os = n2_os = geometric_normal;
// Transform vertex normals to world space.
const Vector3d n0(normalize(global_transform.normal_to_parent(n0_os)));
const Vector3d n1(normalize(global_transform.normal_to_parent(n1_os)));
const Vector3d n2(normalize(global_transform.normal_to_parent(n2_os)));
for (size_t side = 0; side < 2; ++side)
{
// Retrieve the material; skip sides without a material or without emission.
const Material* material = side == 0 ? front_material : back_material;
if (material == 0 || material->has_emission() == false)
continue;
// Retrieve the EDF and get the importance multiplier.
double importance_multiplier = 1.0;
if (const EDF* edf = material->get_uncached_edf())
importance_multiplier = edf->get_uncached_importance_multiplier();
// Accumulate the object area for OSL shaders.
object_area += area;
// Compute the probability density of this triangle.
const double triangle_importance = m_params.m_importance_sampling ? area : 1.0;
const double triangle_prob = triangle_importance * importance_multiplier;
// Create a light-emitting triangle.
EmittingTriangle emitting_triangle;
emitting_triangle.m_assembly_instance = &assembly_instance;
emitting_triangle.m_object_instance_index = object_instance_index;
emitting_triangle.m_region_index = region_index;
emitting_triangle.m_triangle_index = triangle_index;
emitting_triangle.m_v0 = v0;
emitting_triangle.m_v1 = v1;
emitting_triangle.m_v2 = v2;
emitting_triangle.m_n0 = side == 0 ? n0 : -n0;
emitting_triangle.m_n1 = side == 0 ? n1 : -n1;
emitting_triangle.m_n2 = side == 0 ? n2 : -n2;
emitting_triangle.m_geometric_normal = side == 0 ? geometric_normal : -geometric_normal;
emitting_triangle.m_triangle_support_plane = triangle_support_plane;
emitting_triangle.m_rcp_area = rcp_area;
emitting_triangle.m_triangle_prob = 0.0; // will be initialized once the emitting triangle CDF is built
emitting_triangle.m_material = material;
// Store the light-emitting triangle.
const size_t emitting_triangle_index = m_emitting_triangles.size();
m_emitting_triangles.push_back(emitting_triangle);
// Insert the light-emitting triangle into the CDF.
m_emitting_triangles_cdf.insert(emitting_triangle_index, triangle_prob);
}
}
}
#ifdef APPLESEED_WITH_OSL
store_object_area_in_shadergroups(
&assembly_instance,
object_instance,
object_area,
front_materials);
store_object_area_in_shadergroups(
&assembly_instance,
object_instance,
object_area,
back_materials);
#endif
}
}