Trong phần này, chúng ta sẽ làm quen với tính năng Macro Recorder. Đây là một tính năng có sẵn trong 3ds Max, dùng để theo dõi và chuyển những hành động của người dùng trong 3ds Max thành MAXScript. Nó giúp giảm thời gian tra cứu từ khóa và làm công việc phát triển script trở nên dễ dàng hơn.
Nhìn chung, Macro Recorder có thể bắt được phần lớn các hành động trong 3ds Max. Tuy nhiên, có một vài nơi mà chúng có thể không bắt được:
- Các nút bấm, tính năng, bảng biểu từ script hoặc plugin thứ 3.
- Nếu các nút bấm tạo cửa sổ thứ 2, thay đổi trong cửa sổ này sẽ không được ghi lại.
- Các đối tượng và chức năng không được hỗ trợ trong phần Create & Modify.
- Một vài chức năng khác chưa được Autodesk cập nhật.
Vì MAXScript hỗ trợ việc kéo thả code vào thẳng toolbar để tạo nút bấm mới, nên bạn có thể dùng Macro Recorder để ghi lại một chuỗi các hành động, sau đó quét tất cả code, và kéo thả chúng lên thanh công cụ. Một nút bấm sẽ được tạo ra nếu làm đúng cách. Khi bấm nút này, nó sẽ thực hiện lại chuỗi hành động mà bạn đã ghi trong Macro Recorder.
Ở đây, tôi sẽ trình bày cách kích hoạt và sử dụng Macro Recorder cơ bản. Sau đó chúng ta có thể ứng dụng tùy biến những dòng lệnh nhận được từ nó để phát triển script cho riêng mình. Cuối bài, tôi cũng sẽ hướng dẫn cách ứng dụng thực tế Macro Recorder để tạo ra một script đơn giản và thực dụng.
MỤC LỤC
Kích hoạt Macro Recorder
Đầu tiên, hãy mở 3ds Max lên và setup lại giao diện làm việc. Nếu bạn chưa quen thuộc với setup này, xin hãy xem lại phần 1 của seri bài viết. Lần này, kích hoạt thêm Macro Recorder để làm việc. Hãy nhìn lên thanh menu của MAXScript Listener. Chọn MacroRecorder > Enable để kích hoạt tính năng này.
Sau khi kích hoạt, quay lại viewport của 3ds Max vào tạo thử một khối box với kích thước bất kỳ. Nhìn vào cửa sổ MAXScript Listener, nếu đã kích hoạt Macro Recorder, bạn sẽ thấy một dòng lệnh hiện lên như hình dưới. Đây chính là thao tác bạn mới thực hiện.
Hãy thử với nhiều lệnh khác nhau. Bạn sẽ thấy danh sách Macro Recorder ngày càng dài ra. Để xóa chúng, chọn tất cả và bấm Backspace / Delete, hoặc cách nhanh hơn là click vào bất kỳ điểm nào, chọn Edit > Clear All, phím tắt là Ctrl + D.
Tùy biến lệnh từ Macro Recorder
Vẫn ở trong ví dụ trên, hãy chép lại dòng đầu tiên vào MAXScript Editor bên dưới. Vì lý do học tập, nhớ là chép tay, đừng copy nhé. Bạn sẽ thấy dòng lệnh được bôi màu tùy theo thông số và từ khóa.
Khác với lệnh Box() ở trong phần 3, lệnh Box này đã có thêm các thông số phía sau. Chúng được bôi màu tím, lần lượt là pos (vị trí), isSelected (có được select hay không), width (rộng), length (dài), height (cao). Tiếp tục lần chép lệnh này xuống dòng dưới, và cùng thử nghiệm thay đổi chúng một chút. Ví dụ, chỉnh sửa thành:
Box pos:[0,0,0] isSelected:off width:150 length:150 height:150
Lệnh trên sẽ tạo một khối box ở gốc tọa độ, với kích thước 150x150x150, và không được chọn. Bạn hãy thử với thông số của riêng mình để xem kết quả.
Sử dụng MAXScript Help
Các từ khóa trong MAXScript thường rất dễ hiểu, vì thế bạn có thể chỉnh sửa ngay trên code nhận về từ Macro Recorder để xem kết quả. Tuy nhiên, nếu cần thêm thông tin về các từ khóa và câu lệnh, hãy tra cứu MAXScript Help của Autodesk.
Trong ví dụ về khối Box phía trên, sau khi tra cứu, tôi có thêm các từ khóa như lengthsegs, widthsegs, heightsegs vào sau lệnh box để điều chỉnh thông số segment của khối box.
Việc tra cứu này là một kỹ năng quan trọng giúp bạn có thể nhanh chóng học hỏi từ nó. MAXScript Help cũng là tài liệu đáng tin cậy và đầy đủ nhất đến thời điểm hiện tại, và đến giờ tôi vẫn dùng nó hằng ngày khi phát triển các công cụ của mình.
Sử dụng Block Comment
Bây giờ, nếu chạy tất cả những lệnh chúng ta vừa viết, nó sẽ tạo ra 2 khối box, một khối box chính xác theo Macro Recorder gốc, và một khối box khác theo chỉnh sửa của chúng ta.
Nếu muốn chỉ sử dụng lệnh đã chỉnh sửa, bạn có 2 cách. Đơn giản nhất là xóa dòng lệnh đầu tiên từ Macro Recorder đi. Cách thứ hai là thêm thêm dấu “–” (2 dấu gạch ngang) vào phía trước lệnh đầu tiên. Toàn bộ dòng lệnh sẽ chuyển thành màu xanh lá, và nó sẽ không chạy khi Evaluate script.
Hành động này gọi là block comment. Nó dùng để chèn các dòng bình luận vào giữa code, nhằm phục vụ mục đích diễn giải và ghi chú cho script. Những dòng comment sẽ bị 3ds Max bỏ qua khi Evaluate script. Nút tắt cho hành động này là Ctrl + Q. Có 2 hành động khác tương tự được gọi là box comment và stream comment, tôi sẽ trình bày trong các bài viết sau.
Với người mới, tốt nhất là bạn không nên xóa những lệnh gốc từ Macro Recorder đi. Nếu muốn chỉnh sửa, hãy copy chúng xuống và block comment dòng lệnh gốc. Lý do là khi mới bắt đầu viết MAXScript, bạn rất dễ bị sai các syntax vì chưa quen với việc code. Vì thế việc giữ lại các lệnh gốc từ Macro Recorder sẽ giúp bạn có mẫu đối chiếu nhanh khi gặp lỗi.
Tất nhiên, sau khi đã quen thuộc với MAXScript, bạn có thể trực tiếp chỉnh sửa chúng mà không cần phải giữ lại lệnh gốc nữa.
Ứng dụng để viết 1 script đơn giản
Đây là một script tôi đã từng chia sẻ trên trang Facebook cá nhân. Nó dùng để xoay vật thể đang chọn một góc 90 độ. Lý do tôi viết script này là bởi tôi muốn giữ Snap Angle là 5 độ thay vì 45 hay 90 độ. Nó giúp tôi linh hoạt hơn khi muốn xoay các góc 15, 30 hay 45 độ. Hơn nữa, tôi có thể đặt nút tắt cho việc xoay 90 độ này nếu biến chúng thành script.
Hãy Clear All (phím tắt Ctrl + D) bảng MAXScript Recorder đi. Chúng ta sẽ chọn một vật thể bất kỳ trong 3ds Max. Sau đó bấm lệnh xoay (E), và xoay nó một góc bất kỳ.
Chép lệnh trên xuống MAXScript Editor. Chỉnh sửa nó thành:
rotate $ (angleaxis 90.000 [0,0,1])
Sau đó lưu script này lại thành lệnh Z90.ms. Khi chạy script này, nó sẽ xoay những gì đang chọn một góc 90 độ theo trục Z. Bạn cũng có thể chỉnh nó thành góc 45 độ nếu muốn.
Như đã nói ở trên, bạn cũng có thể biến nó thành nút bấm hoặc phím tắt nếu muốn. Ctrl + A để chọn tất cả code, sau đó kéo thả lệnh này vào thanh công cụ của 3ds Max. Nút bấm này có thể truy cập trong Customize User Interface > Category: DragAndDrop > MacroX (x là số thứ tự). Lúc này script của bạn đã trở thành 1 Macro Script, và bạn có thể gán nút tắt cho nó. Tôi đặt nút tắt cho lệnh này là nút mũi lên lên ↑.
Tuyệt vời. Bạn đã tạo ra một script mới mà thậm chí không biết một từ khóa nào trước đó.
Bài tập ứng dụng
Đây là bài tập của bạn lần này. Kết hợp với các kiến thức đã học ở bài trước để bắt đầu viết một script có giao diện gồm nhiều nút bấm, mỗi nút bấm sẽ xoay vật thể đang chọn sang một góc khác nhau. Lưu ý là nhớ sử dụng function ở phần 3 để cho code không dài dòng nhé.
Chúc các bạn thành công!
chào anh, có cách nào để tránh sai số khi áp lệnh xoay ko ạ, E thư áp lệnh xoay 45 độ vào nút mà khi ấn liên tục khoảng gần 10 lần gì đố là nó tự nảy một số lẻ đi 0,001 tiếp tục ấn thì nó sẽ lẻ đi 0.002
Không có cách nào đơn giản em ạ, hoặc anh chưa biết tới. Đây là vấn đề của lập trình rồi. Bởi lệnh biến đổi nào trong 3ds Max cũng đều tính toán dựa trên việc cộng trừ nhân chia các số thực (float), nên khi chạy nó sẽ tạo ra sai số. Từ khóa em có thể tra cứu về vấn đề này là “dấu phẩy động – floating point”. Chúng ta đành phải chấp nhận với sai số này.
xoay thủ công bằng chuột đặt bắt điểm góc là 45 độ thì xoay bao nhiêu vòng cũng xuất hiện sai số mà đặt lệnh xoay lại xuất hiên sai số, sai số nhỏ này thì cũng ko sao cả nhưng nhìn mấy con số lẻ thật khó chịu
Xoay bằng chuột đủ nhiều nó vẫn sẽ ra số lẻ đó em ạ. Em thử xoay vài chục vòng sẽ thấy. Anh nghĩ có 1 cách tạm khắc phục là dùng function làm tròn số. Nhưng ở bài viết này nó có lẽ hơi phức tạp.
một câu hỏi e muốn hỏi anh là khi e áp một lệnh xoay bằng scrip lên đối tượng nhưng tại sao ctrl z lại nó lại ko hoàn lại vị trí cũ ạ, e thử toạ một nút chuyển sang chế độ edit và ctrl z cũng ko hoàn tác đc ạ
Anh cũng không rõ về lỗi này của em. Nhưng em có thể thêm từ khóa “undo on” phía trước lệnh để thử xem. Ví dụ với script xoay: “undo on rotate $ (angleaxis 90.000 [0,0,1])”. Lúc này nó nên undo được bình thường.
cảm ơn anh, e đã undo lại đc rồi ạ