laboratory of fashion technology - digital 3d...

17
Sungmin Kim SEOUL NATIONAL UNIVERSITY Digital 3D Anthropometry 4. Model Class Introduction 3D 물체의 제작 모델링 소프트웨어를 사용 3D Studio Max Maya Rhino 3D Z Brush Scan Data 로부터 생성 RapidForm 2

Upload: others

Post on 31-Jan-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

  • Sungmin Kim

    SEOUL NATIONAL UNIVERSITY

    Digital 3D Anthropometry

    4. Model Class

    Introduction 3D 물체의 제작

    모델링 소프트웨어를 사용

    3D Studio Max

    Maya

    Rhino 3D

    Z Brush

    Scan Data 로부터 생성

    RapidForm

    2

  • Introduction 모델링 기법의 종류 Solid Modeling

    Closed volume 을 가지는 물체로 표현

    물체의 외부, 표면, 내부 구분이 용이

    Surface Modeling

    표면 geometry 를 써서 물체를 표현

    Surface equation 이나 mesh structure 로 구성

    Non-manifold Modeling

    점, 선, 면, 부피가 혼합된 모델링

    Concept 디자인에 적합

    Parametric Modeling

    파라미터를 이용한 모델링

    3

    Modeling Solid Modeling Primitive Modeling

    4

  • Modeling Solid Modeling Primitive Modeling

    기본 물체간의 Boolean Operation

    5

    Modeling Solid Modeling Sweeping

    6

  • Modeling Solid Modeling Voxel 모델링

    비트맵 이미지의 3차원 확장 판

    물체의 부피/질량 계산에 사용

    상당한 메모리를 필요로 함

    7

    Modeling Surface Modeling Skinning

    다수의 단면을 연결해서 입체를 형성

    단면 데이터를 모아서 인체 모델을 만들 때 사용

    8

  • Modeling Surface Modeling 3각형 메쉬 기반 모델링

    XYZ Coordinate (Node)

    RGB Color

    Normal Vector

    9

    N3, C2

    N1, C1 N2, C2

    V1V2

    V3

    Texture, Sub Model 등 다양한 구조가 있을 수 있음

    Introduction Non-manifold Modeling 여러 차원의 물체가 혼합

    의복 모델링에 적합

    10

  • Modeling Parametric Modeling 다양한 모델을 쉽게 만들 수 있음

    추상적 모델링

    인체 모델링

    구조 최적화에 응용

    11

    Introduction Model Class의 설계 TModel3D

    3차원 모델을 정의하는 클래스

    – 점 정보

    – 면 정보

    – 법선 벡터 정보

    – 색상 정보

    3차원 모델과 관련된 기본 함수

    – 크기 계산

    – 법선 벡터 자동 계산

    – 이동/회전

    – 기본 물체 만들기

    – 데이터 입출력

    12

  • TModel3D Class 정의 기본형 정의

    생성자, 파괴자

    13

    class TModel3D{public:

    TModel3D();TModel3D(TModel3D&);~TModel3D();

    int NodeNum;TPoint3D *Node,*Normal,*Color;

    int ElemNum;int *Elem;

    };

    TModel3D::TModel3D(){NodeNum=0;Node=Color=Normal=0;ElemNum=0;Elem=0;}

    TModel3D::~TModel3D(){if (NodeNum){

    delete []Node;delete []Color;delete []Normal;}

    if (ElemNum) delete[]Elem;NodeNum=ElemNum=0;Node=Color=Normal=0;Elem=0;}

    TModel3D.h

    TModel3D.cpp

    TModel3D Class 정의 기본형 정의

    복제생성자

    14

    TModel3D::TModel3D(TModel3D &M){NodeNum=M.NodeNum;int i;if (NodeNum){

    Node=new TPoint3D[NodeNum];Color=new TPoint3D[NodeNum];Normal=new TPoint3D[NodeNum];for(i=0;i

  • TModel3D Class 정의 추가 기능 정의

    모델 정의 관련

    15

    void AssignNode(int);void AssignElem(int);void SetElem(int,int,int,int);

    void TModel3D::AssignNode(int n){NodeNum=n;Node=new TPoint3D[NodeNum];Color=new TPoint3D[NodeNum];Normal=new TPoint3D[NodeNum];}

    void TModel3D::AssignElem(int n){ElemNum=n;Elem=new int[ElemNum*3];}

    void TModel3D::SetElem(int n,int a,int b,int c){Elem[n*3]=a;Elem[n*3+1]=b;Elem[n*3+2]=c;}

    void TPoint3D::Set(float X,float Y,float Z){x=X;y=Y;z=Z;} void TPoint2D::Set(float X,float Y)

    {x=X;y=Y;}

    TPoint3D Class

    TPoint2D Class

    TModel3D Class 정의 추가 기능 정의

    모델 크기 구하기

    16

    float mx,my,mz,Mx,My,Mz;void GetSize(); );

    void TModel3D::GetSize(){mx=my=mz=100000;Mx=My=Mz=-100000;int i;for(i=0;i

  • TModel3D Class 정의 추가 기능 정의

    법선벡터 계산

    17

    void TModel3D::CalculateNormal(){if (!NodeNum || !ElemNum) return;int i,j;TPoint3D *N=new TPoint3D[ElemNum];for(i=0;i

  • TModel3D Class 정의 추가 기능 정의

    한점을 중심으로 X, Y, Z 축 주위로 회전

    19

    void TModel3D::Rotate(TPoint3D &O,float x,float y,float z){int i;float cc,ss,X,Y,Z;if (x){

    cc=cos(x); ss=sin(x);for(i=0;i

  • TModel3D Class 정의 추가 기능 정의

    기본 물체 만들기 - 평면

    21

    void TModel3D::FormPlane(float xs,float zs,int nx,int nz,float r,float g,float b){int i,j;AssignNode((nx+1)*(nz+1));AssignElem(nx*nz*2);float x,z,xstep,zstep;xstep=xs/(float)nx;zstep=zs/(float)nz;r/=255.0f;g/=255.0f;b/=255.0f;int n=0;for(i=0;i

  • TModel3D Class 정의 추가 기능 정의

    기본 물체 만들기 - 구 (Homework)

    – 파라미터는 반지름, 적도방향 분할 갯수, RGB 색상

    – 위도방향 분할갯수=적도방향 분할갯수/2

    – 분할 갯수는 항상 짝수로 제한

    23

    적도방향

    TModel3D Class 정의 추가 기능 정의

    데이터 불러오기

    – 3D 데이터의 종류는 무궁무진하며 잘 알려진 파일 형식의 경우 형식을 찾는 것이 가장 바람직함

    » 알려져 있지 않은 형식의 경우 데이터 파일을 관찰해보고 규칙을 찾아내야 함

    » 가장 중요한 것은 Node 와 Element 데이터

    24

    http://www.open3mod.com

  • TModel3D Class 정의 추가 기능 정의

    데이터 불러오기 - ASCII 타입 PLY의 경우

    25

    plyformat ascii 1.0comment Exported by 3DMelement vertex 112644property float xproperty float yproperty float zproperty uchar redproperty uchar greenproperty uchar blueelement face 222889property list uchar int vertex_indexend_header152.646027 1241.364136 62.522892 60 42 22152.125336 1240.548340 60.672829 56 40 20155.566544 1193.091797 45.029305 78 48 25...3 112643 112642 1125223 112521 112522 1126423 112642 112641 112521...

    header information

    number of point

    한 점이 3개의 float x,y,z 좌표와 3개의 unsigned char(0~255) red, green, blue 색상으로 구성됨

    vertex index list 로 face가 구성됨number of face

    112,644개의 x y z r g b 값

    222,889개의 삼각형 요소 (face) 정의

    TModel3D Class 정의 추가 기능 정의

    데이터 불러오기 - ASCII 타입 PLY의 경우

    26

    void TModel3D::LoadFromASCIIPLY(AnsiString N){FILE *F=fopen(N.c_str(),"r");char buf[300];int i;for(i=0;i

  • TModel3D Class 정의 추가 기능 정의

    데이터 불러오기 - Binary타입 STL의 경우

    27

    Free Hex Editor : https://mh-nexus.de/en/hxd/

    UINT8[80] – HeaderUINT32 – Number of triangles

    foreach triangleREAL32[3] – Normal vectorREAL32[3] – Vertex 1REAL32[3] – Vertex 2REAL32[3] – Vertex 3UINT16 – Attribute byte countend

    Binary STL File Format (Wikipedia)

    TModel3D Class 정의 추가 기능 정의

    데이터 불러오기 - Binary타입 PLY의 경우

    28

    void TModel3D::LoadFromBinarySTL(AnsiString N){FILE *F=fopen(N.c_str(),"rb");BYTE buf[100];fread(buf,1,80,F);fread(&ElemNum,1,4,F);NodeNum=ElemNum*3;AssignNode(NodeNum);AssignElem(ElemNum) ;int i;int attr;float nx,ny,nz,x0,y0,z0,x1,y1,z1,x2,y2,z2;int n=0,nn=0,en=0;for(i=0;i

  • TModel3D Class 정의 추가 기능 정의

    데이터 불러오기 - ASCII 타입 OBJ 의 경우 : Homework

    29

    ###### OBJ File Generated by Meshlab###### Object 10-F-3D0053E.obj## Vertices: 61719# Faces: 123497#####vn -0.385640 -2.046920 0.375572v -761.990601 13945.023438 301.880402...# 61719 vertices, 0 vertices normals

    f 1//1 3//3 61568//61568...# 123497 faces, 0 coords texture

    # End of File

    Header Information

    Number ofpoints and faces

    Vertex normal x, y, zVertex coordinate x, y, z

    Face point0//normal0 point1//normal1 point2//normal2

    TModel3D Class 정의 추가 기능 정의

    데이터 저장하기

    – TFileStream 을 상속한 TNewFilestream을 만들어서 binary로 저장하기를 구현

    30

    TNewFileStream::TNewFileStream(AnsiString File,Word Mode) : TFileStream(File,Mode){}

    void TNewFileStream::WInt(int n){WriteBuffer((BYTE*)&n,sizeof(int));}

    void TNewFileStream::WFloat(float f){WriteBuffer((BYTE*)&f,sizeof(float));}

    void TNewFileStream::WString(AnsiString N){int n=N.Length();WInt(n);WriteBuffer(N.c_str(),n);}

    #include

    class TNewFileStream : public TFileStream{public:

    TNewFileStream(const AnsiString,Word);

    void WInt(int);void WFloat(float);void WString(AnsiString);

    };

  • TModel3D Class 정의 추가 기능 정의

    데이터 저장하기

    31

    void TModel3D::SaveToFileStream(TNewFileStream *S){int i;S->WInt(1); // date of versionS->WInt(NodeNum);for(i=0;iWFloat(Node[i].x);S->WFloat(Node[i].y);S->WFloat(Node[i].z);S->WFloat(Color[i].x);S->WFloat(Color[i].y);S->WFloat(Color[i].z);S->WFloat(Normal[i].x);S->WFloat(Normal[i].y);S->WFloat(Normal[i].z);}

    S->WInt(ElemNum);for(i=0;iWInt(Elem[i]);}

    }

    TNewFileStream *S=new TNewFileStream("file.mdl",fmCreate);Model->SaveToFileStream(S);delete S;

    TModel3D Class 정의 추가 기능 정의

    데이터 불러오기

    32

    void RInt(int*);void RFloat(float*);AnsiString RString();

    void TNewFileStream::RInt(int *n){ReadBuffer((BYTE*)n,sizeof(int));}

    void TNewFileStream::RFloat(float *f){ReadBuffer((BYTE*)f,sizeof(float));}

    AnsiString TNewFileStream::RString(){int n;RInt(&n);char *b=new char[n+1];ReadBuffer(b,n);b[n]=0;AnsiString R=AnsiString(b);delete []b;return R;}

  • TModel3D Class 정의 추가 기능 정의

    데이터 불러오기

    33

    void TModel3D::LoadFromFileStream(TNewFileStream *S){int version,i;S->RInt(&version);S->RInt(&NodeNum);AssignNode(NodeNum);for(i=0;iRFloat(&Node[i].x);S->RFloat(&Node[i].y);S->RFloat(&Node[i].z);S->RFloat(&Color[i].x);S->RFloat(&Color[i].y);S->RFloat(&Color[i].z);S->RFloat(&Normal[i].x);S->RFloat(&Normal[i].y);S->RFloat(&Normal[i].z);}

    S->RInt(&ElemNum);AssignElem(ElemNum);for(i=0;iRInt(&Elem[i]);}

    }

    TNewFileStream *S=new TNewFileStream("file.mdl",fmOpenRead);Model->LoadFromFileStream(S);delete S;