Browse Source

add some files

main
forty-twoo 2 years ago
parent
commit
75a7b791b3
  1. 4
      CMakeLists.txt
  2. 14
      include/bvh.hpp
  3. 4
      include/mathdef.hpp
  4. 2
      src/bvh.cpp
  5. 68
      src/intersection.cpp
  6. 2
      src/main.cpp

4
CMakeLists.txt

@ -25,6 +25,8 @@ file(GLOB_RECURSE HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp)
file(GLOB_RECURSE THRDPARTY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/*)
#used for IDE, eg.Visual Studio
source_group("Header Files" FILES ${HEADER_FILES})
source_group("3rdparty" FILES ${THRDPARTY_FILES})
@ -32,4 +34,4 @@ source_group("3rdparty" FILES ${THRDPARTY_FILES})
add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEADER_FILES} ${THRDPARTY_FILES} )
target_link_libraries(${PROJECT_NAME} PUBLIC igl::glfw cln ginac)
target_link_libraries(${PROJECT_NAME} PUBLIC igl::glfw)

14
include/bvh.hpp

@ -23,6 +23,7 @@ typedef struct BVH_AABB_Node
AABB bound; //包围盒边界
std::vector<std::pair<double, double>> param; //此包围盒对应的每个参数的范围
std::vector<struct BVH_AABB_Node *> childPtr; //把每个孩子结点指针存储到容器里
BVH_AABB *myBVH; //指向自己的BVH结构
} BVH_AABB_Node, *BVH_AABB_NodePtr;
class BVH_AABB
@ -30,14 +31,23 @@ class BVH_AABB
public:
unsigned int Hlevel; //递归层数
unsigned int BranchNum; //每个结点的分支数 [BranchNum=2:曲线 || BranchNum=4:曲面]
tinynurbs::RationalCurve<double> *NurbsCurvePtr = NULL; //指向该BVH对应的NurbsCurve的指针针
tinynurbs::RationalSurface<double> *NurbsSurfacePtr = NULL; //指向该BVH对应的NurbsSurface的指针针
double sampleNum; //采样点数--越大包围盒构造越准确
BVH_AABB_NodePtr bvh_aabb_node = NULL; // bvh树的根指针
public:
BVH_AABB(unsigned int Hlevel_, unsigned int BranchNum_, double sampleNum_) : Hlevel(Hlevel_), BranchNum(BranchNum_), sampleNum(sampleNum_)
BVH_AABB(unsigned int Hlevel_, unsigned int BranchNum_, double sampleNum_, tinynurbs::RationalCurve<double> NurbsCurve_) : Hlevel(Hlevel_), BranchNum(BranchNum_), sampleNum(sampleNum_)
{
bvh_aabb_node = new BVH_AABB_Node;
std::cout << "BVH_AABB constructed correct!\n";
NurbsCurvePtr = new tinynurbs::RationalCurve<double>(NurbsCurve_);
std::cout << "BVH_AABB constructed correct, this is a bvh of NurbsCurve!\n";
};
BVH_AABB(unsigned int Hlevel_, unsigned int BranchNum_, double sampleNum_, tinynurbs::RationalSurface<double> NurbsSurface_) : Hlevel(Hlevel_), BranchNum(BranchNum_), sampleNum(sampleNum_)
{
bvh_aabb_node = new BVH_AABB_Node;
NurbsSurfacePtr = new tinynurbs::RationalSurface<double>(NurbsSurface_);
std::cout << "BVH_AABB constructed correct, this is a bvh of NurbsSurface!\n";
};
BVH_AABB_Node *GetNode() const
{

4
include/mathdef.hpp

@ -1,4 +0,0 @@
#ifndef MATHDEF_H_
#define MATHDEF_H_
#endif

2
src/bvh.cpp

@ -28,6 +28,7 @@ AABB BVH_AABB::UpdateBound(const AABB &bound, const glm::vec3 &p)
BVH_AABB_NodePtr BVH_AABB::Build_NurbsCurve(tinynurbs::RationalCurve<double> &curve, BVH_AABB_NodePtr &curNode, int curLevel, double t, double tstep)
{
curNode->myBVH = this;
if (curLevel + 1 == Hlevel)
{
for (double i = t; i < t + tstep; i += tstep / sampleNum)
@ -58,6 +59,7 @@ BVH_AABB_NodePtr BVH_AABB::Build_NurbsCurve(tinynurbs::RationalCurve<double> &cu
}
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)
{
curNode->myBVH = this;
if (curLevel == Hlevel)
{
for (double i = u; i < u + ustep; i++)

68
src/intersection.cpp

@ -0,0 +1,68 @@
#include "bvh.cpp"
#include <iostream>
#include <algorithm>
bool CurveCurveBVHIntersect(BVH_AABB_NodePtr &BoxPtr1, BVH_AABB_NodePtr &BoxPtr2, std::vector<std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr>> &IstNodePtr)
{
AABB box1 = BoxPtr1->bound;
AABB box2 = BoxPtr2->bound;
auto LineIntersect = [](double x1, double x2, double x1_, double x2_)
{
bool LIntersect = false;
if ((x2 <= x2_ && x2 >= x1_) || (x1_ <= x2 && x1_ >= x1))
LIntersect = true;
return LIntersect;
};
auto BoxIntersect = [&]()
{
double x1 = box1.Bmin.x, x1_ = box2.Bmin.x;
double x2 = box1.Bmax.x, x2_ = box2.Bmax.x;
double y1 = box1.Bmin.y, y1_ = box2.Bmin.y;
double y2 = box1.Bmax.y, y2_ = box2.Bmax.y;
double z1 = box1.Bmin.z, z1_ = box2.Bmin.z;
double z2 = box1.Bmax.z, z2_ = box2.Bmax.z;
if (LineIntersect(x1, x2, x1_, x2_) && LineIntersect(y1, y2, y1_, y2_) && LineIntersect(z1, z2, z1_, z2_))
return true;
else
false;
};
int biggerbox = 1;
if (glm::distance(box1.Bmax, box1.Bmin) < glm::distance(box2.Bmax, box2.Bmin))
biggerbox = 2;
if (BoxIntersect())
{
if (biggerbox == 1)
{
if (BoxPtr1->childPtr.size() == 0)
{
std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr> pi = std::make_pair(BoxPtr1, BoxPtr2);
IstNodePtr.push_back(pi);
return true;
}
for (auto it : BoxPtr1->childPtr)
{
CurveCurveBVHIntersect(it, BoxPtr2, IstNodePtr)
}
}
else
{
if (BoxPtr2->childPtr.size() == 0)
{
std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr> pi = std::make_pair(BoxPtr2, BoxPtr1);
IstNodePtr.push_back(pi);
return true;
}
for (auto it : BoxPtr2->childPtr)
{
CurveCurveBVHIntersect(BoxPtr1, it, IstNodePtr);
}
}
}
else
{
return false;
}
}

2
src/main.cpp

@ -20,7 +20,7 @@ int main(int argc, char *argv[])
crv.weights = {1, 1, 1, 1, 1};
ShowCurve_Igl(viewer, crv, 100);
BVH_AABB bvh_curve(8, 2, 100);
BVH_AABB bvh_curve(8, 2, 10, crv);
double tstep = *(crv.knots.end() - 1);
bvh_curve.Build_NurbsCurve(crv, bvh_curve.bvh_aabb_node, 0, 0, tstep);
ShowBVHNode(viewer, bvh_curve.bvh_aabb_node);

Loading…
Cancel
Save