Cơ sở lý thuyết về kỹ thuật đồ họa máy tính
Các khái niệm cơ bản về đồ họa máy tính
Đồ họa máy tính là một lĩnh vực của công nghệ thông tin, liên quan đến việc nghiên cứu, xây dựng và tập hợp các công cụ ( mô hình lý thuyết và phần mềm) khác nhau để kiến tạo, xây dựng lưu trữ và xử lý các mô hình và hình ảnh của đối tượng, sự vật hiện tượng khác nhau trong đời sống, sản xuất và nghiên cứu Các mô hình và hình ảnh này có thể là các kết quả thu được từ những lĩnh vực khác nhau của rất nhiều ngành khoa học ( vật lý,toán học, ) Đồ họa máy tính cũng là lĩnh vực liên quan đến việc thiết kế chế tạo phần cứng như: các thiết bị hiển thị, các thiết bị đầu vào như bàn phím, chuột, bút quang các thuật toán cần thiết để phát sinh hình ảnh trên các thiết bị này, các phần mềm được sử dụng cho cả người lập trình hệ thống và người lập trình ứng dụng đồ họa. Đồ họa máy tính không bị giới hạn trong các ảnh tĩnh mà hướng tới các ảnh động
• Sự đổi hướng của cánh máy bay siêu âm
• Sự phát triển của khuôn mặt người từ lúc trẻ thơ tới lúc già
• Trừu tượng như là xu hướng phát triển của việc sử dụng năng lượng, gia tăng dân số, … b, Các kỹ thuật đồ họa máy tính
Có rất nhiều kỹ thuật hiển thị hình ảnh được áp dụng trong ngành đồ họa máy tính, mỗi kỹ thuật lại có tuổi đời và những ưu, nhược điểm khác nhau Dưới đây là 3 kỹ thuật hiển thị hình ảnh của đồ họa máy tính phổ biến nhất:
Khái niệm thiết kế đồ họa raster (đồ họa hoặc hình ảnh Bitmap) là một trong những kỹ thuật hiển thị hình ảnh lâu đời và phố biến nhất với nền tảng kỹ thuật lấy từ công nghệ màn hình tivi đã tồn tại rất lâu trước khi máy tính điện tử ra đời Với kỹ thuật này, tất cả các hình ảnh đều được làm nên từ các ô vuông có màu nhỏ li ti được gọi là pixel (phần tử ảnh).
Tùy thuộc vào độ phân giải, một hình ảnh có thể chứa hàng nghìn đến hàng triệu pixel, giống như một bức tường được xây lên từ nhiều viên gạch vậy Ưu điểm lớn nhất của kỹ thuật raster là các hình ảnh raster có thể hiển thị các chi tiết rõ ràng, đẹp với màu sắc đa dạng, hài hòa Tuy nhiên, hình ảnh raster có thể sẽ bị “vỡ” hoặc mờ nếu phóng to hoặc bị nén quá nhiều Dung lượng các file ảnh raster cũng khá lớn nếu có độ phân giải cao.
Đồ họa vector Đồ họa vector là kỹ thuật tạo dựng hình ảnh bằng các đường kẻ quy định bởi các công thức toán học lần đầu tiên được sử dụng cho màn hình máy tính trong những năm 60 và 70 của thế kỉ 20 Tuy không phổ biến bằng kỹ thuật đồ họa raster và đã từng có một thời gian gần như bị “xóa sổ” bởi raster, đồ họa vector đang được ưa chuộng trở lại.
Nhờ vào những ưu điểm như các hình ảnh vector đơn giản, dễ dàng phóng to mà không bị giảm chất lượng, có dung lượng nhỏ hơn so với raster, dễ chỉnh sửa, rất thích hợp với việc thiết kế các loại đồ họa ít màu sắc, đơn giản như logo, icon hay biểu tượng.
Đồ họa 3D Đồ họa 3D là kỹ thuật đồ họa đang được tập trung phát triển nhất trong thời điểm hiện tại, với sự quan tâm và tiềm năng của các ứng dụng như không gian ảo hay hình chiếu ba chiều Nhà thiết kế đồ họa phải thực hiện rất nhiều bước khác nhau và áp dụng nhiều kỹ thuật tạo dựng hình ảnh phức tạp để có được một đôí tượng hình ảnh 3D đúng nghĩa.
Trước hết, khung cơ bản (wire-frame) của vật thể phải được dựng trong một phần mềm đồ họa máy tính, sau đó các phần của vật thể sẽ được thêm vào và nối với nhau (rigged) để tạo sự liên kết chân thực, đặc biệt là với các vật thể có khả năng chuyển động Sau đó vật thể phải được render. Đây là bước mất thời gian và phức tạp nhất vì một vật thể 3D có nhiều bề mặt khác nhau với các chất liệu khác nhau, độ trong suốt hay mờ đục, màu sắc, mức độ bắt sáng hay phản sáng khác nhau Để tạo được một vật thể 3D thật nhất có thể, nhiều kỹ thuật toán học được áp dụng để tính toán và mô phỏng cách ánh sáng chiếu và phản chiếu vào các loại mặt phẳng khác nhau như ray tracing hay radiosity,… c, Các lĩnh vực đồ họa máy tính
Có 2 lĩnh vực chính áp dụng đồ họa máy tính Giáo dục và đào tạo, lĩnh vực giải trí và nghệ thuật
Trong giáo dục và đào tạo, đồ họa máy tính đem đến một phương tiện học tập thú vị và hấp dẫn cho các bạn học sinh, sinh viên Chúng tạo ra các hình ảnh, video mô phỏng trực quan cấu trúc vật thể,… khiến các bài học không còn nhàm chán Các lý thuyết, công thức khó hiểu được trình bày khoa học và rõ ràng hơn thông qua hình ảnh và biểu đồ Ngoài ra, trong lĩnh vực đào tạo, đồ họa máy tính còn được ứng dụng trong việc kiểm tra trình độ người lái Nhất là trong các buổi huấn luyện điều khiển các phương tiện giao thông Người học có thể tiếp cận các tình huống thực tế có thể xảy ra mà không gặp phải rủi ro nhờ đồ họa vi tính Đồng thời, các giảng viên có thể đánh giá và đưa ra phương thức giảng dạy phù hợp.
Ví dụ: Thiết kế không gian:
Điều hướng giao thông công cộng
Không gian tổ chức sự kiện và hội nghị Đồ họa máy tính được ứng dụng rất phổ biến trong lĩnh vực giải trí và nghệ thuật Nhất là trong lĩnh vực giải trí với trò chơi điện tử Đồ họa máy tính góp phần tạo nên các hiệu ứng đồ họa sống động khiến trò chơi trở nên thu hút hơn Bên cạnh đó, công nghệ này cũng được ứng dụng trong ngành sản xuất phim hoạt hình, video đồ họa quảng cáo,…Thông qua việc sử dụng các phần mềm máy tính như: photoshop, illustrator, premiere,…
Ví dụ: về nghệ thuật và giải trí
Các giải thuật đồ họa cơ bản
Trong đồ họa máy tính, các giải thuật đóng vai trò quan trọng trong việc tạo ra các hình ảnh, hình ảnh động và các hiệu ứng trực quan khác nhau Dưới đây là một số giải thuật đồ họa cơ bản thường được sử dụng:
Thuật toán DDA (Digital Differential Analysis): Đây là một thuật toán đơn giản và hiệu quả để vẽ đường thẳng, hoạt động bằng cách tính toán từng điểm pixel trên đường thẳng dựa trên độ dốc của đường thẳng.
+ Ý tưởng :Cho PT đoạn thẳng đi qua 2 điểm (x1,y1), (x2,y2) như sau: y=kx+m Trong đó: 𝑘=(𝑦2−𝑦1)/(𝑥2−𝑥1) ; 𝑚=𝑦1−𝑘𝑥1
Hình 1 1 Ví dụ thuật toán DDA
Thuật toán đường thẳng của Bresenham : Giống như DDA, thuật toán này cũng vẽ đường thẳng pixel theo pixel, nhưng nó có hiệu suất tốt hơn DDA, đặc biệt cho các đường thẳng có độ dốc.
Tăng x1, xác định điểm ảnh tiếp theo bằng cách so sánh d1 và d2 Nếu d1d2 thì điểm tiếp theo là P
Hình 1 2 Ví dụ giải thuật bresenham
Đường cong Bézier: Đây là một trong những đường cong được sử dụng để vẽ một Control Controls tập tin và dạng đường cong phụ thuộc của Control Controls này.
Do tính chất đối xứng của đường tròn nên ta chỉ cần vẽ cung bằng 1/8 đường tròn, sau đó lấy đối xứng ta sẽ được một đường tròn.
Cung 1/8 được mô tả như sau:
Nếu có (x, y) ∈ (C 1/8 ) thì các điểm: (y, x), (y, x), (x,-y), (-x,-y), (-y,-x), (-y,x), (-x,y) sẽ thuộc (C).
+ Ý tưởng Phương trình đường tròn
F(x,y): 0 nếu (x,y)nằm ngoài đường tròn) Đặt Pold=F(M)
Pold=(xp+1) 2 + (yp-1/2) 2 – R 2 Nếu chọn E, MnewE(xp+2,yp-1/2)
PnewE=(xp+2) 2 + (yp-1/2) 2 – R 2 PnewE= Pold + 2xp + 3
Nếu chọn SE, MnewSE(xp+2,yp-3/2)
PnewE=(xp+2) 2 + (yp-3/2) 2 – R 2 PnewE= Pold + 2(xp - yp) + 5
Hình 1 3 Ví dụ thuật toán midpoint
Tô màu cho các đối tượng:
Đường quét thuật toán: Thuật toán này được sử dụng để tô màu bên trong các giác giác bằng cách xác định các pixel nằm trong đa giác Thuật toán hoạt động bằng cách quét các hàng pixel trên màn hình và xác định các pixel thuộc về đa giác.
Hình 1 4 Ví dụ giải thuật tô màu các đối tượng
Giải thuật cắt xén vùng
Duyệt lần lượt (theo chiều kim đồng hồ) các cạnh đa giác
Nếu đỉnh duyệt xuất phát từ trong cửa sổ theo cạnh đa giác đi ra ngoài cửa sổ: lưu trữ giao của cạnh đa giác với biên cửa sổ Nếu đường đi từ ngoài vào trong cửa sổ: lưu trữ đỉnh đa giác và giao điểm Thí dụ xét hai đỉnh đa giác S và P:
Hình 1 5 Ví dụ giải thuật cắt xén vùng
Ứng dụng của đồ họa máy tính
Đồ họa 2D Công nghệ: Đồ họa raster: Sử dụng mạng lưới các điểm ảnh (pixel) để tạo hình ảnh Ưu điểm: dễ chỉnh sửa, phù hợp cho ảnh chụp và ảnh vẽ Nhược điểm: hình ảnh bị vỡ khi phóng to. Đồ họa vector: Sử dụng các đường thẳng, đường cong và hình dạng toán học để tạo hình ảnh Ưu điểm: có thể phóng to thu nhỏ mà không bị vỡ ảnh, tệp tin nhỏ gọn
Nhược điểm: phức tạp hơn trong việc chỉnh sửa so với đồ họa raster.
Adobe Photoshop: Chỉnh sửa ảnh raster phổ biến, cung cấp nhiều công cụ để chỉnh sửa, tô vẽ, và tạo hiệu ứng
Adobe Illustrator: Chỉnh sửa ảnh vector mạnh mẽ, cho phép tạo logo, biểu tượng, minh họa và đồ họa thông.
GIMP: Phần mềm chỉnh sửa ảnh miễn phí và mã nguồn mở, có chức năng tương tự như Photoshop.
Inkscape: Phần mềm chỉnh sửa ảnh vector miễn phí và mã nguồn mở, có chức năng tương tự như Illustrator. Ứng dụng:
1.Thiết kế đồ họa: logo, banner, poster, infographic, v.v.
2.Chỉnh sửa ảnh: chỉnh sửa ảnh chụp, ghép ảnh, xóa phông nền, v.v.
3.Vẽ tranh kỹ thuật số: sáng tạo tranh vẽ, minh họa, truyện tranh, v.v.
4.Thiết kế giao diện người dùng: giao diện web, ứng dụng di động, phần mềm, v.v.
Mô hình 3D: Biểu diễn các đối tượng 3D bằng các điểm, đường thẳng, mặt và kết cấu.
Phân cảnh 3D: Sắp xếp các đối tượng 3D trong không gian ảo, bao gồm ánh sáng, camera và hiệu ứng.
Kết xuất 3D: Chuyển đổi mô hình 3D và phân cảnh 3D thành hình ảnh hoặc video 2D.
Autodesk Maya: Phần mềm mô hình, hoạt hình và render 3D chuyên nghiệp, được sử dụng trong phim ảnh, trò chơi điện tử và hiệu ứng hình ảnh.
Blender: Phần mềm mô hình, hoạt hình và render 3D miễn phí và mã nguồn mở, có chức năng tương tự như Maya.
Cinema 4D: Phần mềm mô hình, hoạt hình và render 3D dễ sử dụng, phù hợp cho người mới bắt đầu.
Unreal Engine: Công cụ phát triển trò chơi 3D mạnh mẽ, cung cấp môi trường hoàn chỉnh để tạo ra các trò chơi, trải nghiệm thực tế ảo và ứng dụng tương tác. Ứng dụng:
Phim ảnh: Tạo hiệu ứng hình ảnh, mô phỏng môi trường, nhân vật 3D cho phim ảnh.
Trò chơi điện tử: Thiết kế thế giới trò chơi, nhân vật, vật phẩm và hiệu ứng.
Kiến trúc: Thiết kế mô hình 3D cho tòa nhà, nội thất và cảnh quan.
Kỹ thuật: Mô phỏng sản phẩm, quy trình sản xuất và đào tạo kỹ thuật.
Y tế: Hình ảnh y tế 3D, mô phỏng phẫu thuật và lập kế hoạch điều trị.
Ngoài đồ họa 2D và 3D, công nghệ đồ họa máy tính còn được ứng dụng trong nhiều lĩnh vực khác như:
Thực tế ảo (VR): Tạo ra môi trường 3D mô phỏng thực tế, cho phép người dùng tương tác và trải nghiệm như thật.
Thực tế tăng cường (AR): Kết hợp thông tin kỹ thuật số với thế giới thực, tạo ra trải nghiệm tương tác mới mẻ.
Thiết kế sản phẩm: Mô phỏng và thử nghiệm sản phẩm 3D trước khi sản xuất.
Giáo dục: Tạo ra các bài giảng và tài liệu học tập tương tác, hấp dẫn.
Khoa học: Phân tích dữ liệu khoa học………….
Thiết kế sản phẩm đồ họa 3D với openGL
Xây dựng ý tưởng thiết kế
Trong thế giới ngày nay, phòng ngủ không chỉ là nơi để nghỉ ngơi mà còn là nơi thể hiện phong cách và cá nhân hóa không gian riêng của mỗi người Với sự phát triển của công nghệ và sự sáng tạo trong thiết kế, chúng ta có cơ hội biến những ý tưởng tưởng chừng không thể thành hiện thực Nhóm chọn đề tài thiết kế phòng ngủ với mục tiêu tạo ra một không gian nghỉ ngơi lý tưởng, phản ánh cá nhân và thúc đẩy sự thoải mái và hạnh phúc của người sử dụng.
Hình 2 1 Sơ đồ bố trí các thành phần đồ họa
Trong đề tài này bao gồm:
Tranh treo tường Nhìn từ trên xuống để thấy vị trí các vật trong phòng:
Hình 2 2 Sơ đồ bố trí các thành phần đồ họa từ trên nhìn xuống
Trong thiết kế này sừ dụng 4 nguồn sáng bao gồm:
nguồn sáng của đèn trần (16.5, 18.85, 14.0f) sử dụng để chiếu sáng từ trên xuống cho toàn bộ ngôi nhà.
Nguồn sáng của đèn ngủ(2.0, 9.5, 27.0) sử dụng ánh sáng vô hướng để truyền
Nguồn sáng của tivi(28.9f, 10.0f, 16.0f) sử dụng làm ánh sáng của tivi
Nguồn sáng chính(0.0f, 0.0f, 1.0f) sử dụng làm nguồn sáng tổng quát dể di chuyển ánh sáng dựa trên góc nhìn của người xem.
Vẽ các đối tượng 3D
Diện tích phòng ngủ Đối với đề tài thiết kế phòng ngủ, diện tích phòng là một điều quan trọng quyết định không gian của phòng ngủ sẽ như thế nào Nhóm chọn diện tích phòng với kích thước 30x35x30 để tạo không gian rộng rãi thoáng mát.
Phòng gồm 6 mặt và có kich thước được thiết lập như sau:
// Vẽ tường mặt phẳng y0z mặt trái glColor3f(1.0f, 1.0f, 8f); glBegin(GL_QUADS); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 20.0, 0.0); glVertex3f(0.0, 20.0, 30.0); glVertex3f(0.0, 0.0, 30.0); glEnd();
// Vẽ tường mặt phẳng y0z mặt phải glColor3f(1.0f, 1.0f, 8f); glBegin(GL_QUADS); glVertex3f(35.0, 0.0, 0.0); glVertex3f(35.0, 20.0, 0.0); glVertex3f(35.0, 20.0, 30.0); glVertex3f(35.0, 0.0, 30.0); glEnd();
// Vẽ tường mặt phẳng y0x mặt trước glColor3f(.539f, 0.98f, 9653f); glBegin(GL_QUADS); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 20.0, 0); glVertex3f(35.0, 20.0, 0); glVertex3f(35.0, 0.0, 0.0); glEnd();
// Vẽ tường mặt phẳng y0x mặt sau glColor3f(0.96, 0.96, 0.5568); glBegin(GL_QUADS); glVertex3f(0.0, 0.0, 30.0); glVertex3f(0.0, 20.0, 30); glVertex3f(35.0, 20.0, 30); glVertex3f(35.0, 0.0, 30.0); glEnd();
// Vẽ tường mặt phẳng z0x mặt dưới glColor3f(1, 0.8328, 0.41); glBegin(GL_QUADS); glVertex3f(0.0, 0.0, 0.0); glVertex3f(35.0, 0.0, 0); glVertex3f(35.0, 0.0, 30.0); glVertex3f(0.0, 0.0, 30.0); glEnd();
// Vẽ tường mặt phẳng z0x mặt trên glColor3f(0.96, 0.9059, 0.8352); glBegin(GL_QUADS); glVertex3f(0.0, 20.0, 0.0); glVertex3f(35.0, 20.0, 0); glVertex3f(35.0, 20.0, 30.0); glVertex3f(0.0, 20.0, 30.0); glEnd();
Sau khi thiết lập xong sẽ được một hình hộp chữ nhật tượng trưng cho căn phòng.
Vách ngăn được chia làm 4 phần với 2 phần cố định và 2 phần có thể di chuyển để làm cửa đóng lại mỗi khi cần thiết.
Hình 2 3 Vách ngăn cửa kính
+ Vị trí đặt đối tượng: : (0;0;5) tạo 1 khoảng để thiết kế ban công ở phía sau.
Với phần tượng trưng cho cửa kính thì để màu (.96,.9574, 9504) - xám nhẹ đối
Với khung cửa thì để (.8, 5931, 024) - màu nâu đậm + Kích thước:
Khung dọc: (.7f, 20.0, 0.4f)+ Code sinh đối tượng: glPushMatrix(); glColor3f(.96,.9574, 9504); glTranslatef(4.0f, 10.0f, 0.0f); glScalef(8.0f, 20.0, 0.3f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(4.0f, 16.0f, 0.0f); glScalef(8.0f, 7, 0.4f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(7.65f, 10.0f, 0.0f); glScalef(.7f, 20.0, 0.4f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(.35f, 10.0f, 0.0f); glScalef(.7f, 20.0, 0.4f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix();
Bao gồm 1 bồn trồng hoa và thiết kế thoáng để ánh sáng chiếu vào phòng:
+ Vị trí đặt đối tượng: (17.5f, 1.5f, 1.0f) + Màu sắc :
+ Kích thước: (15.0f, 3.0, 2.0f) + Code sinh đối tượng: void DrawBanCong() {
//Thiet lap mau moi trường GLfloat ambient[] = { 0.98, 0.7513, 0, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiet lap màu khuech tan GLfloat diff_use[] = { 0.8846, 0.98, 0.2646, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap màu phản xạ GLfloat specular[] = { 0.97, 0.9512, 0.4074, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glDisable(GL_LIGHTING); glColor3f(1.0f, 1.0f, 9f); glBegin(GL_QUADS); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 8.0, 0); glVertex3f(35.0, 8.0, 0); glVertex3f(35.0, 0.0, 0.0); glEnd(); glColor3f(0.97, 0.858, 0.2231); glBegin(GL_QUADS); glVertex3f(0.0, 0.1, 0.0); glVertex3f(35.0, 0.1, 0); glVertex3f(35.0, 0.1, 5.0); glVertex3f(0.0, 0.1, 5.0); glEnd(); glEnable(GL_LIGHTING); glPushMatrix(); glColor3f(0.7, 0.6391, 0.294); glTranslatef(17.5f, 1.5f, 1.0f); glScalef(15.0f, 3.0, 2.0f); glutSolidCube(1.0f); glPopMatrix();
+ Vị trí đặt đối tượng: (30.0f, 7.5f, 30.0f) + Màu sắc :
Tay nắm cửa: (0.88, 0.7955, 0.0352) + Kích thước:
+ Code sinh đối tượng: void DrawCua() { glDisable(GL_LIGHTING); glColor3f(0.96, 0.96, 0.5568); glBegin(GL_QUADS); glVertex3f(0.0, 0.0, 30.0); glVertex3f(0.0, 20.0, 30); glVertex3f(35.0, 20.0, 30); glVertex3f(35.0, 0.0, 30.0); glEnd();
// Vẽ cửa glPushMatrix(); glColor3f(.96, 9574, 9504); glTranslatef(30.0f, 7.5f, 30.0f); glScalef(8.0f, 15.0, 0.3f); glutSolidCube(1.0f); glPopMatrix(); glEnable(GL_LIGHTING);
//Thiet lap mau moi truong vat lieu GLfloat ambient[] = { 8, 5931, 024, 0.0 }; glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
//Thiet lap do khuech tan mau GLfloat diff_use[] = { 0.96, 0.7686, 0.4608, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap do phan chieu GLfloat specular[] = { 0.72, 0.4854, 0.108, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiet lap do lon cho do phan chieu GLfloat shininess = 10.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(30.0f, 14.65f, 30.0f); glScalef(8.0f, 7, 0.4f); glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(30.0f, 0.35, 30.0f); glScalef(8.0f, 7, 0.4f); glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(30.0f, 7.25, 30.0f); glScalef(8.0f, 5, 0.4f); glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(26.0f, 7.5f, 30.0f); glScalef(.7f, 15.0, 0.4f); glPopMatrix(); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(34.0f, 7.5f, 30.0f); glScalef(.7f, 15.0, 0.4f); glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(.8, 5931, 024); glTranslatef(30.0f, 7.5f, 30.0f); glScalef(.5f, 15.0, 0.4f); glutSolidCube(1.0f); glPopMatrix();
//tay cầm // Vẽ phần thân của khối trụ glPushMatrix(); glColor3f(0.88, 0.7955, 0.0352); glTranslatef(33.0f, 7.25f, 29.5f);
GLUquadricObj* quadric1 = gluNewQuadric(); gluQuadricTexture(quadric1, GL_FALSE); gluCylinder(quadric1, 2, 2, 1, 20, 1); glPopMatrix(); glPushMatrix();
//2 hình cầu 2 bên khối khụ glColor3f(0.88, 0.7955, 0.0352); glTranslatef(33.0f, 7.25f, 29.7f); glutSolidSphere(.3, 20, 20); glPopMatrix(); glPushMatrix();
//2 hình cầu 2 bên khối khụ glColor3f(0.88, 0.7955, 0.0352); glTranslatef(33.0f, 7.25f, 30.3f); glutSolidSphere(.3, 20, 20); glPopMatrix();
+ Vị trí đặt đối tượng: (10.0, 3.0, 17.0) + Màu sắc :
Chăn: (10.0, 0.1, 13.0) + Code sinh đối tượng: void DrawGiuong() {
//Thiết lập màu môi trường của vật liệu GLfloat ambient[] = { 0.73, 0.4898, 0.0438, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiết lập độ khuyếch tán màu GLfloat diff_use[] = { 0.79, 0.6843,0.2133, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//Thiết lập độ phản chiếu GLfloat specular[] = { 0.65,0.5973,0.1235, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiết lập độ lớn cho specular GLfloat shininess = 20.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess);
//Mặt giường glPushMatrix(); glColor3f(0.6f, 0.4f, 0.0f); glTranslatef(0,-.5,0); glScalef(20.0, 2, 13.0); glutSolidCube(1.0); glPopMatrix();
//Đầu giường glPushMatrix(); glColor3f(0.6f, 0.4f, 0.0f); glTranslatef(-9.8, 2., 0); glScalef(.6, 3.0, 13.0); glutSolidCube(1.0); glPopMatrix();
// Chân bàn ở góc trên bên phai glPushMatrix(); glColor3f(0.6f, 0.4f, 0.0f); glTranslatef(9, -2.25, -6); glScalef(2.0, 1.5, 1); glutSolidCube(1.0); glPopMatrix();
// Chân bàn ở góc trên bên trai glPushMatrix(); glColor3f(0.6f, 0.4f, 0.0f); glTranslatef(-8, -2.25, -6); // Vị trí chân bàn glScalef(2.0, 1.5, 1); // Kích thước chân bàn glutSolidCube(1.0);
// Chân bàn ở góc duoi bên trai glPushMatrix(); glColor3f(0.6f, 0.4f, 0.0f); glTranslatef(-9, -2.25, 6); // Vị trí chân bàn glScalef(2.0, 1.5, 1); // Kích thước chân bàn glutSolidCube(1.0); glPopMatrix();
// Chân bàn ở góc duoi bên phai glPushMatrix(); glColor3f(0.6f, 0.4f, 0.0f); glTranslatef(9, -2.25, 6); // Vị trí chân bàn glScalef(2.0, 1.5, 1); // Kích thước chân bàn glutSolidCube(1.0); glPopMatrix();
//Thiết lập màu môi trường của vật liệu GLfloat ambient[] = { 0.98, 0.9477, 0.0098, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiết lập độ khuyếch tán màu GLfloat diff_use[] = { 1, 0.9797,0.2133, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//Thiết lập độ phản chiếu GLfloat specular[] = { 0.95, 0.7252, 0.2755, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiết lập độ lớn cho specular GLfloat shininess = 20.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess);
//Đệm glPushMatrix(); glColor3f(1, 1, 8); glTranslatef(0, 5, 0); glScalef(19.5, 1, 13.0); glutSolidCube(1.0); glPopMatrix(); glEnable(GL_LIGHTING);
GLfloat light_pos[] = { 8.0, 3.0, 17.0, 0.0 }; glLightfv(GL_LIGHT2, GL_POSITION, light_pos);
//Thiết lập màu môi trường của vật liệu GLfloat ambient[] = { 1.0, 0.0,0.0, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiết lập độ khuyếch tán màu GLfloat diff_use[] = { 0.8, 0.3, 0.2, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//Thiết lập độ phản chiếu GLfloat specular[] = { 0.95, 0.7252, 0.2755, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiết lập độ lớn cho specular GLfloat shininess = 50.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess);
// Vẽ chăn glPushMatrix(); glColor3f(1, 0.4667, 0.36); // Màu xasm glTranslatef(3.5, 1., 0.0); // Vị trí của chăn glScalef(10.0, 0.1, 13.0); // Kích thước của chăn glutSolidCube(1.0); glPopMatrix();
// Vẽ gối glPushMatrix(); glColor3f(0.8f, 0.8f, 0.8f); // Màu trắng glTranslatef(-6.5, 1.5, 3.0); // Vị trí của gối glScalef(2.5, 1, 5.0); // Kích thước của gối glutSolidCube(1.0); glPopMatrix();
// Vẽ gối glPushMatrix(); glColor3f(0.8f, 0.8f, 0.8f); // Màu trắng glTranslatef(-6.5, 1.5, -3.0); // Vị trí của gối glScalef(2.5, 1., 5.0); // Kích thước của gối glutSolidCube(1.0); glPopMatrix();
+ Vị trí đặt đối tượng:
Tủ 2: (2.0, 1.5, 8.0)+ Màu sắc : (0.73, 0.4898, 0.0438)+ Kích thước: (4.0f, 3.0, 4.0f) void DrawTu() {
//Thiet lap mau moi trường GLfloat ambient[] = { 0.71, 0.4828, 0.0284, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiet lap màu khuech tan GLfloat diff_use[] = { 1, 0.8613, 0.36, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap màu phản xạ GLfloat specular[] = { 0.95, 0.7252, 0.2755, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glPushMatrix(); glColor3f(0.73, 0.4898, 0.0438); glTranslatef(0, 0, 0); glScalef(4.0f, 3.0, 4.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix();
// Vẽ núm tay cầm mở tủ glColor3f(0.73, 0.6304, 0.2701); // Màu xám glTranslatef(1.57f, 0f, -1.0f); // Di chuyển đến vị trí phù hợp glutSolidSphere(0.5f, 20, 20); // Vẽ một hình cầu làm núm tay cầm glPopMatrix();
Hình 2 8 Đèn ngủ và ấm trà đặt trên tủ
+ Vị trí đặt đối tượng:
+ Code sinh đối tượng: void DrawDenNgu() {
//Thiet lap mau moi trường GLfloat ambient[] = { 0.9461, 0.96, 0.1248, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiet lap màu khuech tan GLfloat diff_use[] = { 1, 0.5, 0.5, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap màu phản xạ GLfloat specular[] = { 0.95, 0.7252, 0.2755, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiết lập độ lớn cho specular GLfloat shininess = 50.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess);
//nguồn sáng 1 - spot light (đèn chiếu giới hạn góc chiếu) float light_pos1[] = { 0.0,9.0,0.0,1.0 }; glLightfv(GL_LIGHT1, GL_POSITION, light_pos1); glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, diff_use); glLightfv(GL_LIGHT1, GL_SPECULAR, specular);
GLfloat spotExp = 5.0; glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, spotExp);
GLfloat spotCutoff = 40.0; glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, spotCutoff);
//GL_SPOT_DIRECTION: hướng chiếu sáng của nguồn sáng dạng spot float light_dir[3] = { 0.0,-1.0,0.0 }; glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, light_dir);
//Vẽ cái đèn ngủ glPushMatrix(); glTranslatef(0, 3, 0); glRotatef(270, 1, 0, 0); // Quay khối trụ 90 độ theo trục y glColor3f(0.9461, 0.96, 0.1248); // Màu xanh biển nhạt GLUquadricObj* quadric = gluNewQuadric(); gluQuadricNormals(quadric, GLU_SMOOTH); gluQuadricTexture(quadric, GL_FALSE); gluCylinder(quadric, 2, 1, 2, 20, 1); gluDeleteQuadric(quadric); glTranslatef(0.0, 0.0, -3.0); glColor3f(0.7477, 0.76, 0.0228); // Màu xanh biển nhạt GLUquadricObj* quadric1 = gluNewQuadric(); gluQuadricNormals(quadric1, GLU_SMOOTH); gluQuadricTexture(quadric1, GL_FALSE); gluCylinder(quadric1, 2, 2, 3, 20, 1); gluDeleteQuadric(quadric1);
// Vẽ nắp đèn ngủ (hình nón) glTranslatef(0.0, 0.0, 5.0); // Di chuyển lên trên một chút glColor3f(0.8561, 0.87, 0.0348); // Màu xanh biển nhạt gluDisk(quadric, 0, 1, 20, 1); // Vẽ đĩa phẳng đại diện cho nắp đèn glPopMatrix();
} void drawTeaPot() { glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiết lập độ khuyếch tán màu GLfloat diff_use[] = { 0.79, 0.6843,0.2133, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//Thiết lập độ phản chiếu GLfloat specular[] = { 0.95, 0.7252, 0.2755, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiết lập độ lớn cho specular GLfloat shininess = 20.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess);
//glColor3f(1.0, 1.0, 0.0); glPushMatrix();// Lưu ma trận hiện hành vào ngăn xếp glTranslatef(-2.0, 4.0, 1.0); glutSolidTeapot(.7); glPopMatrix(); // Lấy ma trận gốc từ đỉnh của ngăn xếp }
- Kệ ti vi + tivi + đồ trang trí:
Hình 2 9 Kệ tivi và đồ trang trí
+ Vị trí đặt đối tượng:
Đồ trang trí: (34.0f, 5.0f, 11.0f)+ Màu sắc :
Đồ trang trí: 0.7477, 0.76, 0.0228 + Kích thước:
Đồ trang trí: gluCylinder(quadric1, 1, 1, 1, 20, 1);
+ Code sinh đối tượng: void DrawKeTreoTuong() { glEnable(GL_LIGHTING);
//Thiet lap mau moi trường GLfloat ambient[] = { 0.71, 0.4828, 0.0284, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiet lap màu khuech tan GLfloat diff_use[] = { 1, 0.5, 0.5, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap màu phản xạ GLfloat specular[] = { 0.78, 0.6735, 0.0702, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glPushMatrix(); glColor3f(0.71, 0.4828, 0.0284); // Màu xanh biển nhạt glTranslatef(0, 0, 0); glScalef(2.0f, 4.0, 17.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix();
// Vẽ các đường kẻ tượng trưng cho cửa kệ glBegin(GL_LINES); glColor3f(0.8, 0.8, 0.8); // Màu xám nhạt glVertex3f(-1.0, -2.0, -8.3); glVertex3f(-1.0, 2.0, -8.3);
// Đường kẻ 2 glVertex3f(-1.0, -2.0, 3.3); glVertex3f(-1.0, 2.0, 3.3); glVertex3f(-1.0, -2.0, 8.3); glVertex3f(-1.0, 2.0, 8.3); glEnd();
} void DrawTiVi() { glEnable(GL_LIGHTING);
//Thiet lap mau moi trường GLfloat ambient[] = { 0, 0, 0, 0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiet lap màu khuech tan GLfloat diff_use[] = { 0.22, 0.1892, 0.1892, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap màu phản xạ
//Thiết lập độ lớn cho specular GLfloat shininess = 50.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess);
//nguồn sáng 3 - spot light (đèn chiếu giới hạn góc chiếu) float light_pos3[] = { -8.0,0.0,0.0,1.0 };
GLfloat specular3[] = { 0.2, 0.2, 0.2, 1.0 }; glLightfv(GL_LIGHT3, GL_POSITION, light_pos3); glLightfv(GL_LIGHT3, GL_AMBIENT, ambient3); glLightfv(GL_LIGHT3, GL_DIFFUSE, diff_use3); glLightfv(GL_LIGHT3, GL_SPECULAR, specular3);
GLfloat spotExp = 10.0; glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, spotExp);
GLfloat spotCutoff = 90.0; glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, spotCutoff);
//GL_SPOT_DIRECTION: hướng chiếu sáng của nguồn sáng dạng spot float light_dir[3] = {1.0,0.0,0.0 }; glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, light_dir); glPushMatrix(); glColor3f(0, 0, 0); // Màu xanh biển nhạt glTranslatef(0,0,0); // Di chuyển xuống dưới một chút để tạo khoảng cách với mặt sàn glScalef(.2f, 8.0, 15.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix();
//Thiết lập màu môi trường của vật liệu GLfloat ambient[] = { 0.9191, 0.3325, 0.95, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiết lập độ khuyếch tán màu GLfloat diff_use[] = { 0.9609, 0.5978,0.98, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//Thiết lập độ phản chiếu GLfloat specular[] = { 0.9806, 0.8019, 0.99, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiết lập độ lớn cho specular GLfloat shininess = 20.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess); glRotatef(270, 1, 0, 0); // Quay khối trụ 90 độ theo trục y // Vẽ phần thân của khối trụ glColor3f(0.7477, 0.76, 0.0228); // Màu xanh biển nhạt GLUquadricObj* quadric1 = gluNewQuadric(); gluQuadricNormals(quadric1, GLU_SMOOTH); gluQuadricTexture(quadric1, GL_FALSE); gluCylinder(quadric1, 1, 1, 1, 20, 1);
// Vẽ nắp trên glTranslatef(0.0, 0.0, 0.2); // Di chuyển lên trên gluDisk(quadric1, 0, 1, 20, 1); // Vẽ đĩa phẳng đại diện cho nắp trên
// Vẽ nắp dưới glTranslatef(0.0, 0.0, -2.0); // Di chuyển xuống dưới gluDisk(quadric1, 0, 1, 20, 1); // Vẽ đĩa phẳng đại diện cho nắp dưới gluDeleteQuadric(quadric1); glEnable(GL_LIGHTING);
Hình 2 10 Thảm bình hòa và tranh treo tường
+ Vị trí đặt đối tượng:
Tranh: 2f, 10.0, 17.0f + Code sinh đối tượng: void DrawThamSanNha() { glEnable(GL_LIGHTING);
//Thiết lập màu môi trường của vật liệu GLfloat ambient[] = { 1, 0.66, 0.66, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiết lập độ khuyếch tán màu GLfloat diff_use[] = { 1, 0.46, 0.46, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//Thiết lập độ phản chiếu GLfloat specular[] = { 0.97, 0.6887, 0.6887, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiết lập độ lớn cho specular GLfloat shininess = 10.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess); glColor3f(1, 0.66, 0.66); // Màu xanh biển nhạt glBegin(GL_QUADS); glVertex3f(0.0, 0.0, 0.0); // Điểm dưới bên trái glVertex3f(00.0, 0.0, 20.0); // Điểm trên bên trái glVertex3f(15.0, 0.0, 20.0); // Điểm dưới bên phải glVertex3f(15.0, 0.0, 00.0); // Điểm trên bên phải glEnd();
} void Hoa() { glEnable(GL_LIGHTING);
//Thiet lap mau moi truong vat lieu GLfloat ambient[] = { 1.0, 0.0 ,0.0, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiet lap do khuech tan mau GLfloat diff_use[] = { 1, 0.5, 0.5, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap do phan chieu GLfloat specular[] = { 1, 0.73, 0.73, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiet lap do nhẵn bóng của đối tượng GLfloat shininess = 60.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess); glPushMatrix(); glTranslatef(0.0, 4, 0.0); glutSolidCube(1); glPopMatrix(); glPushMatrix(); glTranslatef(0.0, 7, 0.0); glScalef(0.9, 0.7, 0.9); glutSolidDodecahedron(); glPopMatrix(); glFlush(); glDisable(GL_LIGHTING);
//Thiet lap mau moi truong vat lieu GLfloat ambient[] = { 0.0, 1.0 ,1.0, 0.0 }; glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
//Thiet lap do khuech tan mau GLfloat diff_use[] = { 0.0609, 0.87, 0.87, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap do phan chieu GLfloat specular[] = { 0.0, 0.0, 1.0, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiet lap do lon cho do phan chieu GLfloat shininess = 30.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess);
//vẽ thân bình glPushMatrix(); glScalef(0.7, 1.3, 0.7); glutSolidSphere(2, 100, 100); // Vẽ hình hộp chữ nhật glPopMatrix();
//vẽ miệng bình glPushMatrix(); glTranslatef(0.0, 4.5, 0.0); glScalef(0.35, 1.1, 0.35); glRotatef(90, 8.0, 0.0, 0.0); // Xoay vật thể quanh trục (8,0,0) glutSolidCone(3, 4, 100, 100); glPopMatrix();
//vẽ đế bình glPushMatrix(); glTranslatef(0.0, -2.5, 0.0); glScalef(0.3, 0.4, 0.3); glRotatef(-90, 8.0, 0.0, 0.0); // Xoay vật thể quanh trục (8,0,0) glutSolidCone(3, 4, 100, 100); glPopMatrix(); glFlush(); glDisable(GL_LIGHTING);
} void DrawTranh() { glDisable(GL_LIGHTING); glPushMatrix(); glColor3f(0.42, 1, 0.594); // Màu xanh biển nhạt glTranslatef(0,0,0); // Di chuyển xuống dưới một chút để tạo khoảng cách với mặt sàn glScalef(.2f, 10.0, 17.0f); // Kích thước vách ngăn glutSolidCube(1.0f);
//khung tranh glPushMatrix(); glColor3f(0.85, 0.6116, 0.0085); // Màu xanh biển nhạt glTranslatef(0, 0, 8.5); // Di chuyển xuống dưới một chút để tạo khoảng cách với mặt sàn glScalef(.25f, 10.0, 1.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(0.85, 0.6116, 0.0085); // Màu xanh biển nhạt glTranslatef(0, 0, -8.5); // Di chuyển xuống dưới một chút để tạo khoảng cách với mặt sàn glScalef(.25f, 10.0, 1.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(0.85, 0.6116, 0.0085); // Màu xanh biển nhạt glTranslatef(0, 4.5, 0.0); // Di chuyển xuống dưới một chút để tạo khoảng cách với mặt sàn glScalef(.25f, 1.0, 17.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix(); glPushMatrix(); glColor3f(0.85, 0.6116, 0.0085); // Màu xanh biển nhạt glTranslatef(0, -4.5, 0.0); // Di chuyển xuống dưới một chút để tạo khoảng cách với mặt sàn glScalef(.25f, 1.0, 17.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix();
+ Vị trí đặt đối tượng: 17.5, 19.85, 15.0f + Màu sắc :
Đèn: 0.99, 0.9471, 0.891 + Code sinh đối tượng: void DrawDenTran() {
//Thiet lap mau moi trường GLfloat ambient[] = { 0.98, 0.7551, 0.1862, 0.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
//Thiet lap màu khuech tan GLfloat diff_use[] = { 0.81, 0.5897, 0.5, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff_use);
//thiet lap màu phản xạ GLfloat specular[] = { 1, 0.8725, 0.55, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
//Thiết lập độ lớn cho specular GLfloat shininess = 50.0f; glMateriali(GL_FRONT, GL_SHININESS, shininess);
//nguồn sáng 1 - spot light (đèn chiếu giới hạn góc chiếu) float light_pos2[] = { 1.0,1.0,1.0,1.0 };
GLfloat specular2[] = { 1.0, 1.0, 1.0, 1.0 }; glLightfv(GL_LIGHT2, GL_POSITION, light_pos2); glLightfv(GL_LIGHT2, GL_AMBIENT, ambient2); glLightfv(GL_LIGHT2, GL_DIFFUSE, diff_use2); glLightfv(GL_LIGHT2, GL_SPECULAR, specular2);
GLfloat spotExp = 1.0; glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, spotExp);
GLfloat spotCutoff = 90.0; glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, spotCutoff); float light_dir[3] = { 0.0,-1.0,0.0 }; glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, light_dir); glPushMatrix(); glColor3f(0.97, 0.6926, 0.3298); // Màu xanh biển nhạt glTranslatef(0, 0, 0); glScalef(10.0f, 3, 10.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix(); glDisable(GL_LIGHTING); glPushMatrix(); glColor3f(0.99, 0.9471, 0.891); // Màu xanh biển nhạt glTranslatef(0, 0, 0); glScalef(8.0f, 3, 8.0f); // Kích thước vách ngăn glutSolidCube(1.0f); glPopMatrix();
Thiết lập các nguồn sáng
Position: 0.0f, 0.0f, 1.0f, 1.0f Ambient: 0.2f, 0.2f, 0.2f, 1.0f Diffuse: 1.0f, 1.0f, 1.0f, 1.0f Specular: 1.0f, 1.0f, 1.0f, 1.0f - Nguồn sáng định hướng:
Cutoff: 40.0 Direction: 0.0,-1.0,0.0 + Nguồn sáng (GL_LIGHT2):
Position: 1.0,1.0,1.0,1.0 Ambient: 1.0, 1.0, 1.0, 1.0 Diffuse: 1.0, 1.0, 1.0, 1.0 Specular: 1.0, 1.0, 1.0, 1.0 Exponent: 1.0
Cutoff: 90.0 Direction: 0.0,-1.0,0.0 + Nguồn sáng (GL_LIGHT3):
Position: -8.0,0.0,0.0,1.0 Ambient: 0.54, 0.54, 0.54, 1.0 Diffuse: 0.39, 0.39, 0.39, 1.0 Specular: 0.2, 0.2, 0.2, 1.0 Exponent: 10.0
Xử lý sự kiện bấm phím
+ Chức năng các phím tắt sử dụng
Phím tắt 5: bật tắt nguồn sáng light0.
Phím tắt 6: bật tắt nguồn sáng light1.
Phím tắt 7: bật tắt nguồn sáng light2.
Phím tắt 8: bật tắt nguồn sáng light3.
Phím tắt 9: Tắt tất cả nguồn sáng.
+ Code hàm xử lý sự kiện nhấn phím: void Keyboard(unsigned char key, int x, int y) { switch (key) { case '5': if (glIsEnabled(GL_LIGHT0)) { glDisable(GL_LIGHT0);
} glutPostRedisplay(); // Yêu cầu vẽ lại cửa sổ break; case '6': if (glIsEnabled(GL_LIGHT1)) { glDisable(GL_LIGHT1);
} glutPostRedisplay(); // Yêu cầu vẽ lại cửa sổ break; case '7': if (glIsEnabled(GL_LIGHT2)) { glDisable(GL_LIGHT2);
} glutPostRedisplay(); // Yêu cầu vẽ lại cửa sổ break; case '8': if (glIsEnabled(GL_LIGHT3)) { glDisable(GL_LIGHT3);
} glutPostRedisplay(); // Yêu cầu vẽ lại cửa sổ break; case '9': glDisable(GL_LIGHT0); glDisable(GL_LIGHT1); glDisable(GL_LIGHT2); break;
- Thay đổi góc chiếu của đèn:
+ Chức năng các phím tắt sử dụng
Phím tắt 1,2,3,4: Thay đổi góc nhìn thành góc nhìn chéo để thay đổi hướng chiếu của nguồn sáng môi trường.
Phím tắt a,w,s,d,e,r : Tăng giảm tọa độ điểm nhìn
Phím tắt i,k,j,l,o,p : Tăng giảm tọa độ điểm nhìn tới
Phím f : reset về tọa độ ban đầu đang sử dụng.
+ Code hàm xử lý sự kiện nhấn phím switch (key) { case '1': case '2': case '3': case '4':
// Cập nhật giá trị của currentView khi phím được nhấn currentView = key - '0'; printf("%d\n", currentView); // In ra để kiểm tra glutPostRedisplay(); // Yêu cầu vẽ lại cửa sổ break; case 'w': eyeY += 1.0; break; case 's': eyeY -= 1.0; break; case 'a': eyeX -= 1.0; break; case 'd': eyeX += 1.0; break; case 'e': eyeZ += 1; break; case 'r': eyeZ -= 1; break; case 'f': eyeX = 0.0; eyeY = 0.0; eyeZ = 0.0; refX = 0.0; refY = 0.0; refZ = 0.0; break; case 'i': refY += 1.0; break; case 'k': refY -= 1.0; break; case 'j': refX -= 1.0; break; case 'l': refX += 1.0; break; case 'o': refZ += 1; break; case 'p': refZ -= 1; break; default: break;
} switch (currentView) { case 1: gluLookAt(35 + eyeX, 20.0 + eyeY, 30 + eyeZ, 0.0 + refX, 0.0 + refY, 0.0 + refZ, 0.0, 1.0, 0.0); // Góc nhìn chéo break; case 2: gluLookAt(17.0 + eyeX, 12.0 + eyeY, 60.0 + eyeZ, 17.0 + refX, 12.0 + refY, 0.0 + refZ, 0.0, 5.0, 0.0); break; case 3: gluLookAt(17.0 + eyeX, 60.0 + eyeY, 15.0 + eyeZ, 17.0 + refX, 0.0 + refY, 15.0 + refZ, 0.0, 0.0, -5.0); break; case 4: default: gluLookAt(17.0 + eyeX, 8.0 + eyeY, 0.1 + eyeZ, 17.0 + refX, 8.0 + refY, 20.0 + refZ, 0.0, 5.0, 0.0); break;