Laboratory of Fashion Technology - Digital 3D...
Transcript of Laboratory of Fashion Technology - Digital 3D...
-
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;