Phương thức xây dựng những plug-in hỗ trợ cho Maya

Một phần của tài liệu B.ScThesis_Compressed (Trang 31)

Maya là một phần mềm có khả năng mở rộng. Điều đó có nghĩa là các cá nhân hoặc các tổ chức khác có thể thay đổi các thành phần hiện có và thêm vào các đặc tính hồn tồn mới. Maya đã cung cấp hai cách thức thay đổi. Cách thứ nhất là sử dụng ngôn ngữ kịch bản. Đây là một cách thức dễ dùng, dễ học và tạo ra được những tính năng mạnh mẽ. Phần lớn những thao tác cần thực hiện đều có thể được điều khiển thơng qua ngơn ngữ kịch bản. Cách thứ hai là thông qua API (Application Programmer Interface). Sử dụng API cho phép cung cấp một hiệu năng lớn hơn mà ngôn ngữ kịch bản không thể cung cấp được (mã nguồn được viết sử dụng API sẽ thực hiện nhanh gấp 10 lần so với mã nguồn sử dụng ngôn ngữ kịch bản) và cung cấp khả năng cho phép thêm các đối tượng mới vào Maya.

Maya API

Maya API là những API viết bằng C++ cho phép truy nhập vào các thành phần bên trong của Maya. Nó đã được đóng gói tạo nên một tập hợp các thư viện tương ứng với những thành phần chức năng khác nhau của Maya. Các thư viện bao gồm:

OpenMaya – Thư viện này chứa các lớp cơ bản để định nghĩa các node và

OpenMayaUI – Thư viện này chứa các lớp cần thiết để tạo mới các thành

phần giao diện người dùng như menu ngữ cảnh, các công cụ thao tác, các công cụ để định vị vị trí.

OpenMayaAnim – Thư viện này chứa các lớp để giải quyết các vấn đề về

tạo hình ảnh động, bao gồm cả việc làm biến dạng và đảo ngược chuyển động.

OpenMayaFX – Thư viện này chứa các lớp để giải quyết vấn đề với các

lực động học.

OpenMayaRender – Thư viện này chứa các lớp để thực hiện các chức

năng render.

Đưa một plug-in vào Maya

Trước khi bắt tay vào viết một plug-in cho Maya, bạn cần biết cách thức để load một plug-in vào Maya.Có hai cách để load và unload một plug-in. Cách đầu tiên và là cách dễ nhất là sử dụng Plug-in Manager có sẵn ở Windows -> General -> Editors -> Plug-in Manager (hoặc Windows -> Settings/Preferences -> Plug-in Manager trong Maya 8.0). Plug-in Manager sẽ sử dụng biến mơi trường MAYA_PLUG_IN_PATH để định vị những plug-in có thể load. Trong UNIX, biến này là một danh sách các thư mục chứa các plug-in được phân cách bằng dấu hai chấm “:”. Trong Windows NT, MAYA_PLUG_IN_PATH nằm trong registry và những thư mục được ngăn cách bằng dấu chấm phẩy “;”. Biến này có thể được thay đổi bằng cách sử dụng MayaEnviroment.exe

Cách thứ hai là thông qua câu lệnh loadPlugin của MEL như trong ví dụ sau

loadPlugin “hello”;

Câu lệnh này sẽ tìm kiếm trong danh sách của MAYA_PLUG_IN_PATH để tìm file tên là hello.so trong Unix và file tên là hello.mll trong nền NT. Nếu được tìm thấy, nó sẽ được load vào Maya như là một plug-in.

Unload một plug-in trong MEL là một vấn đề đơn giản bằng cách sử dụng câu lệnh unloadPlugin kèm theo tên của plug-in đó.Lưu ý rằng một plug-in cần phải được unload trước khi nó được biên dịch lại. Trước khi bạn unload một plug-in, bạn cần phải xóa hết tất cả các tham chiếu từ các cảnh của Maya đến nó. Trong suốt q trình xóa các node từ các cảnh được định nghĩa bởi plug-in cần xóa, cần phải cân bằng các tham chiếu từ các node bị xóa và các câu lệnh được thực hiện từ hàng đợi của lệnh undo. Nếu bạn vẫn thực hiện unload một plug-in trong khi nó đang được sử dụng, lúc đó bạn khơng thể load lại được các node đã sử dụng plug-in này. Nguyên nhân là do các node đang tồn tại trong cảnh sẽ được chuyển sang thành node có dạng “Unknown”. Và cả khi plug-in này được unload, bạn cũng không được phép thay đổi kiểu của các node đang tồn tại.

Xây dựng một plug-in

Các bước sau đây áp dụng cho Microsoft Visual C++ 2005 để xây dựng plug-in cho Maya.

Bước 1: Tạo một project Visual C++

1. Chọn File -> New 2. Chọn tab Projects

3. Chọn tùy chọn Win32 Project

4. Điền tên plug-in của bạn vào phần Project Name

5. Điền tên thư mục và đường dẫn nơi bạn muốn project của bạn được tạo ra trong trường Location

6. Click OK

Bước 2: Thêm các file vào project mà bạn vừa tạo ra

1. Chọn Project ->Add To Project ->Files

2. Sử dụng hộp thoại để định vị vị trí các file cho plug-in của bạn 3. Click OK

Những file này đã được add vào project

4. Lặp lại với những file thêm vào trong những thư mục khác. 5. Nếu đây là một plug-in mới, bạn có thể sử dụng File New và lựa

chọn kiểu file C++ để tạo ra một file C++ mới cho plug-in của bạn.

Bước 3: Thêm một số thông số và thư mục chứa vào project

1. Chọn Project -> Plugin Property

2. Trong box lựa chọn, chọn All Configurations 3. Trong phần Configuration Properties chọn C/C++ 4. Trong các mục của C/C++ chọn Preprocessor

5. Thêm WIN32;NDEBUG;_WINDOWS;NT_PLUGIN vào list của Preprocessor Definitions

6. Trong mục General của C/C++, chọn Additional Include Directories 7. Thêm đường dẫn thư mục include của Maya vào phần này. Nếu

plug-in của bạn được đặt trong thư mục C:\Program

Files\Alias\Maya8.0\devkit\plug-ins, bạn có thể sử dụng cấu trúc ..\..\include

Nếu khơng, bạn cần để cả đường dẫn đầy đủ C:\Program Files\Alias\Maya8.0\include

8. Trong phần CommandLine của C/C++, thêm vào Additional Options các tham số sau: /I "C:\Program Files\Alias\Maya8.0\include"

9. Click OK để lưu lại sự thay đổi

Bước 4: Thêm các thư viện vào project

1. Chọn Project -> Plugin Property

2. Trong box lựa chọn, chọn All Configurations 3. Trong phần Configuration Properties chọn Linker 4. Trong mục Input, chọn Additional Dependencies và thêm

opengl32.lib Foundation.lib OpenMaya.lib OpenMayaUI.lib OpenMayaAnim.lib OpenMayaFX.lib OpenMayaRender.lib

5. Trong mục General, chọn Output File và thay đổi từ .dll thành .mll 6. Trong mục CommandLine, chọn mục Additional Options và thêm

vào /LIBPATH:" C:\Program Files\Alias\Maya8.0\lib" 7. Click OK để lưu lại thay đổi

Bước 5: Chọn thư viện runtime thích hợp

1. Chọn Project -> Plugin Property

2. Trong box lựa chọn, chọn All Configurations 3. Trong phần Configuration Properties chọn C/C++

4. Trong các mục của C/C++ chọn Code Generation

5. Trong mục Runtime Library, chọn Multi-threaded DLL (/MD) 6. Click OK để lưu lại thay đổi

Ví dụ xây dựng một plug-in đơn giản

Khi học một ngơn ngữ mới, chương trình đầu tiên bạn thường thấy là chương trình “Hello World”. Theo truyền thống ấy, plug-in đầu tiên là một plug-in “Hello World”. Plug-in này đơn giản chỉ là hiển thị dòng “Hello World” trên cửa sổ khi Maya được mở.

Mã nguồn của chương trình

#include <maya/MSimple.h>

DeclareSimpleCommand( helloWorld, "Alias| Wavefront", "2.0");

MStatus helloWorld::doIt( const MArgList& ) {

printf("Hello World\n"); return MS::kSuccess; }

Đoạn chương trình này được lưu trong file tên là helloWorld.cpp. Nó sẽ được biên dịch qua các bước như phần 7.3. Sau đó sẽ được load vào Maya như hướng dẫn ở phần 7.2. Gõ “helloWorld” vào trong cửa sổ lệnh, dùng phím Enter để thực hiện lệnh và trên của sổ output, bạn sẽ thấy “Hello World” được hiển thị. Chú ý rằng bạn cần phải unload plug-in một lần nữa trước khi biên dịch lại.

Từ ví dụ trên có thể thấy một số đặc điểm quan trọng như sau:

MSimple.h Đây là một file header đặc biệt được sử dụng cho những plug-

in có lệnh đơn giản. Nó sẽ phụ trách những công việc cần thiết để đăng ký câu lệnh mới với Maya thông qua macro DeclareSimpleCommand.

MStatus Đây là một lớp được sử dụng bởi API để chỉ rõ sự thành công hay

thất bại của một phương thức. Phần lớn các phương thức trong các lớp API trả về mã trạng thái thông qua MStatus và những thông tin cho mỗi phương thức được thể hiện chi tiết qua các giá trị trạng thái được trả về. Để tránh sự đụng độ về không gian tên với các mã trạng thái khác, tất cả các giá trị MStatus được bắt đầu bằng MS, ví dụ như MS::kSuccess là một mã trạng thái thành công. Danh sách đầy đủ được chứa trong MStatus.h. API chỉ sử dụng một số ít các mã trạng thái. Tuy nhiên, nếu như lỗi logging được cho phép trong API thông

qua MGlobal::startErrorLogging() thì những chi tiết vễ lỗi sẽ được xuất ra file error log khi một phương thức trả về một giá trị khác với MS::kSuccess.

DeclareSimpleCommand Như lưu ý ở trên thì macro

DeclareSimpleCommand() giúp bạn khơng phải viết những đoạn mã đăng ký để cho phép Maya nhận file của bạn như là một plug-in. Tuy nhiên để làm cho đơn giản, nó khơng cho phép bạn xác định một phương thức undo cho câu lệnh của bạn, vì thế bạn khơng thể tạo ra các câu lệnh có khả năng undo thực sự khi sử dụng macro này. Những câu lệnh không cung cấp chức năng undo sẽ khơng thay đổi được trạng thái của cảnh. Chúng có thể được sử dụng để truy vấn những thông tin về cảnh nhưng không thể thay đổi được các thơng số đó. Nếu một câu lệnh khơng có khả năng undo được lại thay đổi được các thông số, khả năng undo của Maya sẽ bị phá vỡ. Macro DeclareSimpleCommand yêu cầu 3 tham số: tên của class sẽ được sử dụng để thực hiện lệnh, tên của nhà cung cấp (hoặc tác giả) của lệnh và version của lệnh.

MArgList Lớp MArgList cung cấp các chức năng tương tự như các tham

trị, tham biến vào của một chương trình C hay C++, cung cấp một danh sách các đối số cho hàm của bạn. Lớp này cung cấp các phương thức để nhận các tham số với các kiểu khác nhau, bao gồm cả integer, double, string, vector... Một điểm khác biệt quan trọng giữa việc sử dụng tham biến/tham trị và một MArgList là phần tử đầu tiên của MArgList là tham số đầu tiên trong lệnh chứ không phải là tên của lệnh như trong một chương trình viết bằng C hay C++.

Trên đây chỉ là một số đặc điểm cơ bản về cấu trúc khi viết một API cho Maya. Để viết được một plug-in hồn chỉnh thì cịn cần rất nhiều kiến thức cũng như kinh nghiệm khác nữa.

Phần III – Tài liệu và các trang web tham khảo

 Understanding 3D Animation Using Maya – John Edgar Park  Maya at a Glance – George Maestri

 http://caad.arch.ethz.ch/info/maya/manual/DevKit/PlugInsAPI/index.ht ml  http://www.quazen.com/Arts/Graphic-Design/Short-history-of-3D- aniamtion.273  http://animation.filmtv.ucla.edu/program/anihist.html  http://www.vanime.org/baiviet/hoathinhasia.htm  http://www.highend3d.com/maya/tutorials/development_api/268.html

Một phần của tài liệu B.ScThesis_Compressed (Trang 31)

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

(37 trang)
w