Giáo trình Beginning DirectX9: Phần 1

95 86 0
Giáo trình Beginning DirectX9: Phần 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giáo trình Beginning DirectX9 phần 1 cung cấp cho người học các kiến thức: Kiến thức nền tảng, thao tác sử dụng, dùng phông nền, dùng khung hình, kiến thức 3D, phép xoay trong không gian, các phép biến đổi, ánh sáng không gian,... Hi vọng đây sẽ là một tài liệu hữu ích dành cho các bạn sinh viên đang theo học môn dùng làm tài liệu học tập và nghiên cứu. Mời các bạn cùng tham khảo chi tiết nội dung tài liệu.

Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN © 2004 by Premier Press, a division of Course Technology All rights reserved No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system without written permission from Course PTR, except for the inclusion of brief quotations in a review The Premier Press logo and related trade dress are trademarks of Premier Press and may not be used without written permission DirectX is a registered trademark of Microsoft Corporation in the U.S and/or other countries © Microsoft Corporation, 2002 All rights reserved All other trademarks are the property of their respective owners Important: Course PTR cannot provide software support Please contact the appropriate software manufacturer’s technical support line or Web site for assistance Course PTR and the author have attempted throughout this book to distinguish proprietary trademarks from descriptive terms by following the capitalization style used by the manufacturer Information contained in this book has been obtained by Course PTR from sources believed to be reliable However, because of the possibility of human or mechanical error by our sources, Course PTR, or others, the Publisher does not guarantee the accuracy, adequacy, or completeness of any information and is not responsible for any errors or omissions or the results obtained from use of such information Readers should be particularly aware of the fact that the Internet is an ever-changing entity Some facts may have changed since this book went to press Educational facilities, companies, and organizations interested in multiple copies or licensing of this book should contact the publisher for quantity discount information Training manuals, CD-ROMs, and portions of this book are also available individually or can be tailored for specific needs ISBN: 1-59200-349-4 Library of Congress Catalog Card Number: 2004090736 Printed in the United States of America 04 05 06 07 08 BH 10 Senior Vice President, Course PTR Group: Andy Shafran Publisher: Stacy L Hiquet Senior Marketing Manager: Sarah O’Donnell Marketing Manager: Heather Hurley Manager of Editorial Services: Heather Talbot Senior Acquisitions Editor: Emi Smith Associate Marketing Manager: Kristin Eisenzopf Project/Copy Editor: Karen A Gill Technical Reviewer: Joseph Hall Retail Market Coordinator: Sarah Dubois Interior Layout: Marian Hartsough Cover Designer: Steve Deschene CD-ROM Producer: Brandon Penticuff Indexer: Sharon Shock Proofreader: Sean Medlock Course PTR, a division of Course Technology 25 Thomson Place Boston, MA 02210 http://www.courseptr.com Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Thông tin tác giả WENDY JONES người dành trọn niềm đam mê cho máy tính từ lần nhìn thấy máy Apple IIe học trường phổ thông Kể từ tiếp cận với nó, dành khoảng thời gian rảnh rỗi vào cơng việc học lập trình BASIC kỹ thuật đồ hoạ, vẽ ý tưởng lên giấy vẽ thực máy tính Ngồi BASIC tiếp cận với ngôn ngữ khác Pascal, C, Java C++ Nghề nghiệp Wendy chuỗi thay đổi phát triển máy tính vậy, từ bỏ mơi trường lập trình DOS, tự trang bị cho kiến thức lập trình Window nhanh chóng nhảy sang giới NET Mặc dù công ty Internet đem lại nhiều tiền, khơng phải tất cả, Wendy mở rộng kỹ lập trình sang lĩnh vực lập trình games dồn tất sức lực cho niềm đam mê Wendy thực hoá niềm đam mê cô nhận đề nghị làm việc cho công ty Atari’s Humongous Entertainment với tư cách lập trình viên Trong xuốt trình làm việc Atari, cô làm việc hai môi trường PC máy chơi game cá nhân, bị quấn theo hàng loạt thách thức mà cơng việc đem đến Hiện Wendy làm việc phần mềm dành cho PocketPC thiết bị chơi game cầm tay Nếu bạn có góp ý hay câu hỏi sách này, bạn liên hệ với cô theo địa mail: gadget2032@yahoo.com Dịch TransTeam diễn đàn Gamedev.VN Beginning DirectX9 Bố cục sách Lời giới thiệu PHẦN I NHỮNG KIẾN THỨC NỀN TẢNG Chương DirectX gì, làm để sử dụng Chương Ví dụ sử dụng DirectX Chương Phơng nền, khung hình, hoạt cảnh PHẦN II NHỮNG THÀNH PHẦN CƠ BẢN CỦA MỘT THẾ GIỚI 3D Chương Những kiến thức 3D Chương Ma trận, phép biến đổi phép xoay không gian Chương Bảng mầu, vật liệu phủ ánh sáng không gian Chương Chia nhỏ làm mịn đối tượng Chương Vật thể, điểm chèn hiệu ứng PHẦN III NHỮNG KIẾN THỨC BỔ XUNG Chương Sử dụng DirectInput Chương 10 Hiệu ứng âm DirectSound Chương 11 Xây dựng dự án mẫu PHẦN IV PHỤ LỤC Phụ lục A Giải đáp tập cuối chương Phụ lục B Cách sử dụng CD-ROM Giải thích thuật ngữ Chỉ mục từ khoá Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN LỜI GIỚI THIỆU L ập trình game nói cơng việc thú vị giới lập trình đem lại cho bạn hội tạo giới ảo nơi mà sinh vật huyền bí, vùng đất chưa biết đến giấc mơ Liệu bạn tìm thấy điều nơi khác? Với nó, bạn đem đến cho người khả trở thành nhân vật nào, người mà họ mong muốn môi trường để họ sống theo sở thích Cũng mà ngành công nghiệp Game phát triển không ngừng, vượt qua giới hạn kéo theo phát triển cơng nghệ phục vụ cho Chỉ vài năm trước đây, có lẽ cấp độ người sử dụng chưa biết đến thiết bị thể hình ảnh 3D ngoại trừ máy trạm đắt tiền SGI dựa tảng OpenGL Tại thời điểm nói OpenGL thời kỳ phơi thai Đến máy tính cá nhân PC phổ biến hơn, OpenGL mở rộng tảng điều thực đem đến cú huých mạnh lịch sử phát triển game ứng dụng mơ khơng gian 3D Tại thời điểm đó, Windows chưa phải tảng tốt để phát triển games, nhiên họ nhanh chóng nhận lợi nhuận từ ngành công nghiệp Chính phiên DirectX sớm Microsoft tung Tuy nhiên thời gian đầu phổ biến tảng hạn chế OpenGL thừa nhận phương thức chuẩn để phát triển đồ hoạ 3D môi trường Windows Ngày nay, hầu hết game phát triển PC bán thị trường xây dựng tảng DirectX, giúp cho game thủ tận hưởng cơng nghệ đồ hoạ tiên tiến thực giới Những cần phải có để tiếp cận công nghệ này? Những kinh nghiệm kiến thức lập trình C++ lý thuyết lập trình hướng đối tượng (OOP) giúp bạn hiểu tất giảng trình bày sách Ngoài bạn nên trang bị thêm cho vài kỹ tốn học hình hoạ, nhiên hầu hết khái niệm tốn học sử dụng giải thích chi tiết Những hiểu biết Visual Studio NET hay sản phẩm Visual Studio hữu ích Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Làm để sử dụng sách hiệu quả? Quyển sách chia làm phần Phần mơ tả cở DirectX, làm để thiết lập chạy ứng dụng sử dụng tảng Phần thứ hai cung cấp cho bạn khái niệm phục vụ trình thiết kế xây dựng mơi trường 3D, kèm theo giới thiệu khái niệm 3D Direct3D Phần phần cuối xoay quanh kiến thức khác tảng DirectX xử lý âm thông qua DirectSound, lấy thông tin đầu vào từ người dùng thông qua DirectInput Quyển sách kết thúc dự án minh hoạ nhỏ với hi vọng đem đến cho bạn nhìn tồn cảnh tất các kiến thức học áp dụng cụ thể chúng Nếu bạn làm quen với môi trường DirectX viết vài ứng dụng sử dụng tảng này, bạn bỏ qua phần Tơi nghĩ tiếp cận với môi trường lập trình game DirectX nên đọc sách cách để hiểu hết khả mà DirectX đem lại Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN PHẦN I KIẾN THỨC NỀN TẢNG Chương DirectX gì, làm để sử dụng Chương Ví dụ sử dụng DirectX Chương Phơng nền, khung hình, hoạt cảnh Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN CHƯƠNG DirectX gì, Tại Làm để sử dụng D irectX thực chất hệ thống giao diện lập trình ứng dụng (API) phục vụ cho trình phát triển game tảng hệ điều hành Windows Nếu thời điểm vài năm trước, người phát triển game thường phải vật lộn với vấn đề nảy sinh từ khơng tương thích phần cứng - khơng thể phát triển sản phẩm game để tất người tận hưởng tính game Thì ngày nay, Microsoft đem tới tảng DirectX Nó cung cấp cho người phát triển game phương thức đơn nhất, tảng thư viện API “sạch” (đã chuẩn hoá) để họ viết chạy hầu hết tảng mà không cần phải lo ngại nhiều phần cứng PC Chỉ vài năm sau phiên DirectX đề xuất, số lượng game phát triển tảng Windows tăng lên cách nhanh chóng Trong chương này, đề cập tới vấn đề: ƒ DirectX ƒ Tại lại hữu dụng đến ƒ Thành phần xây dựng nên tảng DirectX API DirectX gì? DirectX tập hợp thư viện hàm API Microsoft thiết kế để cung cấp cho người phát triển game giao diện lập trình cấp thấp để liên kết tới phần cứng PC chạy hệ điều hành Windows Phiên 9.0(c), đối tượng API DirectX cung cấp khả truy cập khác tới loại phần cứng hệ thống, bao gồm hệ thống đồ hoạ, âm kết nối mạng, tất chúng xây dựng giao diện chuẩn Giao diện cho phép người phát triển viết game họ cách sử dụng tập hợp cách hàm lại với mà không cần phải quan tâm nhiều tới phần cứng mà sử dụng Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Những thành phần tạo nên DirectX Hệ thống thư viện API DirectX phân chia làm nhiều thành phần nhỏ, thành phần đảm nhiệm nhiệm vụ khác hệ thống Chúng sử dụng hồn tồn độc lập với nhau, bạn cần thêm thành phần mà game bạn cần tới mà Sau danh sách thành phần đó: ƒ DirectX Graphic Thành phần đảm nhiệm tất chức kết xuất đồ hoạ hệ thống Nó cung cấp hàm API để người dùng quản lý q trình vẽ 2D 3D, ngồi hỗ trợ trình khởi tạo xác lập độ phân giải cho game bạn ƒ DirectInput Tất người dùng nhập vào quản lý hàm API thành phần Nó bao gồm khả hỗ trợ thiết bị bàn phím, chuột, gamepad, joystick Với phiên hỗ trợ thiết bị tương tác thực (force-feedback) cần lái, chân ga cho game đua tốc độ ƒ DirectPlay Khả kết nối mạng cung cấp cho hệ thống game bạn thông qua thành phần DirectPlay Những hàm phục vụ kết nối đem đến cho bạn khả phát triển ứng dụng giao tiếp với máy khác, cho phép khơng người chơi game DirectPlay đem đến cho bạn giao diện lập trình cấp cao nhằm giúp bạn tránh khỏi vấn đề khó khăn q trình lập trình ứng dụng liên kết mạng ƒ DirectSound Nếu bạn muốn chèn thêm hiệu ứng âm nhạc nền, bạn cần phải sử dụng tới hàm API thành phần cung cấp Chức DirectSound cho phép bạn tải chơi nhiều file nhạc dạng WAV toàn khả điều khiển q trình chơi nhạc ƒ DirectMusic Thành phần mang đến cho bạn khả tạo nhạc “động” (tại thời điểm chương trình chạy, khơng cần phải lưu trữ sở liệu game) Nó có khả hỗ trợ hầu hết chức phần mềm chơi nhạc midi tự chạy lại theo qui trình xác lập, biến đổi âm lượng để phù hợp với hoạt cảnh game, thay đổi nhịp giai điệu nhiều chức cao cấp khác ƒ DirectShow Bạn cắt hoạt cảnh phim lồng ghép âm game thơng qua thành phần AVI, MP3, MPEG ANF số nhiều loại định dạng file mà DirectShow hỗ trợ Với DirectShow, bạn tải tất đối tượng file lên nhớ, thay vào truy cập trực tiếp liệu ổ cứng CD-ROM ƒ DirectSetup Sau game bạn hoàn thành, bạn muốn phát hành DirectSetup cung cấp cho bạn chức giúp ứng dụng tự động cài đặt phiên DirectX lên hệ thống người sử dụng Chú ý: Hệ thống đồ hoạ DirectX bao gồm toàn chức DirectDraw Direct3D Phiên DirectX 7.0 phiên cuối phân tách hai thành phần thành hai đối tượng độc lập Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Tại DirectX lại cần thiết? Trước hệ điều hành Windows phát hành, lập trình viên chủ yếu phát triển game tảng hệ điều hành DOS Đấy hệ điều hành đơn nhiệm, không hỗ trợ giao diện đồ hoạ (non-GUI) cách để thực thao tác đồ hoạ truy cập trực tiếp vào phần cứng thực thi chúng Điều đem đến lợi ích vấn đề khó khăn cần giải Ta ví dụ ra, sử dụng cách truy cập trực tiếp mã game phần cứng, lập trình viên có tồn sức mạnh quyền điều khiển hệ thống, điều đem đến khả hoạt động với hiệu suất chất lượng cao hệ thống game Tuy nhiên, mặt trái vấn đề nhà phát triển game phải tự xây dựng cho thư viện hỗ trợ cho loại thiết bị phần cứng họ muốn game có khả hỗ trợ Nó bao gồm thiết bị phổ thông card âm đồ hoạ Tại thời điểm đó, khơng phải tất thiết bị tuân theo chuẩn định Chính điều làm cho trình thao tác hình đồ hoạ khó khăn đặc biệt bạn muốn phát triên game có độ phân giải 320 x 240 pixel Chỉ việc viết game sử dụng độ phân giải 640 x 480 khiến lập trình viên phải truy cập trực tiếp vào nhớ video tự quản lý tồn trình cập nhật ghi sử lý card đồ hoạ Và họ nghĩ đến lúc cần phải tìm kiếm cách khác đơn giản hiệu Khi mà phiên Windows 3.1 thức phát hành, vấn đề chưa giải Hơn thế, Windows chạy DOS nên vơ tình làm giảm tài nguyên hệ thống giành cho game loại bỏ tồn khả truy cập trực tiếp mà nhà phát triển game hay dùng trước từ lâu Vậy hầu hết game hỗ trợ Window thời điểm chủ yếu game đánh game đơn giản khác Trong game hành động tiếp tục phát triển tảng DOS Mặc dù trước đó, Microsoft cố gắng cung cấp cho người phát triển cách cách truy cập nhanh tới thiết bị đồ hoạ thơng qua hệ thống thư viện có tên WinG Nó tiền thân DirectX hỗ trợ chức WinG thực ý tưởng hay, nhiên chưa thể đem tới cho người phát triển khả truy cập hệ thống tốt so với cách mà họ thích làm hệ điều hành DOS Chính thế, Microsoft có cải tiến bổ xung thêm nhiều chức phiên DirectX, hay biết tới với tên GameSDK (bộ công cụ phát triển game) DirectX cung cấp cho lập trình viên thư viện độc lập để phát triển, lớp trung gian game phần cứng PC Lúc trình thao tác đồ hoạ trở nên dễ dàng nhiều Tuy nhiên phiên DirectX chưa hỗ trợ nhiều dạng phần cứng khác nhau, thực thay đổi có ý nghĩa thực đáp ứng mong muốn người phát triển game Chỉ vài năm sau, họ phát hành phiên DirectX 9, phiên bổ xung tăng khả hỗ trợ công nghệ kết nối mạng, kết xuất âm thanh, hình ảnh hỗ trợ nhiều dạng thiết bị đầu vào 10 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Khi bạn nạp vào mơ hình, vecto đặt hệ tọa độ địa phương gọi khơng gian mơ hình Khơng gian mơ hình liên hệ với hệ tọa độ tổng thể nơi mà mơ hình đặt vào Ví dụ như, lúc tạo đối tượng, vecto đối tượng liên quan đến điểm gốc nằm gần chúng Một hình hộp kích thước đơn vị đặt trung tâm vecto cách gôc tọa độ đơn vị theo trục Nếu bạn muốn đặt hình hộp khác, bạn cần phải biến đổi vecto từ hệ tọa độ địa phương sang hệ tọa độ tổng thể Hệ tọa độ tổng thể này, gọi (world space) trình biến đổi vecto sang hệ thống gọi (world transformation) World Transformation Giai đoạn (world transformation) hệ chuyển đổi hình học đưa đối tượng với hệ toạ độ địa phương sang hệ toạ độ tổng thể Hệ toạ độ tổng thể hệ thống mà vật thể đặt vị trí khơng gian 3D Các mơ hình sau chuyển đổi hệ tổng thể gắn với điểm gốc hệ Hình 5.5 biểu diễn đối tượng 3D gắn với gốc toạ độ Giai đoạn hệ chuyển đổi hình học (view transformation) Bởi tất đối tượng thời điểm gắn với điểm gốc nhất, bạn quan sát chúng từ điểm Để quan sát khung cảnh từ điểm bất kì, cần đến phép biến đổi view transformation HÌnh 5.5: Các đối tượng gắn chung với điểm gốc View Transformation View transformation biến đổi tọa độ từ không gian thực sang không gian camera Không gian camera gắn với hệ tọa độ để xác định vị trí Khi ta đặt điểm nhìn cho camera (ảo) hệ tọa độ không gian thực thay đổi tương ứng với camera 81 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Chú ý: Ở tơi nói “camera ảo” thay cho “camera” khái niệm camera khơng gian 3D thực không tồn Bằng cách di chuyển camera(ảo) dọc lên theo trục Y di chuyển toàn không gian thực dọc xuống theo trục Y, ta đạt kết Với góc quay điểm nhìn camera, bạn biểu diễn thứ lên hình Projection Transformation Giai đoạn hệ thống chuyển đổi hình học projection transformation projection transformation tác động đến chiều sâu không gian Khi vật thể nằm gần camera trơng lớn so với cách xa camera, điều tạo cảm giác độ sâu Các vecto theo chuyển dạng 2D Và kết ảnh 2D mô cho khung cảnh 3D kết xuất hình Bảng 5.1 cho thấy kiểu biến đổi hệ chuyển đổi hình học kiểu khơng gian tương ứng mà tác dụng lên Ma trận gì? Ma trận mảng chia thành hàng cột Dưới ma trận 4x4 chứa giá trị từ đến 16 ⎡1 4⎤ ⎢5 8⎥ ⎢ ⎥ ⎢ 10 11 12⎥ ⎢ ⎥ ⎣13 14 15 16⎦ Ma trận dùng 3D cho phép biến đổi Các giá trị chứa ma trận dùng để dịch chuyển, xoay, tỉ lệ đối tượng Mỗi hàng ma trận biểu diễn trục hệ tọa độ Hàng thứ chứa tọa độ trục x, hàng thứ hai chứa tọa độ trục y, hàng thứ chứa tọa độ trục z Mỗi phần tử ma trận biểu diễn thành phần phép biến đổi Ví dụ như, phần tử13, 14, 15 chứa vị trí X, Y, Z vecto Các phần tử 1, 11 chứa hệ số tỉ lệ Đoạn code sau định nghĩa ma trận: float matrix [4][4] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 2.0f, 3.0f, 2.0f, 1.0f }; 82 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Hàng cuối ma trận biểu diễn đối tượng có tọa độ X=2.0f, Y=3.0f, Z=2.0f Ma trận đồng Ma trận đồng ma trận mặc định, đặt vật thể gốc tọa độ với tỉ lệ thu phóng Giá trị phần tử 1, 6, 11 gán 1, nhằm tạo đối tượng với hệ số thu phóng Các phần tử 13, 14, 15 có giá trị Ma trận đồng định nghĩa đây: float IdentityMatrix [4][4] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; Nếu bạn muốn đưa vật thể trở gốc tọa độ, bạn biến đổi vecto thơng qua ma trận đồng Vật thể qua đưa trở gốc tọa độ mà không bị xoay, thu phóng Sau bạn tự dịch chuyển vật thể đến chỗ bạn muốn Initializing a Matrix Tạo hay thay đổi ma trận đơn giản việc thay đổi phần tử mảng Ví dụ như, bạn có ma trận đồng bạn muốn biến thành ma trận biến đổi dịch chuyển vật thể đơn vị theo trục X đơn vị theo trục Y, bạn thay đổi nội dung ma trận sau: Matrix[0][4] = 5.0f; Matrix[1][4] = 3.0f; Matrix[2][4] = 0.0f; Và ma trận có dạng: float Matrix [4][4] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 5.0f, 3.0f, 0.0f, 1.0f }; Kết ta có chứa thơng số cần thiết để dịch chuyển vật thể yêu cầu Phép nhân ma trận Chắc hẳn bạn thắc mắc ma trận tác dụng lên vecto vật thể Tốt thôi, ta cần nhân vecto vật thể với ma trận để có vecto biến đổi Về mặt tốn học điều đơn giản Thành phần X vecto biến đổi ta nhân hàng ma trận với vecto Khi vecto biến đổi nhận thơng qua việc tổng hợp kết phép nhân Cơng thức cho phép nhân là: 83 Dịch TransTeam diễn đàn Gamedev.VN Beginning DirectX9 ⎡X ⎤ ⎡ A ⎢Y ⎥ ⎢ E ⎢ ⎥ x⎢ ⎢Z ⎥ ⎢ I ⎢ ⎥ ⎢ ⎣W ⎦ ⎣ M B F J N C G K O D ⎤ ⎡ AX + BY + CZ + DW ⎤ H ⎥⎥ ⎢⎢ EX + FY + GZ + HW ⎥⎥ = L ⎥ ⎢ IX + JY + KZ + LW ⎥ ⎥ ⎢ ⎥ P ⎦ ⎣ MX + NY + OZ + PW ⎦ Ma trận vecto cần biến đổi Ma trận ma trận biến đổi Ma trận thứ ba vecto sau biến đổi Bạn thực phép nhân ma trận cách nhân hàng ma trận với cột ma trận kía ⎡A ⎢E ⎢ ⎢I ⎢ ⎣M B F J N C G K O D⎤ ⎡ ⎤ H ⎥⎥ ⎢⎢ ⎥⎥ x L ⎥ ⎢ 10 11 12⎥ ⎥ ⎢ ⎥ P ⎦ ⎣13 14 15 16⎦ Lấy hàng ma trận bên trái nhân với cột ma trận bên phải Ví dụ ta lấy hàng ma trận trái nhân cột ma trận phải ta có: A × + B × + C × + D × 13 Chú ý: phép nhân ma trận khơng có tính hốn vị, ta đổi chỗ hai ma trận với ta có ma trận kết khác Vì vậy, thứ tự ma trận yếu tố quan trọng phép nhân ma trận Cách định nghĩa ma trận Direct3D Direct3D đơn giản hóa việc tạo ma trận thông qua cấu trúc D3DMATRIX sau: typedef struct _D3DMATRIX { union { struct { float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; }; float m[4][4]; }; } D3DMATRIX; Sử dụng cấu trúc D3DMATRIX mà Direct3D cung cấp, bạn cung cấp thêm nhiều hàm tiện lợi khác thao tác ma trận ví dụ hàm khởi tạo ma trận D3DX làm cho ma trận đơn giản Phần trên, ta giới thiệu cấu trúc D3DMATRIX mà Direct3D cung cấp Nó giúp đơn giản hóa việc định nghĩa quản lý ma trận bắt bạn phải tự thực tính tốn đó, thư viện D3DX giúp bạn điều Thư viện D3DX có cấu trúc D3DXMATRIX Các thành phần D3DXMATRIX giống D3DMATRIX, D3DXMATRIX cung cấp thêm 84 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN vài tiện ích khác Nó cung cấp vài hàm cho phép bạn thực tính tốn, so sánh Cấu trúc D3DXMATRIX định nghĩa sau: typedef struct D3DXMATRIX : public D3DMATRIX { public: D3DXMATRIX() {}; D3DXMATRIX( CONST FLOAT * ); D3DXMATRIX( CONST D3DMATRIX& ); D3DXMATRIX( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 ); // access grants FLOAT& operator () ( UINT Row, UINT Col ); FLOAT operator () ( UINT Row, UINT Col ) const; // casting operators operator FLOAT* (); operator CONST FLOAT* () const; // assignment operators D3DXMATRIX& operator *= ( CONST D3DXMATRIX& ); D3DXMATRIX& operator += ( CONST D3DXMATRIX& ); D3DXMATRIX& operator -= ( CONST D3DXMATRIX& ); D3DXMATRIX& operator *= ( FLOAT ); D3DXMATRIX& operator /= ( FLOAT ); // unary operators D3DXMATRIX operator + () const; D3DXMATRIX operator - () const; // binary operators D3DXMATRIX operator * ( CONST D3DXMATRIX& ) const; D3DXMATRIX operator + ( CONST D3DXMATRIX& ) const; D3DXMATRIX operator - ( CONST D3DXMATRIX& ) const; D3DXMATRIX operator * ( FLOAT ) const; D3DXMATRIX operator / ( FLOAT ) const; friend D3DXMATRIX operator * ( FLOAT, CONST D3DXMATRIX& ); BOOL operator == ( CONST D3DXMATRIX& ) const; BOOL operator != ( CONST D3DXMATRIX& ) const; } D3DXMATRIX, *LPD3DXMATRIX; Điều bạn thấy D3DXMATRIX cấu trúc kế thừa từ D3DMATRIX bổ xung thêm số hàm khiến cho giống lớp (class) C++ Theo cách định nghĩa này, bạn truy cập tới thơng qua C++, sử dụng lớp (class) thật với thành phần public Nhìn qua cấu trúc này, bạn thấy viết chồng (overload) nhiều tốn tử dùng cho việc tính tốn ma trận Bởi vì, cấu trúc D3DXMATRIX hữu dụng, nên sử dụng nhiều phần Điều khiển đổi tượng 3D thông qua ma trận Như vậy, ta biết sơ qua khái niệm ma trận, ta tiếp tục xem xét tính hữu dụng Ta sử dụng ma trận muốn kiểm sốt đối tượng không gian Cho dù bạn muốn di chuyển đối tượng lòng vòng hay đơn giản xoay nó, bạn cần phải thực thơng qua ma trận D3DX cung cấp hàng loạt hàm để bạn kiểm sốt đối tương dễ dàng thông qua ma trận Dưới số đó: ■ D3DXMatrixIdentity Làm ma trận (biến lại ma trận đồng nhất) 85 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN D3DXMatrixRotationX Xoay đối tượng quanh trục X ■ D3DXMatrixRotationY Xoay đối tượng quanh trục Y ■ D3DXMatrixScaling Phép tỉ lệ (thu phóng) đỗi tượng ■ D3DXMatrixTranslation Dịch chuyển đối tượng theo trục ■ Di chuyển đối tượng Để di chuyển đối tượng lòng vòng game, bạn cần phải thực phép tịnh tiến Phép tịnh tiến tác động làm cho đối tượng di chuyển theo trục tọa độ Nếu bạn muốn di chuyển đối tượng sang phải chẳng hạn, bạn tịnh tiến dọc theo trục X hướng dương Tịnh tiến vật thể thực thông qua hàm D3DXMatrixTranslation đây: D3DXMATRIX *D3DXMatrixTranslation( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z ); Hàm D3DXMatrixTranslation cần đối số ■ pOut Ma trận đầu Con trỏ đến đối tượng D3DXMATRIX ■ x Khoảng dịch chuyển theo trục X Chấp nhận âm dương ■ y Khoảng dịch chuyển theo trục Y ■ z Khoảng dịch chuyển theo trục Z Đoạn code sau cho thấy cách sử dụng hàm D3DXMatrixTranslation D3DXMATRIX matTranslate; D3DXMATRIX matFinal; // Đưa ma trận matFinal ma trận đồng D3DXMatrixIdentity(&matFinal); // tịnh tiến đối tượng 64 đơn vị bên phải theo trục X // Ma trận kết lưu vào matTranslate D3DXMatrixTranslation(&matTranslate, 64.0f, 0.0f, 0.0f); // Nhân ma trận tịnh tiến ma trận đồng để có ma trận biến đổi // ma trận biến đổi lưu trữ finalMat D3DXMatrixMultiply(&finalMat, &finalMat, & matTranslate); // thực phép biến đổi đối tượng không gian thực pd3dDevice->SetTransform(D3DTS_WORLD, &finalMat); Hàm D3DXMatrixTranslation sử dụng để tịnh tiến đối tượng 64 đơn vị bên phải trục X Để thực phép biến đổi với đối tượng, ta nhân ma trận tịnh tiến với ma trận đồng nhất, sau đối tượng quy đổi khơng gian thực Xoay đối tượng Phép tịnh tiến đối tượng thật tuyệt, bạn chưa thực làm thứ mà game bạn đòi hỏi Sẽ thú vị trò đua xe bạn khơng thể lượn xe quanh vòng cua … lý xe bạn di chuyển đường thẳng? Đó lý mà bạn cần đến phép xoay Nếu xe có khả xoay thì ngoặt, lượn theo khúc cua 86 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Kết hợp phép xoay tịnh tiến đối tượng 3D cho phép nhân vật bạn di chuyển tự không gian game Phép xoay cho phép bánh xe tơ quay, cánh tay cử động, bóng chày xoay tròn bay… Phép xoay trình quay đối tượng xung quanh trục tọa độ Bởi phép xoay thực thông qua ma trận, nên thư viện D3DX cung cấp vài hàm hữu ich để đơn giản hóa q trình Phép xoay thực trục vào thời điểm trục trục tọa độ D3DX cung cấp cho trục tọa độ hàm xoay Ví dụ như, bạn muốn xoay đỗi tượng quanh trục X, bạn dùng hàm D3DXMatrixRotationX, định nghĩa đây: D3DXMATRIX *D3DXMatrixRotationX( D3DXMATRIX *pOut, FLOAT Angle ); Hàm D3DXMatrixRotationX có đối số: ■ pOut Con trỏ đến đối tượng kiểu D3DXMATRIX Chứa ma trận trả ■ Angle Góc xoay đối tượng (dạng radian) Sử dụng hàm D3DXMatrixRotationX hay có liên quan đơn giản Đầu tiên, ta định nghĩa cấu trúc D3DXMATRIX chứa ma trận kết quả, sau đưa vào góc xoay xong Đoạn code sau cho thấy cách sử dụng hàm này: D3DXMATRIX matRotate; // ma trận kết D3DXMatrixRotationX(&matRotate, D3DXToRadian(45.0f)); Bạn định nghĩa ma trận đầu gọi hàm D3DXMatrixRotationX Bạn thấy, với tham số thứ hai ta sử dụng lệnh trợ giúp D3DXToRadian Lệnh nhận vào góc khoảng đên 360 độ chuyển thành dạng radian Trong ví dụ trên, góc xoay 45 độ Kết phép xoay đối tượng xoay quanh trục X 45 độ Hình 5.6 biểu diễn hình hộp xoay quanh trục Y Đoạn code sau cho thấy bước cần làm để xoay hình hộp quanh trục Y Phép xoay thực dựa đếm thời gian hình hộp xoay liên tục Hình 5.6 Hình hộp xoay quanh trục Y /************************************************************************ * render ************************************************************************/ void render(void) { // xóa back buffer màu đen pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 87 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN D3DCOLOR_XRGB(255,255,255), 1.0f, ); pd3dDevice->BeginScene(); // đặt luồng vecto pd3dDevice->SetStreamSource( 0, vertexBuffer, 0, sizeof(CUSTOMVERTEX) ); // định dạng vecto pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); // gán meshMat ma trận đơn vị D3DXMatrixIdentity(&objMat); // cài đặt ma trận xoay D3DXMatrixRotationY(&matRotate, timeGetTime()/1000.0f); // nhân ma trận tỉ lệ ma trận xoay để có ma trận objMat D3DXMatrixMultiply(&finalMat, &objMat, &matRotate); // thưc phép biến đổi khơng gian thực pd3dDevice->SetTransform(D3DTS_WORLD, &finalMat); // Render hình hộp kiểu triangle strips pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 4, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 8, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 12, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 16, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 20, ); pd3dDevice->EndScene(); // biểu diễn front buffer pd3dDevice->Present( NULL, NULL, NULL, NULL ); } Có biến khai báo đầu hàm render objMat, matRotate, finalMat Những biến ma trận lưu trữ thơng tin hình hộp Phần trước bạn học cách đưa ma trận dạng đồng , ma trận objMat cần làm lần hàm render gọi Điều nhằm mục đich làm cho phép xoay ln thực gốc tọa độ Như objMat biểu diễn vị trí thực hình hộp D3DXMatrixIdentity(&objMat); Ma trận thứ hai matRotate, chứa thông tin phép xoay hình hộp Bởi hình hộp cần xoay liên tục, bạn cần cập nhật ma trận matRotate cho lần xoay với vị trí hình hộp Phép xoay thực thơng qua D3DXMatrixRotationY, hàm thư viện D3DX Những hàm xoay thư viện D3DX viết đè thông tin ma trận qua lần xoay, mà bạn khơng cần gọi D3DXMatrixIdentity để đồng hóa ma trận D3DXMatrixRotationY(&matRotate, timeGetTime()/1000.0f); Hàm timeGetTime sử dụng thời gian chia cho 1000.0f để xoay hình hộp trơn chu Tóm lại, bạn có hai ma trận, biểu diễn vị trí đối tượng biểu diễn vận động đối tượng, bạn cần nhân hai ma trận với để có ma trận cuối biểu diễn qua finalMat Ma trận kết quy đổi hình hộp khơng gian thực qua hàm SetTransform đây: pd3dDevice->SetTransform(D3DTS_WORLD, &finalMat); 88 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Kết trả từ SetTransform hình hộp đặt vị trí định hướng khơng gian thực Hàm render vẽ hình hộp qua lời gọi DrawPrimitive Bạn tìm thấy mã nguồn phép xoay đối tượng thư mục chapter5\example2 đĩa CD Tâm phép xoay Tâm phép xoay đối tựợng phụ thuộc vào trục mà xoay quanh Nếu đối tượng, ví hình hộp hình 5.6 xoay , tâm xoay làm cho quay tròn xung quanh gốc tọa độ Nếu đối tựợng tịnh tiến xa gốc tọa độ dọc theo trục đó, tâm xoay dịch chuyển dọc trục làm cho đối tượng bị dịch chuyển sang vị trí khác trình thực phép xoay Nhìn vào hinh 5.7, ta thấy hình hộp tịnh tiến dọc theo trục X Y trước bị xoay Khi hình hộp xoay quanh trục X, bị tịnh Hình 5.7: Hình hộp xoay quanh trục X tiến suốt trình xoay sau tịnh tiến xa gốc tọa độ Để thay đổi tâm phép xoay, bạn cần phải tịnh tiến đối tượng xa gốc tọa độ trước tiến hành phép xoay Đoạn code sau cho thấy cách mà tâm xoay thay đổi tịnh tiến đổi tượng /************************************************************************ * render ************************************************************************/ void render(void) { // xóa back buffer màu đen pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, ); pd3dDevice->BeginScene(); pd3dDevice->SetStreamSource( 0, vertexBuffer, 0, sizeof(CUSTOMVERTEX) ); pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); // tịnh tiến đối tượng xa gốc tọa độ D3DXMatrixTranslation(&matTranslate, 64.0f, 0.0f, 0.0f); // cài đặt phép quay D3DXMatrixRotationY(&matRotate, timeGetTime()/1000.0f); // Nhân ma trận tịnh tiến ma trận xoay để có ma trận objMat D3DXMatrixMultiply(&objMat, &matTranslate, &matRotate); // thực phép biến đổi không gian thực pd3dDevice->SetTransform(D3DTS_WORLD, &objMat); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 4, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 8, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 12, ); 89 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 16, ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 20, ); pd3dDevice->EndScene(); // đưa kết front buffer pd3dDevice->Present( NULL, NULL, NULL, NULL ); } Sự thay đổi lớn hàm render hàm D3DXMatrixTranslation Hàm dịch chuyển hình hộp xa gốc tọa độ 64 đơn vị Trong trường hợp này, hình hộp tịnh tiến xa gôc tọa độ dọc theo trục X sau xoay Hai ma trận dùng : matTranslate matRotate Hai ma trận nhân với để có ma trận objMat, chứa vị trí sau hình hộp Kết ta có hình hộp xoay cách xa gốc tọa độ Phép tỉ lệ Phép tỉ lệ cho phép bạn thay đổi kích thước đối tượng cách nhân vecto đối tượng với lượng Để thực phép tỉ lệ đối tượng, bạn cần tạo ma trận chứa hệ số tỉ lệ Những hệ số cho biết vecto phóng to hay thu nhỏ Như đề cập trên, vị trí 1, 6, 11 hệ số tỉ lệ theo phương X, Y Z Mặc định, số 1.0f nghĩa đối tượng có kích thước vốn có Thay đổi hệ số làm thay đổi kích thước đối tượng Nếu hệ số lớn 1.0f đối tượng phóng to ra, ngược lại, hệ số nhỏ 1.0f đối tượng bị thu nhỏ lại ⎡X 4 ⎤ ⎢5 Y 8⎥ ⎢ ⎥ ⎢ 10 Z 12⎥ ⎢ ⎥ ⎣13 14 15 16⎦ Như đề cập trên, phép tỉ lệ điều khiển thông qua giá trị ma trận Để tạo ma trận tỉ lệ, ta cần định nghĩa ma trận đồng thay đổi hệ số nói Bạn vừa tự thay đổi giá trị vừa sử dụng thơng qua hàm D3DXMatrixScaling định nghĩa đây: D3DXMATRIX *D3DXMatrixScaling( D3DXMATRIX *pOut, FLOAT sx, FLOAT sy, FLOAT sz ); Hàm D3DXMatrixScaling cần đối số: ■ pOut Con trỏ đến đối tượng D3DXMATRIX chứa ma trận tỉ lệ ■ sx Hệ số tỉ lệ theo phương X ■ sy Hệ số tỉ lệ theo phương Y ■ sz Hệ số tỉ lệ theo phương Z Đoạn code sau cho thấy cách dùng hàm D3DXMatrixScaling để tăng gấp đơi kích thước vật thể D3DXMATRIX matScale; // đặt hệ số tỉ lệ 90 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN D3DXMatrixScaling(&matScale, 2.0f, 2.0f, 2.0f); // Nhân ma trận đối tượng với ma trận tỉ lệ D3DXMatrixMultiply(&objMat, & objMat, &matScaling); Biến objMat biểu diễn ma trận gốc đối tượng nhân ma trận đối tượng với ma trận tỉ lệ ta thu phóng đối tượng vẽ Thứ tự phép tính tốn ma trận Thứ tự phép toán quan trọng Ví dụ như, bạn muốn xoay đối tượng quanh tâm sau dịch chuyển đâu đó, trước tiên bạn cần tính tốn với ma trận xoay trước tiếp đến ma trận tịnh tiến Nếu hai phép tính đổi chỗ cho nhau, đối tượng tịnh tiến đến vị trí khác sau xoay quanh gốc tọa độ Điều làm cho đối tượng đặt ví trí khác hướng theo hướng khác không gian Đoạn code sau trình tự để thực phép xoay tịnh tiến đối tượng: D3DXMATRIX objRotate; D3DXMATRIX objTranslation; D3DXMATRIX objFinal; // phép xoay D3DXMatrixRotationY(&objRotate, D3DXToRadian(45)); // phép tịnh tiến D3DXMatrixTranslation(&objTranslation, 1.0f, 0.0f, 0.0f); // nhân ma trận xoay ma trận tịnh tiến với D3DXMatrixMultiply(&objFinal, &objRotate, &objTranslation); // thực phép biến đổi không gian thực pd3dDevice->SetTransform(D3DTS_WORLD, &objFinal); Bước thứ tạo ma trận xoay đối tượng, objRatate Sử dụng hàm D3DXMatrixRotationY trên, đối tượng quay góc 45 độ quanh trục Y Tiếp theo ta tịnh tiến đối tượng xoay đơn vị bên phải cách sử dụng hàm D3DXMatrixTranslation Cuối cùng, ta tạo ma trận biến đổi cách nhân ma trận xoay ma trận tịnh tiến với với hàm D3DXMatrixMultiply Nếu ma trận xoay ma trận đảo chỗ cho (hốn vị) lời gọi hàm D3DXMatrixMultiply, phép tịnh tiến thực trước phép xoay, đối tượng bị rời sang vị trí khác Tạo camera phép chiếu Bạn tạo camera Direct3D cách định nghĩa ma trận cho bước (projection transformation) Ma trận định nghĩa vùng nhìn cho camera, hệ số co, mặt phẳng clipping xa gần Sau bạn tạo ma trận chiếu, bạn thiết lập thơng qua hàm SetTransform Bạn thấy rằng, hàm SetTransform sử dụng ví dụ trước SetTransform, định nghĩa đây, cho phép thiết lập ma trận cho bước hệ thống chuyển đổi hình học Ví dụ như, bạn thiết lập ma trận cho camera, có nghĩa bạn quy định cho scene quan sát suốt giai đoạn chiếu Giai đoạn giai đoạn cuối hệ chuyển đổi hình học, quy định cách mà khung cảnh 3D render dạng 2D HRESULT SetTransform( 91 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX *pMatrix ); Hàm SetTransform cần đối số: ■ State Xác định giai đoạn hệ chuyển đổi hình học cần chỉnh sửa ■ pMatrix Con trỏ có cấu trúc D3DMATRIX dùng để thiết lập cho giai đoạn Đoạn code sau cho thấy cách tạo định nghĩa ma trận cho giai đoạn chiếu D3DXMATRIX matProj; // ma trận chiếu /********************************************************************** * createCamera * tạo camera ảo ***********************************************************************/ void createCamera(float nearClip, float farClip) { // Xác định vùng nhìn, hệ số co mặt phẳng clipping xa, gần D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 640/480, nearClip, farClip); // thiết lập ma trận matProj cho giai đoạn chiếu pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); } Thay tự tạo ma trận chiếu, ta dùng hàm D3DXMatrixPerspectiveFovLH D3DX cung cấp Hàm tạo ma trận đầu chứa matProj khai báo trên, cho phép bạn xác định góc nhìn phối cảnh, hệ số co, mặt phẳng clipping lời gọi hàm Sau bạn tạo đươc ma trận chiếu, bạn thiết lập cho hệ chuyển đổi hình học thơng qua hàm SetTransform Bởi ma trận tác dụng lên giai đoạn chiếu, tham số đưa vào D3DTS_PROJECTION Vị trí hướng camera Đến thời điểm này, bạn sử dụng camera Camera tác động lên thứ khung cảnh giống đối tượng chuyển qua giai đoạn chiếu hệ chuyển đổi hình học Chỉ có điều là, camera ta đặt gốc tọa độ Bởi camera giới thực vật thể chuyển động được, nên ta cần làm cho camera ảo làm giống Nó cần có khả chuyển động khung cảnh thay đổi hướng nhìn Để đạt tiêu chí này, bạn cần thay đổi ma trận tương ứng với giai đoạn View transformation Mặc định, ma trận đặt ma trận đồng cố định camera ảo gốc tọa độ Để thay đổi vị trí hướng camera, bạn cần tạo ma trận Cách đơn giản để làm điều sử dụng hàm trợ giúp D3DXMatrixLookAtLH D3DX Hàm D3DXMatrixLookAtLH cho phép bạn vị trí camera (định nghĩa vecto dạng D3DXVECTOR3), nơi mà camera nhìn vào (cũng dạng D3DXVECTOR3), hướng camera (cũng dạng D3DXVECTOR3) Đoạn code sau cách tạo ma trận quan sát (view) D3DXMATRIX matView; // ma trận view /************************************************************************* * pointCamera * đặt điểm nhìn cho camera thông qua vecto *************************************************************************/ 92 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN void pointCamera(D3DXVECTOR3 cameraPosition, D3DXVECTOR3 cameraLook) { D3DXMatrixLookAtLH ( &matView, &cameraPosition, // vị trí camera &cameraLook, // điểm nhìn &D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // hướng lên // thiết lập ma trận cho giai đoạn view pd3dDevice->SetTransform (D3DTS_VIEW, &matView); } Hàm pointCamera cần hai đối số: cameraLook cameraPosition Biến cameraPosition chứa vị trí camera Ví dụ như, camera đặt cách gốc tọa độ đơn vị dọc theo trục Y, cameraPosition có dạng (0.0f, -2.0f, 0.0f) Biến cameraLook thơng báo cho camera nơi cần hướng tới có quan hệ với vị trí đặt camera Ví dụ như, coi camera đặt vị trí10 đơn vị dương dọc theo trục Y,10 đơn vị âm theo trục Z tưởng tượng ta muốn camera hướng phía gốc tọa độ Bởi lúc camera đặt phía so với gốc tọa độ, muốn thấy gốc tọa độ cần phải nhìn xuống Ta cần thiết lập cho vecto cameraLook giá trị (0.0f, 10.0f; 0.0f), điều có nghĩa camera hướng thẳng theo trục Y hướng xuống Camera lúc nhìn thấy đối tượng đặt gốc tọa độ từ phía đầu chúng Ma trận cuối mà D3DXMatrixLookAtLH tạo lưu trữ matView thiết lập cho giai đoạn view hệ chuyển đổi Giá trị D3DTS_VIEW truyền cho hàm SetTransform thông báo cho Direct3D ma trận view cần cập nhật lại 93 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Tổng kết chương Trong chương này, ta giới thiệu khái niệm chung cần thiết xây dựng ứng dụng 3D Khi bạn muốn tạo chương trình quan sát mơ hình, hay game nhập vai góc quay thứ nhất, ma trận phép biến đổi móng mà game bạn xây dựng Những bạn học Trong chương này, bạn học: ■ Cách chuyển đối tượng 3D qua hệ chuyển đổi hình học ■ Ma trận làm sử dụng chúng ■ Cách dịch chuyển xoay đối tượng ■ Tại thứ tự phép nhân ma trận lại quan trọng đến ■ Cách tạo sử dụng camera để quan sát đối tượng 3D Câu hỏi kiểm tra Bạn tìm thấy đáp án cho phần phần tập tự làm phụ lục “Đáp án phần tập cuối chương” Chỉ mục đối tượng lưu trữ đệm (buffer) ? Ma trận gi? Những bước hệ chuyển đổi hình học? Ma trận đồng dùng để làm gì? Thay đổi hệ số co camera tác động đến phần hệ chuyển đổi hình học? Bài tập tự làm Sử dụng hàm D3DXMatrixMultiply, để xoay đối tượng sau tịnh tiến đơn vị theo trục X Viết hàm render xoay liên tục đối tượng quanh trục Y 94 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN (Chuong ) 95 ... DirectX cung cấp Hình minh hoạ 1. 1 thể sơ đồ minh hoạ phân lớp Direct3D thiết bị điều khiển phần cứng 11 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN Hình 1. 1 – Mơ hình phân lớp DirectX... DirectX 12 Beginning DirectX9 Dịch TransTeam diễn đàn Gamedev.VN CHƯƠNG CHƯƠNG TRÌNH ĐẦU TIÊN T rong phần trình bày ví dụ nhỏ sử dụng DirectX Chúng ta bước qua tất tiến trình cần thiết cho chương trình. .. Phần quan trọng hàm phần quản lý thơng điệp chương trình Phần đảm nhiệm q trình quản lý thơng điệp mà window gửi tới ứng dụng Hàm GetMessage làm nhiệm vụ kiểm tra thơng điệp hàng đợi chương trình,

Ngày đăng: 29/01/2020, 23:24

Tài liệu cùng người dùng

Tài liệu liên quan