If you're seeing this message, it means we're having trouble loading external resources on our website.

Nếu bạn đang sử dụng bộ lọc web, vui lòng kiểm tra lại xem bộ lọc có chặn hai tên miền *.kastatic.org*.kasandbox.org hay không.

Nội dung chính

Sử dụng vectơ để mô phỏng chuyển động theo tương tác

Trong bài đọc cuối cùng của chương này, chúng ta sẽ thử thách bản thân với một chương trình phức tạp và hữu ích hơn. Ta sẽ tính toán gia tốc của một đối tượng linh hoạt theo quy tắc trong thuật toán tương ứng với cách thức thứ 3 — gia tốc theo vị trí chuột.
Bất cứ khi nào muốn có được một vectơ dựa trên quy tắc hay công thức nào đó, ta cần tính toán hai yếu tố: độ lớnhướng. Đầu tiên là hướng của vectơ. Hướng của vectơ gia tốc là từ vị trí của đối tượng tới vị trí của chuột. Hãy giả sử vị trí của đối tượng là điểm (x,y) và vị trí của chuột là điểm (mouseX,mouseY).
Từ biểu đồ trên, ta thấy có thể tính vectơ (dx;dy) bằng cách lấy vị trí của chuột trừ đi vị trí của đối tượng:
  • dx = mouseX - x
  • dy = mouseY - y
Hãy viết lại đoạn mã trên bằng PVector. Giả sử ta đang lập trình phần định nghĩa đối tượng Mover và vì vậy có thể truy cập vào vị trí của đối tượng PVector. Ta có:
var mouse = new PVector(mouseX, mouseY);
// Look! We’re using the static sub() because we want a completely new PVector
var dir = PVector.sub(mouse, position);
Vậy là ta có một đối tượng PVector có hướng từ vị trí của đối tượng tới vị trí chuột. Tuy nhiên, nếu đối tượng thay đổi vận tốc theo vectơ đó, nó sẽ xuất hiện ngay lập tức ở vị trí chuột và hiệu ứng hoạt hình tạo ra sẽ không được đẹp cho lắm. Vì vậy, việc ta cần làm là quyết định tốc độ thay đổi vận tốc về phía chuột của đối tượng.
Để thiết lập thông số độ lớn cho vectơ gia tốc PVector, trước tiên, ta phải chuẩn hóa vectơ chỉ hướng. Ta sẽ giảm độ lớn của vectơ xuống còn 1 để thu được vectơ đơn vị, khi đó ta có một vectơ cùng hướng và có thể dễ dàng phóng to/thu nhỏ thành vectơ mới với bất kỳ giá trị độ lớn nào. 1 nhân với bất kỳ số nào cũng bằng chính số đó.
var anything = ??;
dir.normalize();
dir.mult(anything);
Tóm lại, các bước cần làm bao gồm:
  1. Tìm vectơ trỏ từ đối tượng tới vị trí mục tiêu (hay chính là vị trí chuột)
  2. Chuẩn hóa vectơ đó (giảm độ lớn vectơ xuống 1)
  3. Phóng to/thu nhỏ vectơ đó thành vectơ mới với giá trị độ lớn phù hợp (bằng cách nhân với một giá trị nào đó)
  4. Gán vectơ đó cho thuộc tính gia tốc
Hãy cùng xem chương trình đầy đủ ở khung nhập lệnh dưới đây:
Có thể bạn sẽ thắc mắc tại sao hình tròn không dừng lại khi đã chạm tới đích đến. Lí do là bởi đối tượng đang chuyển động không được yêu cầu phải dừng lại khi đến đích, nó chỉ biết đích đến ở đâu và cố gắng di chuyển đến đó nhanh nhất có thể. Di chuyển nhanh nhất có thể tức là đối tượng chắc chắn sẽ vượt quá vị trí đích đến và phải quay đầu lại, tiếp tục di chuyển nhanh nhất có thể rồi lại vượt quá đích đến và tiếp tục lặp lại các bước trên. Chúng ta sẽ tìm hiểu cách lập trình đối tượng có thể di chuyển đến một vị trí chính xác nào đó (và giảm tốc độ khi tiếp cận) ở những chương sau.
Ta có thể liên tưởng chương trình ví dụ trên với khái niệm lực hấp dẫn (ở đây, đối tượng đang bị hút vào vị trí chuột). Khái niệm lực hấp dẫn sẽ được giải thích chi tiết hơn ở những chương sau. Một yếu tố của lực hấp dẫn còn thiếu ở đây là cường độ lực (hay chính là độ lớn của vectơ gia tốc). Cường độ lực hấp dẫn tỷ lệ nghịch với khoảng cách, tức là đối tượng càng gần chuột thì gia tốc di chuyển càng cao.
Hãy cùng chỉnh sửa chương trình trên một chút, thay vì chỉ có một đối tượng, ta thay bằng một mảng các đối tượng:
Khóa học "Mô phỏng tự nhiên" này được biên soạn dựa trên cuốn "The Nature of Code" (tạm dịch: Bản chất của lập trình) của tác giả Daniel Shiffman, được sử dụng theo giấy phép Creative Commons Attribution-NonCommercial 3.0 Unported License.

Tham gia cuộc thảo luận?

Chưa có bài đăng nào.
Bạn có hiểu Tiếng Anh không? Bấm vào đây để thấy thêm các thảo luận trên trang Khan Academy Tiếng Anh.