You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			| 
				
					 | 
			3 years ago | |
|---|---|---|
| .gitignore | 3 years ago | |
| CMakeLists.txt | 3 years ago | |
| LICENSE | 3 years ago | |
| NurbsBasis.cu | 3 years ago | |
| NurbsBasis.cuh | 3 years ago | |
| NurbsEvaluator.cu | 3 years ago | |
| NurbsEvaluator.cuh | 3 years ago | |
| README.md | 3 years ago | |
| main.cpp | 3 years ago | |
| utils.cpp | 3 years ago | |
| utils.h | 3 years ago | |
		
			
				
				README.md
			
		
		
	
	NurbsEvaluator
A tool for evaluating multiple NURBS curve/surface points using the GPU.
Dependencies
- MSVC
 - CUDA 11.8.0
 
Usage
直接运行
根据CMake构建项目,运行main文件即可生成可执行文件
作为依赖使用
- CMakeLists.txt中注释以下代码,不再生成可执行文件
 
add_executable(NurbsEvaluator main.cpp NurbsEvaluator.cu NurbsEvaluator.cuh utils.cpp utils.h)
- CMakeLists.txt中取消注释以下代码,表示需要生成静态库。构建项目。
 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
add_library(NurbsEvaluator NurbsEvaluator.cu NurbsEvaluator.cuh utils.cpp utils.h)
- 原项目连接到生成的静态库目录。如果是由CMake构建,可以用 target_link_libraries 指向依赖(.lib),用 target_include_directories 指向头文件目录。
 - 使用.cu文件调用NurbsEvaluator
 
Nurbs曲线
在构造函数中传入控制点向量和knots向量:
NurbsCurve::Evaluator nurbsCurveEvaluator(
        {
            {-1, 0,   0},
            {0,  1,   6},
            {1,  0,   4},
            {2,  0.5, 3},
            {3,  3,   1},
            {4,  -5,  0}
        },
        {0, 0, 0, 0.1, 0.5, 0.8, 1, 1, 1}
);  // 6点控制,knots长度为9,degree为2的NURBS
设置是否需要输出GPU并行计算花费的时间(默认否):
nurbsCurveEvaluator.setRecordTime(true);
开始计算
nurbsCurveEvaluator.calculate(5);  // 在参数域采样5个点
Nurbs曲面
曲面在构造函数中需要传入三层vector嵌套表示的二维点阵、u方向的knots向量、v方向的knots向量
NurbsSurface::Evaluator nurbsSurfaceEvaluator(
        {
            {{-1,   0,   0},   {0,   1, 6},  {1,  0,   4},   {2,  0.5,  3},    {3,    3,   1},   {4,  -5,    0}},
            {{-2,   1,   1.2}, {1,   2, 3},  {2,  2,   3},   {-1, -0.3, 2},    {-1,   2,   0},   {7,  -8,    2}},
            {{-3.4, 2,   3},   {2,   3, 0},  {4,  3,   7},   {-2, 0,    -0.2}, {1,    1.7, 5},   {9,  -10.3, 6}},
            {{-1.5, 3.2, 1},   {2.6, 7, -2}, {5,  0.8, 4.2}, {-4, 1,    4},    {2.1,  4,   -2},  {11, -6,    4}},
            {{-0.2, 2,   0},   {5,   3, 2},  {5,  1.5, 1.4}, {-3, 2,    5},    {0.8,  1.3, 0},   {15, -2,    0.9}},
            {{3,    1.4, -1},  {6,   2, 4},  {-1, 0,   -2},  {0,  2.8,  2},    {-0.5, 2,   1.2}, {7,  -3,    -2}}
        },
        {0, 0, 0, 0.1, 0.5, 0.8, 1, 1, 1},
        {0, 0, 0, 0.2, 0.7, 0.8, 1, 1, 1}
);
nurbsSurfaceEvaluator.setRecordTime(true);
nurbsSurfaceEvaluator.calculate(3, 4);  // 计算时需要传入u、v两个方向的采样数目
Primary Reference
- Direct Evaluation of NURBS Curves and Surfaces on the GPU - 2007 - Krishnamurthy, Khardekar, Mcmains
 - CUDA C编程权威指南 - 2017 - 程润伟 , Max Grossman , Ty McKercher