Cập nhật biến đổi trên các đường cơ bản

Một phần của tài liệu nghiên cứu và xây dựng thử nghiệm 3G Engine (Trang 101 - 103)

Nhưđã nói, một lộ trình cho nhân vật đi theo sẽ bao gồm trong đó nhiều đường cơ bản. Trong hệ thống diễn hoạt của mình, chúng tôi đã xây dựng các 2 loại đường cơ bản là đường thẳng và đường cong Bezier.

Để nhân vật di chuyển theo đường thì ta sẽ tính vị trí và vector pháp tuyến cho nhân vật vào từng thời điểm dựa theo thời gian đã trôi qua kể từ khi nhân vật di chuyển. Sau khi đã biết vị trí và góc quay hiện tại của nhân vật ta sẽ thiết lập vào giá trị vị trí và góc quay của nút gốc của cấu trúc cây của khung xương.

¾ Đối với đường thẳng:

Hình 5-2 Ví dụđường đi thẳng

Dựa vào quảng đường đi được của đối tượng từđiểm đầu tiên ta tính được s = khoảng cách / độ dài quảng đường

vị trí hiện tại = vị trí đầu + s*(vị trí cuối - vị trí đầu) Còn hướng là là hướng của đường thẳng (vector cuối – vector đầu)

¾ Đối với đường cong Bezier:

Một đường cong Bezier được xác định bằng 4 điểm: điểm đầu, điểm cuối và 2 điểm điều khiển. Ví dụ ta có đường cong Bezier sau:

Hình 5-3 Ví dụđường đi Bezier

Ởđây chúng tôi không đi sâu vào đường cong Bezier về mặt toán học mà chỉđề cập đến các công thức dùng trong lập trình. Phương trình toán của đường cong Bezier như sau:

C(s) = P1*(1-s)3 + P2*3*s*(1-s)2 + P3*3*s2*(1-s) + P4*s3 với s là hệ số tỉ lệ:

s = khoảng cách đền điểm đầu tiên / khoảng cách cả đường cong. Khoảng cách cả đường cong được xác định gần đúng như sau:

Gọi length1 = Khoảng cách từ điểm P1 đến P2. length2 = Khoảng cách từ điểm P2 đến P3. length3 = Khoảng cách từ điểm P3 đến P4. length4 = Khoảng cách từ điểm P1 đến P4.

Khoảng cách quảng đường = (length1 + length2 + length3)*0.5 + length4*0.5 Giả sử ta đã có 4 vector cho biết vị trí của các điểm là P1, P2, P3, P4 là vec1, vec2, vec3, vec 4 và ta cần tính vector hiện tại của một điểm cách điểm đầu một khoảng nào đó, ta thực hiện như sau:

Ta tính s dựa trên công thức ở trên.

Gọi vecOut là vector vị trí của điểm hiện tại ta có:

vecOut = vec1*(1-s)3 + vec2*s*(1-s)2 + vec3*s2*(1-s) + vec4*s3. Và tiếp tuyến được tính bằng cách lấy đạo hàm của phương trình đường cong.

Một phần của tài liệu nghiên cứu và xây dựng thử nghiệm 3G Engine (Trang 101 - 103)