6 changed files with 184 additions and 65 deletions
@ -1 +1 @@ |
|||
test |
|||
Nurbs curve surface intersection calculation |
@ -0,0 +1,5 @@ |
|||
#include "bvh.hpp" |
|||
#include <igl/opengl/glfw/Viewer.h> |
|||
|
|||
void ShowCurve_Igl(igl::opengl::glfw::Viewer viewer, tinynurbs::RationalCurve<double> &curve, double sampleNum); |
|||
void ShowSurface_Igl(igl::opengl::glfw::Viewer viewer, tinynurbs::RationalSurface<double> &surface, double sampleNumU, double sampleNumV); |
@ -0,0 +1,93 @@ |
|||
#include "bvh.hpp" |
|||
|
|||
AABB &BVH_AABB::UnionBound(const AABB &a, const AABB &b) |
|||
{ |
|||
AABB ret; |
|||
ret.Bmin = glm::vec3(fmin(a.Bmin.x, b.Bmin.x), |
|||
fmin(a.Bmin.y, b.Bmin.y), |
|||
fmin(a.Bmin.z, b.Bmin.z)); |
|||
|
|||
ret.Bmax = glm::vec3(fmax(a.Bmax.x, b.Bmax.x), |
|||
fmax(a.Bmax.y, b.Bmax.y), |
|||
fmax(a.Bmax.z, b.Bmax.z)); |
|||
return ret; |
|||
} |
|||
|
|||
AABB &BVH_AABB::UpdateBound(const AABB &bound, const glm::vec3 &p) |
|||
{ |
|||
AABB ret; |
|||
ret.Bmin = glm::vec3(fmin(bound.Bmin.x, p.x), |
|||
fmin(bound.Bmin.y, p.y), |
|||
fmin(bound.Bmin.z, p.z)); |
|||
|
|||
ret.Bmax = glm::vec3(fmax(bound.Bmax.x, p.x), |
|||
fmax(bound.Bmax.y, p.y), |
|||
fmax(bound.Bmax.z, p.z)); |
|||
return ret; |
|||
} |
|||
|
|||
BVH_AABB_NodePtr BVH_AABB::Build_NurbsCurve(tinynurbs::RationalCurve<double> &curve, BVH_AABB_NodePtr &curNode, int curLevel, double t, double tstep) |
|||
{ |
|||
if (curLevel == Hlevel) |
|||
{ |
|||
for (double i = t; i < t + tstep; i += tstep / sampleNum) |
|||
{ |
|||
curNode->bound = UpdateBound(curNode->bound, tinynurbs::curvePoint(curve, i)); |
|||
} |
|||
curNode->childPtr.clear(); |
|||
curNode->param.push_back(std::make_pair(t, t + tstep)); |
|||
|
|||
return curNode; |
|||
} |
|||
BVH_AABB_NodePtr childNode1 = new BVH_AABB_Node; |
|||
BVH_AABB_NodePtr childNode2 = new BVH_AABB_Node; |
|||
|
|||
double tstep_ = tstep / (double)BranchNum; |
|||
Build_NurbsCurve(curve, childNode1, curLevel + 1, t, tstep_); |
|||
Build_NurbsCurve(curve, childNode2, curLevel + 1, t + tstep_, tstep_); |
|||
|
|||
curNode->bound = UnionBound(curNode->bound, childNode1->bound); |
|||
curNode->bound = UnionBound(curNode->bound, childNode2->bound); |
|||
|
|||
curNode->childPtr.push_back(childNode1); |
|||
curNode->childPtr.push_back(childNode2); |
|||
|
|||
curNode->param.push_back(std::make_pair(t, t + tstep)); |
|||
|
|||
return curNode; |
|||
} |
|||
BVH_AABB_NodePtr BVH_AABB::Build_NurbsSurface(tinynurbs::RationalSurface<double> &surface, BVH_AABB_NodePtr &curNode, int curLevel, double u, double v, double ustep, double vstep) |
|||
{ |
|||
if (curLevel == Hlevel) |
|||
{ |
|||
for (double i = u; i < u + ustep; i++) |
|||
{ |
|||
for (double j = v; j < v + vstep; j++) |
|||
{ |
|||
curNode->bound = UpdateBound(curNode->bound, tinynurbs::surfacePoint(surface, i, j)); |
|||
} |
|||
} |
|||
curNode->childPtr.clear(); |
|||
curNode->param.push_back(std::make_pair(u, u + ustep)); |
|||
curNode->param.push_back(std::make_pair(v, v + vstep)); |
|||
|
|||
return curNode; |
|||
} |
|||
BVH_AABB_NodePtr childNode1 = new BVH_AABB_Node; |
|||
BVH_AABB_NodePtr childNode2 = new BVH_AABB_Node; |
|||
BVH_AABB_NodePtr childNode3 = new BVH_AABB_Node; |
|||
BVH_AABB_NodePtr childNode4 = new BVH_AABB_Node; |
|||
|
|||
double ustep_ = ustep / (double)BranchNum; |
|||
double vstep_ = vstep / (double)BranchNum; |
|||
|
|||
Build_NurbsSurface(surface, childNode1, curLevel + 1, u, v, ustep_, vstep_); |
|||
Build_NurbsSurface(surface, childNode2, curLevel + 1, u + ustep_, v, ustep_, vstep_); |
|||
Build_NurbsSurface(surface, childNode3, curLevel + 1, u, v + vstep_, ustep_, vstep_); |
|||
Build_NurbsSurface(surface, childNode4, curLevel + 1, u + ustep_, v + vstep_, ustep_, vstep_); |
|||
|
|||
curNode->param.push_back(std::make_pair(u, u + ustep)); |
|||
curNode->param.push_back(std::make_pair(v, v + vstep)); |
|||
|
|||
return curNode; |
|||
} |
@ -0,0 +1,25 @@ |
|||
#include "show_in_libigl.hpp" |
|||
|
|||
void ShowCurve_Igl(igl::opengl::glfw::Viewer viewer, tinynurbs::RationalCurve<double> &curve, double sampleNum) |
|||
{ |
|||
double T = *(curve.knots.end() - 1); |
|||
|
|||
for (double i = 0; i < T; i += T / sampleNum) |
|||
{ |
|||
auto point = tinynurbs::curvePoint(curve, i); |
|||
pt << point.x, point.y, point.z; |
|||
viewer.data().add_points(pt, Eigen::RowVector3d(0, 1, 0)); |
|||
} |
|||
} |
|||
|
|||
void ShowSurface_Igl(igl::opengl::glfw::Viewer viewer, tinynurbs::RationalCurve<double> &curve, double sampleNumU, double sampleNumV) |
|||
{ |
|||
double T = *(curve.knots.end() - 1); |
|||
|
|||
for (double i = 0; i < T; i += T / sampleNum) |
|||
{ |
|||
auto point = tinynurbs::curvePoint(curve, i); |
|||
pt << point.x, point.y, point.z; |
|||
viewer.data().add_points(pt, Eigen::RowVector3d(0, 1, 0)); |
|||
} |
|||
} |
Loading…
Reference in new issue