STL 파일을 기호가 있는 거리 함수로 변환

개시하다


기호 거리 함수(Signed Distance Function:SDF)에 대한 자세한 내용은 다음을 참조하십시오.
  • Signed distance function - Wikipedia
  • 기호 거리 함수는 기호로 3차원 공간의 각 점에서 다각형 데이터의 가장 짧은 거리(거리 함수)를 나타내는 함수다.기호 거리 함수를 가진 0 등 값면은 다각형 데이터의 표면과 일치한다.다각형 데이터에서 외부의 기호와 다른 것은 기호 거리 함수를 가진 특징이다.
    $$
    f(x)=\begin{cases}d(x,∂Ω)\quad if\quad x∈Ω\\-d(x,∂Ω)\quad if\quad x∈Ω^{c}\\\end{cases}
    $$
    여기,Ω는 다각형면의 경계이다.

    개요


    ASCII 형식의 STL 파일을 SDF 데이터로 변환합니다.유체 해석 등 물리 시뮬레이션의 스크래치를 실현하려면 복잡한 경계 조건의 도입은 매우 큰 장애물이다.이럴 때는 사이드 인터페이스의 SDF 데이터가 있으면 매우 편리하다.
    STL에서 SDF로의 변환 사용basilisk.basilisk의 설치는 다음과 같습니다.
  • Basilisk - src/INSTALL
  • 소스 코드


    기호 거리 함수를 가진 원본 코드를 csv로 출력합니다.Basilisk C로 구현됩니다.basilisk의 example Basilisk - src/examples/distance.c 을 참고했습니다.
    #include <sys/stat.h>
    #include "grid/octree.h"
    #include "utils.h"
    #include "distance.h"
    #include "fractions.h"
    
    void mk_outfilepath(char *outfilepath, char *stlfilename, char *output_dir){
        char *ptr;
        char *ptr2;
        char *buf;
        ptr = strtok(stlfilename, "/");
        while(ptr != NULL) {
            buf = ptr;      
            ptr = strtok(NULL, "/");
        }
        ptr2 = strtok(buf, ".");
        sprintf(outfilepath,"%s%s_sdf.csv", output_dir, ptr2);
    }
    
    int main(int argc,char *argv[]){
        char *input_file = argv[1];
        char *output_dir = argv[2];
        int grids = atoi(argv[3]);
        mkdir(output_dir,0755);
    
        coord *p = input_stl (fopen (input_file, "r"));
        coord min, max;
        bounding_box (p, &min, &max);  
        double maxl = -HUGE;
        foreach_dimension()
            if (max.x - min.x > maxl)
                maxl = max.x - min.x;
    
        init_grid (grids);
        size (1.2*maxl);
        origin ((max.x + min.x)/2. - L0/2,
            (max.y + min.y)/2. - L0/2,
            (max.z + min.z)/2. - L0/2);
    
        scalar d[];
        distance (d, p);
    
        FILE *fp;
        char outfilepath[256];
        mk_outfilepath(outfilepath,input_file,output_dir);
        if ((fp = fopen(outfilepath, "w")) == NULL) {
            printf("file open error!!\n");
            exit(EXIT_FAILURE);
        }
        fprintf(fp,"x,y,z,distance\n");
        foreach() fprintf(fp,"%lf,%lf,%lf,%lf\n",x,y,z,d[]);
        fclose(fp);
    }
    

    실행

    stl2sdf <stlfile_path> <output_dir> <grid_size>
    
    option
    설명
    stlfile_path
    STL 파일 경로
    output_dir
    출력 디렉토리(자동 생성)
    grid_size
    기호 거리 함수를 가진 공간 분할수
    output_원본 STL 파일 이름에서 삭제합니다.stl +sdf.csv를 내보냅니다.
    csv 파일의 내용은 x, y,z 좌표와 각 좌표의 기호 거리 함수입니다.객체는 양수 값이고 외부는 음수 값입니다.다음 그림은 Stand Bunny의 예입니다.


    GitHub

    좋은 웹페이지 즐겨찾기