Định nghĩa các pháp tuyến

Một phần của tài liệu đồ án kỹ thuật cơ khí Mô phỏng quá trình gia công CNC trên máy DENFORD (Trang 55)

IV. Chiếu sáng đối tượng

4. Định nghĩa các pháp tuyến

Để việc chiếu sáng Open GL được thực hiện tốt trên đối tượng, không chỉ định nghĩa các vertex của đối tượng mà còn cần định nghĩa pháp tuyến cho mỗi vertex.

a. Pháp tuyến và vector

Pháp tuyến là một vetor đơn vị biểu thị hướng đối diện đa giác, cho phép Open GL tính toán góc ánh sáng chiếu vào đa giác. Pháp tuyến luôn trực giao với bề mặt mà nó biểu thị.

pháp tuyến của các vertex một đa giác được định nghĩa bởi lời gọi hàm Normal3f() trước lời gọi glVertex() định nghĩa vertex:

glBegin(GL_POLYGON);

glNormal3f((GLfloat)x, (GLfloat)y, (GLfloat)z); glVertex3f(-0.5f,0.0f,-0.5f);

glVertex3f(0.5f,0.0f,0.5f); glVertex3f(0.5f,0.0f,-0.5f); glEnd();

Đối số hàm glNormal3f() là các giá trị Glfloat cách mạng các tọa độ X, Y, và Z của điểm cuối pháp tuyến liên kết với mỗi vertex được định nghĩa trong đoạn mã trên sẽ tồn tại cho đến khi glNormal() được gọi lại để định nghĩa pháp tuyến mới.

b. Tính toán pháp tuyến

Việc tính toán pháp tuyến cho một đa giác đòi hỏi một kiến thức toán học phức tạp. Ở đây được trình bày một hàm được tạo sẵn có tên CalcNormal() dùng tính toán pháp tuyến từ các tọa độ X, Y, Z của ba vertex bất kỳ một đa giác (không cùng nằm trên một đường thẳng);

double p1[]= {-0.5,0.0,-0.5}; double p2[]= {-0.5,0.0,0.5}; double p3[]= {0.5,0.0,0.5}; double n[3];

CalcNormal(p1,p2,p3,n);

Đối số của CalcNormal() là các con trỏ trỏ đến bốn mảng giá trị doumle. Ba mảng đầu chứa các tọa độ X, Y, Z của ba vertex. Mảng thứ tư n[], chứa các tọa độ pháp tuyến. Sau lời gọi CalcNormal(), mảng n[] có thể dùng định nghĩa pháp tuyến cho các vertex của đa giác nh sau:

glBegin(GL_POLYGON);

glNormal3f((GLfloat)n[0],(GLfloat)n[1], GLfloat)n[2]); glVertex3f(-0.5f,0.0f,-0.5f);

glVertex3f(0.5f,0.0f,-0.5f); glEnd();

Đoạn mã sau mô tả sơ lược các phép toán trong CalcNormal():

void CalcNormal(double& x0,double& y0,double& z0, double& x1,double& y1,double& z1, double& x2,double& y2,double& z2, double nxyz[3])

{

double x10,y10,z10,x12,y12,z12; double cpx,cpy,cpz;

/* Compute edge vectors */ x10 = x1 - x0; y10 = y1 - y0; z10 = z1 - z0; x12 = x1 - x2; y12 = y1 - y2; z12 = z1 - z2;

/* Compute the cross product */ cpx = (z10 * y12) - (y10 * z12); cpy = (x10 * z12) - (z10 * x12); cpz = (y10 * x12) - (x10 * y12);

/* Normalize the result to get the unit-length facet normal */

double r = sqrt(cpx * cpx + cpy * cpy + cpz * cpz); nxyz[0] = cpx / r;

nxyz[1] = cpy / r; nxyz[2] = cpz / r; }

Một phần của tài liệu đồ án kỹ thuật cơ khí Mô phỏng quá trình gia công CNC trên máy DENFORD (Trang 55)

Tải bản đầy đủ (DOC)

(78 trang)
w