Tạo điều khiển di chuyển và nhìn bằng chuột trong Blender

Xin chào !

Bài viết này sẽ hướng dẫn bạn cách tạo ra một bộ điều khiển phục vụ cho việc di chuyển (movement) và nhìn bằng chuột (mouselook) trong Blender, rất phù hợp cho những ai muốn tạo ra một game FPS cho riêng mình hoặc chỉ đơn giản là muốn "đi đi lại lại" trong không gian mình đã tạo.

Kết quả cuối cùng sẽ giống trong video minh họa bên dưới.

Trên internet có rất nhiều nguồn đề cập đến movement và mouselook, đặc biệt là trên youtube, chỉ cần search với từ khóa "blender movement and mouselook control tutorial" là ra kết quả, các bạn có thể dựa vào đó để tham khảo thêm. Tuy nhiên trong bài này, mình sẽ tổng hợp lại theo một cách riêng, rõ ràng nhất kèm theo giải thích cho một số vấn đề mang tính lý thuyết.

Cùng bắt đầu từng bước nhé !

Giống như mọi game FPS, chúng ta sẽ cần những điều khiển cơ bản cho người chơi (Player) như sau:

Chức năngPhím điều khiển
Tiến lên phía trướcW
Lùi về phía sauS
Dịch sang tráiA
Dịch sang phảiD
Nhìn xung quanh (mouselook)Di chuột
NhảySpacebar

Và đây là những điều chúng ta sẽ thực hiện trong bài viết này

  1. Tạo bối cảnh: player, camera, mặt đất, chướng ngại vật
  2. Thêm điều khiển di chuyển (movement)
  3. Xử lý tương tác với chuột (mouselook)
  4. Test !

Chú ý: Với mọi thông số trong bài viết, bạn có thể tự tùy chỉnh để tăng thêm hiệu quả lĩnh hội (comprehension)

---------------------------------------------------------------------

1. Tạo bối cảnh: Player, camera, mặt đất, chướng ngại vật

a. Tạo player

Mở một tài liệu Blender mới, trong đó mặc định đã có một hình khối hộp (cube), một camera và một nguồn sáng. Để mọi thứ trở nên rõ ràng, ta nên đặt tên cho các đối tượng này ngay từ đầu.

Lựa chọn hình khối hộp, trong 3DView Properties (nếu chưa hiện có thể ấn N để nó hiện ra) nhập vào các thông số sau:

  • Location: X / Y / Z là 0 / 0 / 1
  • Scale: X / Y / Z là 0.5 / 0.5 / 1
  • Trong khung Properties, chọn Object > Sửa lại tên là: Player

b. Tạo camera

Tương tự, đối với camera, chọn nó và thay đổi theo các thông số trong 3DView properties:

  • Location: X / Y / Z là 0 / 0 / 2.5
  • Rotation: X / Y / Z là 90 / 0 / 0
  • Trong khung Properties, chọn Object > Sửa lại tên là: PlayerView

c. Tạo mặt đất (ground)

  • Ấn Shift + C để reset lại 3D Cursor về vị trí mặc định (3D cursor là vị trí để đặt đối tượng mới trong 3DView)
  • Ấn Shift + A để mở menu Add > Mesh > Plane
  • Trong 3DView Properties thay đổi các thông số như sau:
    • Scale: X / Y / Z là 10 / 10 / 0
    • Trong Properties > Object > Sửa tên lại là: Ground.
  • Lựa chọn đối tượng Ground, trong Properties > Chọn Material > click New > Click vào ô màu Diffuse để lựa chọn màu bất kì

d. Tạo các chướng ngại vật (obstacle)

  • Ấn Shift + A > Mesh > Cube, trong 3DView Properties nhập:
    • Location: X / Y / Z = 0 / 5 / 0
    • Tương tự như trên, đổi tên đối tượng thành: Obstacle1
    • Lựa chọn một material với màu sắc bất kì
  • Tiếp tục tạo một Cube nữa, trong 3DView Properties nhập
    • Location: X / Y / Z = 0 / -5 / 0
    • Scale: X / Y / Z = 5 / 0.5 / 0
    • Đặt tên là Obstacle2, màu sắc material tùy ý

Sau khi lam xong các bước trên ta có một bối cảnh trông như này

2. Thêm điều khiển di chuyển (movement)

a. Di chuyển tới, lui, trái, phải

Trên Inforbar, lựa chọn Layout Blender sang Game Logic, và hệ render sang Blender Game

Bên dưới cùng sẽ xuất hiện khung Logic Editor

  • Trong bảng Outliner bên trái, chọn đối tượng tên Player (đã đặt tên ở trên), khung Logic Editor sẽ xuất hiện thêm các điều khiển mới (Sensors, Controllers, Actuators)
  • Trong khung properties > chọn physic > trong Physic type > chọn Character

Trong Logic Editor

  • Đối với Sensor, click Add Sensor > chọn Keyboard > Click vào ô Key, ấn W.
  • Đối với Actuators, click Add Actuator > chọn Motion > Sửa giá trị Motion type thành Character Motion > Sửa giá trị Y = 0.1
  • Kết nối bằng cách kéo chấm đen bên phải khung Sensor và với vòng tròn nhỏ bên trái khung Actuators, tự động sẽ xuất hiện một khung And bên dưới Controllers

Sau khi thực hiện một loạt các thao tác trên, ta sẽ có được hình như sau

Lúc này click vào 3DView và ấn P để thử nghiệm, khi ấn phím W, đối tượng Player sẽ tịnh tiến theo trục Y (tiến về phía trước - Forward)

Làm tương tự như trên, thêm Sensor Actuator mới, bên Sensor thay là phím S với giá trị trục Y bên Actuator -0.1

Tiếp tục thêm phím A và D cho Sensors, nhưng bây giờ bên Actuator lại thay đổi giá trị trục X tương ứng lần lượt là -0.10.1

Tiếp tục click 3DView, ấn P để thử nghiệm, bây giờ đối tượng Player đã có thể di chuyển theo các hướng tương ứng với các phím WASD, hãy thử chuyển 3DView sang Perpective để quan sát rõ hơn.

b. Bây giờ ta sẽ làm cho đối tượng Player có thể nhảy được.

  • Thêm sensor mới là keyboard > click vào ô Key và ấn Spacebar > click vào Tap để kích hoạt nó, tùy chọn này sẽ chỉ cho phép thực hiện lệnh mỗi lần ấn Spacebar thay vì có thể thực hiện liên tục khi giữ chặt phím.
  • Thêm actuator mới > Motion > Motion type: chọn Character Motion > Nhập thông số trục Z là 0.1 và click vào chữ L phía bên phải để bỏ qua (tắt) việc sử dụng trục Z Local của đối tượng Player, thay vào đó sẽ sử dụng trục Z của Global.
  • Click vào chữ Jump bên dưới, tùy chọn này cho phép đối tượng Player được áp dụng các thông số về Jump.

Trong khung Properties bên phải, mục physic, có thể thay đổi các thông số như Jump Force, hay Fall Speed Max để thử nghiệm, tuy nhiên trong bài viết này hãy cứ để các thông số như mặc định.

* Trong quá trình thử nghiệm, dễ nhận thấy là đối tượng Player sẽ bị "chìm" vào mặt đất một khoảng, đó là do physic bounding box của Player chưa được điều chỉnh, cách xử lý như sau: Trong khung Properties > Physic > kéo xuống dưới và đánh dấu vào ô Collision Bounds, ấn P một lần nữa để xem kết quả.

3. Xử lý tương tác với chuột (mouselook)

Để camera (PlayerView) có thể dịch chuyển theo đối tượng Player, ta phải biến đối tượng Player thành cha của PlayerView, thực hiện điều này bằng cách chọn camera > Trong Properties > Object > kéo xuống dưới mục Relations > click vào Parent và chọn đối tượng Player.

Khi này camera sẽ được "gắn vào" với Player và thay đổi vị trí đi một chút, thử di chuyển đối tượng Player trong 3DView để thấy rõ hơn sự gắn kết này.

Chú ý: Các bước dưới đây được tham khảo tại nguồn bên ngoài, ở thời điểm viết bài này, mình cũng chưa hoàn toàn hiểu mục đích của các thao tác là gì, nhưng nếu làm chính xác theo thì mọi thứ sẽ ổn !

  • trong lúc camera PlayerView vẫn đang được chọn, tại khung LogicEditor, thêm một Sensor mới > Mouse > Chọn Mouse EventMovement.
  • Tiếp tục tạo thêm một Sensor nữa > Always > Click chọn vào True level trigglering (pulse mode) nằm ở bên trái.
  • Tạo mới một Controller mới > Python.
  • Nối 2 Sensor vào với Controller.
  • Phía bên trái, click Add game propertyThay chữ prop bằng startup Lựa chọn kiểu Boolean thay vì Float > Đánh dấu check bên cạnh.

Trong khung Text Editor phía trên Properties > click New > đổi tên từ Text thành mouselook.py

Copy và paste đoạn code sau vào TextEditor.

#Learn from men with hair on their chest. CGMasters.net

from bge import render as r
import math

cont = bge.logic.getCurrentController()
own = cont.owner
mouse = cont.sensors["Mouse"]
parent = own.parent

#set speed for camera movement
sensitivity = 0.05

#set camera rotation limits
high_limit = 180
low_limit = 0

h = r.getWindowHeight()//2
w = r.getWindowWidth()//2
x = (h - mouse.position[0])*sensitivity
y = (w - mouse.position[1])*sensitivity

if own["startup"]:
    r.setMousePosition(h, w)
    own ["startup"] = False
else:
    rot = own.localOrientation.to_euler()
    pitch = abs(math.degrees(rot[0]))
    if high_limit > (pitch+y) > low_limit:
        pitch += y
    elif (pitch+y) < low_limit:
        pitch = low_limit
    elif (pitch+y) > high_limit:
        pitch = high_limit
    rot[0] = math.radians(pitch)
    own.localOrientation = rot.to_matrix()

    parentRot = parent.localOrientation.to_euler()
    yaw = math.degrees(parentRot[2]) + x
    parentRot[2] = math.radians(yaw)
    parent.localOrientation = parentRot.to_matrix()

    r.setMousePosition(h, w)
    r.setMousePosition(h, w)

Trông sẽ như thế này.

Quay trờ lại khung LogicEditor > Trong mục Controller Python đã tạo, chọn Script mouselook.py.

Đến đây thì coi như mọi thứ đã hoàn tất !

4. Test !

Ta cần chỉnh một vài thông số nữa dành cho camera để cảm thấy thoải mái hơn khi điều khiển.

Trong 3DView, chọn camera PlayerView > vào khung Properties > Camera > kéo xuống mục Lens, chỉnh Focal Lens = 20, việc này sẽ giúp camera PlayerView nhìn được bao quát hơn khi sử dụng.

Có thể di chuyển camera theo trục Y một chút ra phía trước của đối tượng Player, để khi quay xuống dưới nhìn không phải nhìn thấy khối màu trắng quá nhiều. bạn có thể biến khối Player thành Invisible, nhưng thôi hãy cứ để đó, coi như mình có thể nhìn thấy thân mình khi đưa chuột cúi xuống.

Trong 3DView, ấn phím Num 0 trên bàn phím số để chuyển góc nhìn về camera PlayerView, ấn P để test.

Nếu có thể, hãy thay các chướng ngại vật bằng những model đẹp hơn, gán thêm vật liệu và các đối tượng và bắt đầu "tự khám phá" những gì mình đã làm được .

Chúc bạn thành công !!

Tài liệu cùng chủ đề

Các thao tác cơ bản trong Blender

Trong bài viết này chúng ta sẽ đề cập đến những vấn đề sau:Di chuyển trong 3DViewLựa chọn đối tượngDịch chuyển, xoay, chỉnh tỉ lệ...

Các thành phần giao diện trong Blender

Bước đầu tiên khi học cách sử dụng một phần mềm là làm quen với các thành phần giao diện của nó. Trong bài viết này, mình sẽ giới...

Giới thiệu về Blender

Giới thiệuBlender là một phần mềm đồ họa 3D mã nguồn mở miễn phí, được sử dụng để chế tác phim hoạt hình, sáng tạo nghệ thuật,...

Tập hợp các phím tắt trong Blender

Dưới đây là danh sách các phím tắt hay sử dụng trong Blender, danh sách này sẽ được cập nhật thường xuyên trong suốt thời gian...