Origin vs Pivot Point, và thứ ma thuật mang tên Apply Scale/Rotation/Location

Có lẽ người mới học Blender ai cũng từng bị mắc kẹt khi modifier không hoạt động như mình nghĩ. Trong cơn hoảng loạn, chúng ta thử nhờ đến quyền lực của loại ma thuật mang tên Apply Scale/Rotation/Location, và thế là bùm, mọi thứ hoạt động một cách hoàn hảo. Đâu đó trong niềm hân hoan, vẫn là một câu tự hỏi rất cũ… “Sao hay vậy ta?”

Trước khi bàn đến thứ ma thuật này, chúng ta hãy cần tìm hiểu trước về Origin (Điểm Gốc) và Pivot Point (Điểm Neo). Hai điểm này khác nhau chỗ nào? Chúng ta đã biết pivot point là điểm neo mà chúng ta có thể dùng để làm gốc cho các thao tác Transform (Scale/Rotate/Translate). Và chúng ta cũng biết rằng, Pivot Point có nhiều loại, và một trong số đó là Individual Origins. Vậy liệu ngoài công dụng là một loại Pivot Point thì Origin còn có tác dụng gì khác? Nếu để ý, bạn sẽ thấy rằng trong Object Mode, chúng ta không thể nào chọn các đỉnh của một object. Chúng ta chỉ có thể chọn toàn bộ Object mà thôi. Điều đó, theo mình, có nghĩa là phần mềm 3D nói chung và Blender nói riêng dựa vào điểm Origin này để Bắt Đầu vẽ Object hiển thị lên màn hình. Bằng cách nào? Trước hết, hãy tìm hiểu về Local Axis và Global Axis. Global Axis chính là cái trục X, Y, Z mà chúng ta nhìn thấy trong View Port. Còn Local Axis là trục của Object mà chúng ta đang xem trong Edit Mode. Như tất cả mọi điểm khác, điểm Origin sẽ có hai bộ giá trị X, Y, Z cho Global Axis và Local Axis, đặc biệt trong Local Axis, tọa độ của điểm Origin luôn là (0, 0, 0). Cho dù bạn chọn điểm Origin này ở bất kỳ chỗ nào trong Edit Mode, thì tọa độ của nó luôn là (0,0,0). Vậy cái gì thay đổi? Chính là tọa độ của những điểm còn lại so với điểm Origin trong Local Axis của Object đó. Quay trở lại câu hỏi trên, phần mềm 3D/Blender vẽ Object cho chúng ta xem như thế nào? Theo mình suy luận, thì Blender sẽ bắt đầu với điểm Origin với bộ tọa độ trong Global Axis. Sau khi xác định được điểm Origin này nằm ở đâu trong Global Axis, Blender sẽ bắt đầu vẽ Object dựa vào tọa độ của các điểm còn lại theo Local Axis (Tức là tọa độ của chúng so với điểm Origin kia, bạn có thể xem tọa độ này bằng cách nhấp vào các điểm trong Edit Mode). Ví dụ như chúng ta có hình tứ giác phẳng có tọa độ điểm Origin O trong Global Axis là (2,1,0), và tọa độ 4 đỉnh trong Local Axis so với điểm Origin này là A (1,0,0), B (2,1,0), C(2,3,0), D (3,2,0) thì ban đầu Blender sẽ xác định vị trí điểm O trước, sau đó từ điểm O này dựng Local Axis và vẽ tiếp 4 đỉnh kia.

Vậy khi thực hiện transform Object trong Object mode thì tức là ta transform cả trục tọa độ và hình tứ giác phẳng này trong Global Axis, nhưng trong Local Axis thì tất cả mọi thứ đều không đổi. Trong Local Axis, điểm O trên vẫn có tọa độ (0,0,0) và các điểm A, B, C, D vẫn có tọa độ như trên. Đây chính là lý do tại sao chúng ta cần Apply Scale/Rotation/Location. Thao tác này sẽ điều chỉnh trục Local Axis tiếp nhận thông tin transformation vừa thực hiện, và qua đó các điểm A, B, C, D sẽ có tọa độ mới trong Local Axis.

Trong trường hợp Transform – Scale: nếu scale Object lên 2 lần trong Object mode, chúng ta sẽ có một hình tứ giác to gấp 2 lần, nhưng nếu vào Edit Mode và bật Edge Length lên thì ta sẽ thấy thông số chiều dài vẫn như cũ, không phải là tăng lên 2 lần như ta vẫn nghĩ. Đó là vì Local Axis vẫn chưa cập nhật thông tin Scale gấp 2 kia, và lúc này, trong Local Axis, mỗi một đơn vị độ dài sẽ bằng 2 lần mỗi một đơn vị độ dài ban đầu, đó chính là trị số Scale mà chúng ta nhìn thấy trong Panel Transform (phím tắt N) trong Object Mode. Khi Apply Scale, chúng ta chuyển trị số Scale này lại về 1, và các điểm A, B, C, D sẽ có tọa độ mới trong Local Axis. Lúc này, khi nhìn vào Edge Length, chúng ta sẽ thấy mỗi cạnh trong Local Axis tăng lên 2 lần.


Trong trường hợp Transform – Rotate: nếu rotate Object 90 độ quanh trục X trong Object mode, chúng ta sẽ có một Local Axis và Object lệch 90 độ so với trục X. Tọa độ của các điểm A, B, C, D không đổi, vì cả trục và điểm đều xoay một góc 90 độ. Giá trị 90 độ này cũng được phản ánh trong Panel Transform (phím tắt N) trong Object Mode. Nhưng ngay khi chúng ta Apply Rotate, thì giá trị này đặt về 0, và Local Axis quay về vị trí ban đầu, nhưng Object vẫn giữ góc xoay như cũ, qua đó 4 điểm A, B, C, D được tính tọa độ mới.

Trường hợp Transform – Translate và Apply Location thì tương tự, mỗi khi Apply điểm Origin được đặt về Center trong Global Axis và qua đó các điểm A, B, C, D có tọa độ mới.

Vậy tại sao Apply Scale/Rotate/Location đôi khi lại giống như một thứ ma thuật có thể giải quyết vấn đề mà ta đang gặp phải? Đó là vì các modifiers chủ yếu sử dụng các thông số trên ở cấp độ Local, chứ không phải Global. Lấy Bevel Modifer làm ví dụ, chúng ta có thông số Width ngay hàng đầu tiên, giá trị mặc định là 0.1. Nhưng đơn vị nó là gì? Đơn vị nó là đơn vị độ dài trong Local Axis. Giả sử bạn có hình lập phương A và B tạo mặc định, có cạnh bằng 2. Bạn scale hình A lên 2 lần trong Object Mode, và để nguyên hình B. Mở Bevel Modifer lên, giữ nguyên giá trị 0.1, thì hình dạng bevel của hình A sẽ lớn gấp đôi hình dạng Bevel của hình B, vì đơn vị độ dài trong Local Axis của hình A lớn gấp đôi đơn vị độ dài trong Local Axis của hình B. Đó là lý do mà khi Apply S/R/L, các modifiers lại hoạt động như bình thường.


Bằng cách suy luận tương tự, chúng ta sẽ ‘lột trần’ một modifier thường cho ra kết quả rất ảo diệu, đó là Array. Chúng ta đã biết là chúng ta có thể dùng Array modifier kết hợp với một Empty đặt thành Object Offset. Vậy cơ chế hoạt động là thế nào? Giả sử ta có một hình tứ giác ABCD có điểm Origin O, có modifier Array chọn Object Offset là Empty có điểm Origin O_E. Blender vẽ hình tứ giác thứ hai như thế nào? Đầu tiên là xác định điểm Origin O_E trong Global Axis, sau đó dựa vào tọa độ Local của 4 điểm A, B, C, D trong hình tứ giác ban đầu để vẽ nên một hình tứ giác A’B’C’D’ lấy O_E làm điểm Origin, tức là, tọa độ Local của 4 điểm A’, B’, C’, D’ sẽ bằng với tọa độ Local của 4 điểm A, B, C, D.

Hãy để ý, nếu bạn xoay hình tứ giác ABCD ban đầu một góc 30 độ theo trục X trong Object Mode, hình A’B’C’D’ giữa nguyên không đổi? Tại sao? Vì khi ấy bạn xoay cả Local Axis lẫn hình ABCD, nên tọa độ của chúng không đổi. Nhưng ngay khi bạn Apply Rotation, tọa độ sẽ thay đổi và hình A’B’C’D’ ngay lập tức xoay theo.


Tuy nhiên, trong trường hợp bạn chưa Apply Rotation, có một hiện tượng thú vị khi bạn tăng số Count lên thành 4 là, kể từ hình thứ 3 trở đi thì các hình bị xoay đi một cách lạ lẫm (Lưu ý là hình thứ hai vẫn im lìm vì lý do ngay trên). Tại sao vậy? Trước hết hãy đến hai đặc điểm quan trọng tiếp theo của Array.

Một là, Array Modifier có tính đến thông số Rotation của Object Empty. Hãy nghĩ xem, Blender biết là sẽ vẽ hình thứ hai ở điểm O_E biết trước, với hình dạng, khoảng cách biết trước, nhưng đây là không gian 3D, biết vẽ theo góc nào đây? Lưu ý là với thông tin trên, Blender có thể vẽ n kết quả với n góc khác nhau. Câu trả lời chính là thông số Rotation của Empty. Nếu bạn xoay Empty theo trục X một góc 90 độ thì Blender sẽ biết vẽ hình A’B’C’D’ theo một góc 90 độ.

Hai là, Array Modifier có tính nối tiếp. Tức là hình thứ ba sẽ áp dụng cách làm tương tự, nhưng là so với hình thứ hai, chứ không phải so với hình đầu tiên.

Quay trở lại câu hỏi trên. Lý do là vì khi này Blender ‘ngầm hiểu’ là mình muốn tạo mẫu hình một góc -30 độ (0 độ hình thứ hai trừ đi 30 độ của hình gốc), đó là lý do hình thứ ba sẽ chệch một góc -30 độ so với hình thứ 2, và hình thứ 4 sẽ chệch một góc -30 độ so với hình thứ 3 và cứ thế tiếp diễn. Ngay khi mình Apply rotation, tất cả các hình đều sẽ lệch một góc 30 độ theo trục Local Axis đã điều chỉnh.

Tạm dừng ở đây, khi nào hiểu thêm về các Modifier khác thì mình sẽ viết tiếp. Cũng nói thêm là đây không hẳn là kiến thức chính xác 100%, mà là do cách mình suy luận và cố gắng hiểu Blender và các Modifier hoạt động như thế nào ở bên trong. Chỉ có như vậy thì mới ít dựa vào may rủi. Mình không thích hên xui.

3 Likes