Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
MỤC LỤC
MỞ ĐẦU 3
1.1. Môi trường thực tại ảo (Virtual Reality)....................................................................4
1.2. Tầm quan trọng của việc tìm hiểu phát hiện va chạm trong môi trường thực tại ảo 5
1.3. Một số khái niệm cơ bản.............................................................................................5
1.3.1. Khối bao (Bounding volumes)..........................................................................5
1.3.2. Xây dựng các khối bao cơ sở ...........................................................................9
Chương 2 : 12
CÁC PHƯƠNG PHÁP PHÁT HIỆN VA CHẠM 12
2.1. Phương pháp dùng bao cầu - Bounding Sphere.......................................................12
2.1.1. Phát hiện va chạm............................................................................................12
2.1.2. Xử lý va chạm..................................................................................................17
2.2. Kỹ thuật sử dụng hộp bao phát hiện va chạm..........................................................20
2.2.1. Sự phân tách giữa các OBB.............................................................................21
2.2.2. Kiểm tra sự va chạm giữa các OBB................................................................23
2.2.3. Tìm va chạm giữa 2 OBBs..............................................................................24
2.3. Phương pháp Elipsoid...............................................................................................28
2.3.1. Không gian vector và sự tịnh tiến các vật thể trong không gian....................28
2.3.2. Phát hiện va chạm............................................................................................30
2.3.3. Xử lý va chạm..................................................................................................36
2.4. Phát hiện va chạm giữa các đối tượng cơ sở............................................................42
2.4.1. Phát hiện va chạm giữa hộp bao và tam giác (Box – Triangle)......................42
2.4.2. Phát hiện va chạm giữa 2 tam giác (Triangle-Triangle).................................53
Chương 3: 67
PHẦN THỰC NGHIỆM 67
KẾT LUẬN 68
TÀI LIỆU THAM KHẢO: 69
Trang 1
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
MỞ ĐẦU
Ngày nay, sự phát triển của máy tính đã đem đến cho con người những cơ hội mới để
nghiên cứu các vấn đề của thực tế. Bằng việc xây dựng lên môi trường thực tại ảo, con
người có thể mô phỏng thế giới thực vào máy vi tính, mô phỏng những sự kiện có thật hoặc
giả định trong thực tế vào vi tính để tìm hiểu - ở đây chúng tôi chỉ nói đến một trường hợp
đó là chính là mô phỏng các va chạm trong thực tế, để từ đó tìm ra giải pháp thích hợp mà
không cần phải kiểm nghiệm bằng thực tế.
Vấn đề về va chạm thường là những vấn đề rất khó nghiên cứu trong thực tế, chẳng
hạn như va chạm giữa các ôtô, xe máy hay lớn hơn nữa là tàu hỏa, máy bay v.v…Những vấn
đề này đã được nghiên cứu thử nghiệm trong thực tế nhưng còn rất nhiều hạn chế vì nhiều lý
do, còn rất nhiều trường hợp va chạm mà chúng ta cần nghiên cứu nhưng chưa thể thực hiện
được. Một vấn đề khác đó chính là chi phí cung cấp cho việc thử nghiệm trên thực tế là quá
lớn. Chính vì vậy giải pháp sử dụng máy tính để mô phỏng các vụ va chạm này là rất cần
thiết. Đây là một vấn đề hết sức cần thiết cho cuộc sống của con người.
Vấn đề phát hiện va chạm còn được ứng dụng rất nhiều trong các lĩnh vực khác như: y
học, các bộ mô phỏng vật lý hay trong một lĩnh vực có nhu cầu rất lớn đó là giải trí v.v..
Phát hiện va chạm được ứng dụng rất nhiều trong các môi trường thực tại ảo.
Khoá luận này nhằm mục đích nghiên cứu, tìm hiểu va chạm chung giữa các đối tượng
trong thực tế được mô phỏng vào máy tính, hướng giải quyết sau va chạm (hậu va chạm).
Khoá luận gồm có 3 chương:
• Chương 1: Giới thiệu chung về môi trường thực tại ảo và các khái niệm liên quan
khi nghiên cứu phát hiện va chạm
• Chương 2: Giới thiệu một số phương pháp phát hiện va chạm phổ biến.
• Chương 3: Xây dựng ứng dụng va chạm ôtô.
Trong quá trình thực hiện khoá luận tốt nghiệp này, tôi đã nhận được nhiều sự giúp đỡ
của các thầy cô giáo, bạn bè đồng nghiệp và gia đình. Tôi xin cảm ơn sự giúp đỡ nhiệt tình
của thầy Đỗ Năng Toàn, là người trực tiếp hướng dẫn đề tài tốt nghiệp của tôi, anh Phạm
Thế Anh cùng các anh chị trong Viện Công nghệ thông tin đã giúp tôi hoàn thành khoá luận
này, tôi cũng xin chân thành cảm ơn các bạn bè đồng nghiệp, người thân trong gia đình đã
tạo điều kiện, động viên tôi trong quá trình làm đồ án.
Vì điều kiện thời gian không có nhiều, kinh nghiệm còn hạn chế nên không tránh khỏi
thiếu sót. Tôi mong nhận được ý kiến đóng góp của các thầy cô giáo và các đồng nghiệp.
Trang 2
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Chương 1:
TỔNG QUAN VỀ VA CHẠM
Phát hiện va chạm (Collision detection) là tiến trình giải quyết vấn đề có hay không sự
va chạm giữa các đối tượng trong môi trường mà các đối tượng đó tồn tại. Sự va chạm này
có thể giữa các đối tượng cùng loại hoặc giữa các đối tượng khác nhau, va chạm với các đối
tượng tĩnh (ví dụ như : nền nhà, tường nhà, mặt đường v.v...) hoặc va chạm với các đối
tượng động (ví dụ như : ôtô, máy bay v.v...).
Định nghĩa [collision detection] : Cho một không gian U với một tập các đối tượng O,
giải thuật phát hiện va chạm sẽ cho biết sự va chạm giữa các cặp đối tượng từng đôi một C
p
⊂
O x O x R
3
với mọi đối tượng o
1
,o
2
và cho biết các điểm va chạm giữa chúng
p
1,2
∈
R
3
.
Phát hiện va chạm chỉ là một trường hợp đặc biệt trong môi trường giả lập vật lý (được
thể hiện vào máy tính). Thực chất ở đây chúng ta chỉ tìm hiểu sự va chạm giữa các đối tượng
hình học thể hiện các đối tượng (sau này ta gọi đó là các hình bao). Do các đối tượng trong
đời sống có hình dạng khá phức tạp nên ta sẽ đưa chúng về những vật thể có hình dạng
tương đương và đơn giản hơn (mô phỏng vào máy tính), thuật toán phát hiện va chạm chủ
yếu thao tác trên các đối tượng này và chúng ta sẽ sử dụng môi trường vật lý giả lập nếu cần
thiết – Môi trường thực tại ảo.
1.1. Môi trường thực tại ảo (Virtual Reality)
Có nhiều khái niệm khác nhau vể thực tại ảo xong một cách chung nhất chúng ta có
thể định nghĩa thực tại ảo như sau:
Thực tại ảo là một môi trường ba chiều được phát sinh, tổng hợp và điều khiển thông
qua máy vi tính nhằm mục đích mô phỏng lại thế giới thực hoặc một thế giới theo trong
tưởng tượng của con người. Nó cho phép người dùng thông qua các thiết bị ngoại vi và bộ
chuyển đổi tương tác với những sự vật, hành động của thế giới ảo mà như tương tác với các
sự kiện, hành động của thế giới thực. Ví dụ người dùng có thể dich chuyển một vật trong thế
giới ảo, hoặc có thể cảm nhận được một vật khi chạm vào nó vv… Trong đó thiết bị ngoại vi
sẽ làm nhiệm vụ chuyển những hoạt động của người sử dụng vào bộ chuyển đổi từ bộ
chuyển đổi sau đó bộ chuyển đổi sẽ chuyển những tín hiệu này thành các tương tác vào môi
trường ảo, đồng thời môi trường cũng chuyển những tác dụng của nó đến bộ chuyển đổi và
bộ chuyển đổi chuyển đến các thiết bị ngoại vi, sau đó các thiết bị ngoại vi sẽ tác động đến
người sử dụng. Vì vậy người sử dụng sẽ có khả năng tương tác với môi trưởng ảo như là
tương tác trên chính môi trường thực.
Ngoài thuật ngữ thực tại ảo (virtual reality) người ta cũng hay đề cập tới thuật ngữ
thế giới ảo (virtual world). Thực chất đây là hai khái niệm tương đồng có điều thuật ngữ
hướng tới môi trường, không gian ảo mà trong không gian này những người sử dụng có thể
Trang 3
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
tương tác với các đối tượng của không gian ảo này, thậm chí những người sử dụng này có
thể tương tác với nhau trong không gian đó.
Nói chung, các hệ thống thực tại ảo phải xử lý mội khối lượng lớn thông tin (đa phần
là các thông tin của các đối tượng 3D do đó tốn bộ nhớ và đòi hỏi thời gian xử lý là thời gian
thực), vì thế nó đòi hỏi một lượng tài nguyên bộ nhớ RAM lớn và bộ xử lý cùng các thiết bị
vào ra có tốc độ cao. Vì vậy mặc dù bắt đầu nghiên cứu từ khá lâu, xong trong một số năm
gần đây thực tại ảo mới có được sự phát triền và mở rộng ứng dụng đáng kể.
Thực tại ảo có rất nhiều ứng dụng trong thực tế như : khoa học quân sự, quốc
phòng, Giáo dục và đào tạo, y học, thiết kế, khoa học cơ bản, thương mại du lịch, giải trí
v.v…
1.2. Tầm quan trọng của việc tìm hiểu phát hiện va chạm trong môi
trường thực tại ảo
Như đã nói ở trên, môi trường thực tại ảo nhằm mô phỏng thế giới thực hoặc thế giới
theo sự tưởng tượng của con người vào máy vi tính. Trong thế giới thực tồn tại rất nhiều các
đối tượng, các đối tượng này có các hành vi của chúng. Chính vì vậy để môi trường thực tại
ảo mô phỏng được thực tế thì các đối tượng trong môi trường này cũng phải có các hành vi
như trong thế giới thực. Chính vì vậy ta cần nghiên cứu các phương pháp để mô phỏng các
hành vi này, mô phỏng sự tương tác giữa các đối tượng trong môi trường thực tại ảo hay nói
khác đi chính là nghiên cứu việc phát hiện va chạm giữa các đối tượng trong môi trường…
1.3. Một số khái niệm cơ bản
Dưới đây là một số khái niệm thường dùng :
1.3.1. Khối bao (Bounding volumes)
Như đã nói ở trên, ta thấy rằng các đối tượng trong thực tế thường có hình dạng rất
phức tạp, nếu ta sử dụng trực tiếp đối tượng đó thì rất khó có thể áp dụng vào thuật toán .
Chính vì vậy ta cần mô phỏng đối tượng đó bằng một đối tượng khác đơn giản hơn, từ đó
sinh ra khái niệm khối bao (bounding volume).
Khối bao (BV) đơn giản chỉ là một khối hình học bao vừa đối tượng cần thao tác. Khối
bao càng bao vừa khít đối tượng thì thuật toán sẽ càng chính xác. Các khối bao nên là các
khối hình học đơn giản.
BV được sử dụng hầu như trong tất cả các cơ chế phát hiện va chạm hiện nay. Phần
lớn các thuật toán phát hiện va chạm đều sử dụng đến chúng bởi vì nó có xu hướng làm
giảm độ phức tạp của thuật toán.
Có rất nhiều loại BV khác nhau, mỗi loại có những điểm mạnh và điểm yếu riêng. Có
thể phân BV thành 2 loại đó là Bounding Box (BB - hộp bao) và Bounding Sphere
(BS - cầu bao). BB thường có 2 loại đó là loại hướng theo trục toạ độ và loại hướng bất kỳ
(Axis – Oriented), loại này được xác định bởi vị trí 2 đỉnh của hộp, còn BS được xác định
bởi tâm và bán kính.
Trang 4
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Hình 1.3.1: Bounding Box, Bounding Sphere
và những đặc tính của chúng
Có thể liệt kê các loại BV như sau :
Khối bao cầu – Bounding Sphere
Hộp bao theo trục – AABB (Axis Aligned Bounding Box)
Hộp bao định hướng – OBB (Oriented Bounding Box)
Hộp bao dạng đa diện lồi – k-Dop
Ta sẽ lần lượt định nghĩa các khối bao này.
a. Khối bao hình cầu (Bounding spheres) - khối bao cầu.
Bounding spheres là các khối bao có dạng hình cầu bao lấy
đối tượng. Được xác định bởi 4 giá trị : toạ độ tâm
C(x
c
, y
c
, z
c)
và bán kính r.
Khối bao dạng này rất dễ tạo ra và rất đơn giản trong các
thao tác kiểm tra va chạm. Nói là dễ dàng kiểm tra va chạm là bởi
vì khi đối tượng quay hay chuyển động thì hình dạng, hướng của
hình cầu đều không bị thay đổi, hình cầu không bị tác động khi vật
thể tự quay. Hình cầu không phụ thuộc vào trục.
Hình 1.3.1a1: Bounding
Sphere
Ta cũng có thể thay thế các hình bao cầu bởi các khối ellipsoid. Hình bao cầu chỉ là
trường hợp riêng của hình bao ellipsoid.
Tuy nhiên, hình bao cầu lại có rất nhiều nhược điểm. Nó thường biểu diễn không chính
xác hình dạng các vật thể nếu như các vật thể này không có dạng khối cầu, đặc biệt khi hình
dạng của vật thể có dạng dẹt, hoặc dài thì càng không chính xác. Chính vì vậy thuật toán sẽ
không được tối ưu. Khối bao này tạo ra nhiều không gian trống giữa vật thể và khối cầu. Rất
khó hợp nhất 2 hay nhiều BS loại này bởi vì sẽ tạo ra sai số rất lớn.
Hình 1.3.1b2: Hợp nhất và kiểm tra va chạm
giữa 2 Bounding Sphere
Trang 5
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
b. Axis – Oriented Bounding Box
Trong không gian 3 chiều, một axis – oriented bounding box được xác định bởi 6 giá
trị của các đỉnh có toạ độ lớn nhất (x
max
, y
max
, z
max)
và nhỏ nhất (x
min
, y
min
, z
min
). Loại BV này
rất dễ tạo ra , dễ hợp nhất lại với nhau và thuận tiện cho việc phát hiện va chạm. Lợi thế lớn
nhất của loại BV này là xử lý nhanh, tuy nhiên không chính xác cho lắm.
Hình 1.3.1b: Hợp nhất và kiểm tra va chạm
giữa 2 Axis-Oriented Bounding Box
• Hộp bao theo trục toạ độ - AABB (Axis Aligned Bounding Box)
AABB là hộp bao có dạng hình hộp chữ nhật có các cạnh
(trục)song song với các trục toạ độ tương ứng và bao lấy vật thể.
Hộp bao này rất đơn giản, dễ tạo ra và thao tác trong kiểm tra
va chạm cũng rất dễ dàng. Tuy nhiên hộp bao loại này cũng tạo ra
nhiều khoảng trống giữa vật thể và hộp bao. Khi vật thể không nằm
song song với các trục toạ độ và có dạng dài thì khoảng trống này
càng lớn.
Hình 1.3.1b1: AABB
• Hộp bao có hướng – OBB (Oriented Bounding Box)
OBB là hộp bao AABB nhưng trục có hướng bất kỳ. OBB có
ưu điểm hơn AABB đó là giảm không gian trống giữa vật thể và hộp
bao. Tuy nhiên việc tạo ra và thao tác trên hộp bao loại này phức tạp
hơn loại AABB nhiều. Tuy nhiên người ta vẫn dùng loại hộp bao này
nhiều hơn vì nó không đến độ quá phức tạp.
Loại hộp bao này bao khá vừa các dạng vật thể. Tuy nhiên với
các vật thể có nhiều các đỉnh cao như hình bên thì rõ ràng chưa phải
tối ưu.
Hình 1.3.1b2: OBB
c. Các dạng hộp bao khác
Có rất nhiều dạng BV phức tạp khác được dùng trong một vài trường hợp đặc biệt. Để
tạo ra chúng đòi hỏi rất nhiều các thông số. Tuy nhiên càng phức tạp thì càng làm giảm được
khoảng không gian trống giữa đối tượng và hộp bao.
Sự lựa chọn phụ thuộc rất nhiều vào hình dạng của vật thể, chẳng hạn như nếu vật thể
có dạng khối dài thì giải pháp có thể chọn là khối bao cầu (bounding sphere) hoặc khối bao
trụ (bounding cylinder).
Trang 6
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Hình 1.3.1c: Hộp bao dạng đa diện lồi
Hộp bao dạng da đa diện lồi (k-Dop)
Với hộp bao dạng này ta hạn chế được rất nhiều khoảng không gian trống giữa vật thể
và hộp bao. Tuy nhiên việc tao ra hộp bao dạng này đôi khi quá phức tạp
(phức tạp nhất) và việc thao tác trên chúng mất quá nhiều công đoạn. Nó chỉ được sử dụng
đối với các chương trình cần độ chính xác cao. Đối với các chương trình nhỏ yêu cầu tốc độ
thì không nên chọn hộp bao dạng này.
Thông thường, người ta thường giới hạn số mặt hay số cạnh của đa diện tới một giá trị
nào đó (chẳng hạn k = 5,6,7 ...) tuỳ thuộc vào từng ứng dụng cụ thể.
Theo trên ta thấy rằng để giảm khoảng không gian trống thì hộp bao tạo ra và sử dụng
càng trở nên phức tạp (xem biểu đồ).
Hình 1.3.1c1: Độ phức tạp trong tính toán
đối với các hộp bao
Tiếp theo ta sẽ tìm cách xây dựng các hộp bao trên (tạm gọi chung là hộp bao) để có
thể dùng được trong các thuật toán sẽ được sử dụng:
Trang 7
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
1.3.2. Xây dựng các khối bao cơ sở
a. Xây dựng hộp bao AABB:
Xây dựng hộp bao loại này khá đơn giản, hộp bao
này được tạo bởi 2 điểm có toạ độ nhỏ nhất và lớn nhất của
vật thể như hình vẽ 1.3.2a:
Hình 1.3.2a: Hộp bao AABB
b. Xây dựng hộp bao có hướng OBB
Việc xây dựng hộp bao OBB có vẻ phức tạp hơn nhiều so với xây dựng hộp bao
AABB. Trước hết ta tìm đa diện lồi bao vật thể (bằng cách mở rộng các mặt phẳng trên vật
thể). tiếp theo ta phân chia các mặt của đa diện thành các tam giác.
Giả sử sau bước này ta được n tam giác với các định lần lượt là : p
k
, q
k
, r
k
Diện tích của mỗi tam giác là a
k
, vậy ta có tổng diện tích là :
∑
−
=
=
1
0
n
k
kH
aa
Gọi trọng tâm của tam giác thứ i là m
i
= (p
i
+ q
i
+ r
i)
/3
Trọng tâm của đa diện lồi m
H
được cho bởi công thức sau;
∑
−
=
=
1
0
1
n
k
kk
H
H
ma
a
m
Sử dụng công thức trên ta được một ma trận C để từ đó xác định được vector định
hướng cho 8 cạnh của OBB là:
[ ]
( )
−
+++==
∑
−
=
jHiH
n
k
jkikjkikjkikjkik
k
H
ij
mmrrqqppmpm
a
a
cC
,,
1
0
,,,,,,,,
12
1
c. Xây dựng khối bao hình cầu – khối cầu bao (BS: Bounding Sphere)
Cách tạo đơn giản :
- Ta dễ dàng tạo được hộp bao AABB như hình bên
- Lấy tâm của hộp bao AABB làm tâm của hinh cầu.
- Chọn đường kính của hình cầu bằng độ dài đường chéo
của hộp bao AABB
Với cách tạo đơn giản này cho ta một khối bao hình cầu không
được tối ưu cho lắm. Tuy nhiên cách này tương đối đơn giản, dễ
dàng thực hiện.
Ta hãy xem một phương pháp cải tiến của phương pháp
nêu trên:
- Lấy tâm của khối cầu là tâm của hộp bao AABB
- Duyệt tất cả các đỉnh của đối tượng
- Tìm đỉnh mà khoảng cách từ tâm khối cầu đến đó là lớn nhất
và lấy khoảng cách đó làm bán kính của hình cầu
Trang 8
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Với phương pháp này thì hạn chế được khoảng không gian trống hơn phương pháp
trên, tuy nhiên cần phải thực hiện nhiều phép toán so sánh và tìm kiếm.
Qua 2 phương pháp xây dựng nhanh BS ở trên ta thấy rằng giải pháp trên là không
phải tối ưu. Rõ ràng cả 2 phương pháp đều tạo ra những khoảng không gian trống quá lớn.
Chúng ta cần tìm ra giải pháp hạn chế được khoảng không gian trống càng nhiều càng tốt.
Giải pháp tối ưu nhất được trình bày như sau:
Giả sử S là một tập các đỉnh của một đối tượng (hay đơn giản S là tập các điểm). Với
tất cả các đỉnh V thuộc tập S ta thực hiện các bước sau:
Bước 1 : Tìm tất cả các đỉnh V
max
là đỉnh có toạ độ lớn nhất theo các trục toạ độ (x,y,z)
Bước 2 : Tìm tất cả các đinh V
min
là đỉnh có toạ độ nhỏ nhất theo các trục toạ độ (x,y,z)
Bước 3 : Chọn ra cặp đỉnh V
min
, V
max
sao cho khoảng cách giữa chúng theo các trục toạ độ là
lớn nhất.
Bước 4 : Chọn tâm C của khối cầu là trung điểm của vector V
max
- V
min
Bước 5 : Chọn bán kính của khối cầu bằng một nửa độ dài vector V
max
- V
min
Trang 9
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Bước 6 : Duyệt tất cả các đỉnh còn lại, gọi d là khoảng cách từ đỉnh đang xét tới tâm của
khối cầu. Nếu một đỉnh nào đó nằm ngoài khối cầu thì ta di chuyển tâm C của khối cầu một
khoảng (d+r)/2 và chọn bán kính mới của khối cầu là (d+r)/2
Khi đã duyệt tất cả các đỉnh thì chắc chắn rằng khối cầu đã bao tất cả các đỉnh (hay các
điểm).
Trang 10
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Chương 2 :
CÁC PHƯƠNG PHÁP PHÁT HIỆN VA CHẠM
Chúng ta cần giải quyết 3 câu hỏi chính trong việc phát hiện va chạm đó là: có hay
không , khi nào và ở đâu :
Đối với 2 đối tượng bất kỳ có xảy ra hay không sự va chạm giữa chúng (bằng
việc kiểm tra sự va chạm giữa các đối tượng hình học đơn giản) ?
Nếu xảy ra va chạm thì chúng sẽ va chạm vào thời điểm nào ?
Sự va chạm xảy ra tại vị trí nào trên bề mặt đối tượng ?
Việc giải quyết va chạm giữa các đối tượng thường rất khó. Chính vì vậy, giải thuật
phát hiện va chạm thường được phân thành các bước nhỏ hơn, mỗi giai đoạn chúng ta lại
kiểm tra điều kiện thích hợp, chỉ xử lý bước tiếp theo khi bước trước nó đã thành công.
Với một hệ thống gồm N đối tượng thì chúng ta cần phải duyệt qua (N
2
-N)/2 bước
kiểm tra - O(N
2
). Với N nhỏ thì công việc này là khá dễ dàng, nhưng với N lớn thì chi phí để
thực hiện nó sẽ là rất cao.
Vấn đề tiếp theo cũng rất quan trọng đó là vấn để giải quyết sau va chạm hay phản ứng
lại va chạm (Collision response). Để giải quyết vấn đề này chúng ta thường sử dụng các khái
niệm về động học như momen hay lực tác dụng, tức là chúng ta cần tính toán đến các đại
lượng vật lý (như: khối lượng, vận tốc ...). Ở đây, để vấn đề trở nên đơn giản hơn thì đôi khi
ta chỉ giải quyết các va chạm mang tính chất đàn hồi (2 vật không “dính” vào nhau sau va
chạm).
2.1. Phương pháp dùng bao cầu - Bounding Sphere
Trong phần này ta sẽ lần lượt xét một số thuật toán phát hiện va chạm, đồng thời giải
quyết thêm vấn đề sau va chạm. Ta sẽ sử dụng các khối bao thay cho các đối tượng cần thể
hiện.Từ những thuật toán riêng cho từng đối tượng ta sẽ đi đến một thuật toán chung cho tất
cả các đối tượng.
2.1.1. Phát hiện va chạm
Phát hiện có va chạm
Khối cầu - Mặt phẳng
Khối cầu - Khối trụ
Khối cầu - Khối cầu
Sử dụng các định luật vật lý để phản hồi sau va chạm
Lực tác dụng trở lại đối tượng khi va chạm
Sử dụng trọng lực trong việc di chuyển đối tượng
a. Tìm giao điểm giữa một tia với mặt phẳng
Để phát hiện va chạm chúng ta sử dụng một thuật toán đơn giản tạm gọi là lần theo tia
(ray tracing). Trước hết ta sẽ định nghĩa thế nào là một tia. Một tia được xác định bởi một
Trang 11
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
điểm hay còn gọi là gốc và một vector xác định hướng mà tia đó sẽ đi theo. Nói tóm lại, một
tia có thể được biếu diễn bởi một điểm gốc và vector định hướng.
Phương trình của một tia có dạng:
PointOnRay = RayStart + t * Raydirection (1)
Trong đó:
t là số thực , t
)
[
∞∈
;0
PointOnRay : một điểm thuộc tia
Raystart : điểm gốc của tia
Raydirection : hướng của tia
Theo phương trình (1) ở trên thì khi t = 0 thì PointOnRay chính là điểm gốc. Với các
giá trị khác của t thì PointOnRay chạy khắp tia. PointOnRay, Raystart, Raydirection là các
đại lượng Vector trong không gian R
3
nhận các giá trị (x,y,z). Tiếp theo chúng ta sẽ sử dụng
tia để biểu diễn và tính toán sự va chạm của khối cầu với mặt phẳng và các khối cầu.
Phương trình mặt phẳng biểu diễn thông qua Vector có dạng :
Xn dot X = d (2)
Trong đó:
Xn, X là các vector và d nhận giá trị thực
Xn là pháp tưyến của mặt phẳng
X là một điểm thuộc mặt phẳng đang xét
d – là khoảng cách từ gốc của hệ toạ độ Oxyz tới mặt phẳng
Theo phương trình (2), để biểu diễn một mặt phẳng trong không gian 3D hay R
3
ta chỉ
cần một điểm nằm trên mặt phẳng đó và một Vector pháp tuyến tại điểm đó
(Vector pháp tuyến là Vector vuông góc với mặt phẳng). Để có thể xác định được vector
pháp tuyến của mặt phẳng ta chỉ cần xác định được 2 vector không song song trong mặt
phẳng đó. Tích có hướng của 2 Vector này sẽ tạo thành vector pháp tuyến.
Ví dụ : Giả sử ta có điểm O(0,0,0) và một vector pháp tuyến (0,1,0) như vậy ta xác
định được mặt phẳng (xOz).
Như vậy, một điểm và một vector pháp tuyến là đủ để định nghĩa một mặt phẳng. Sử
dụng phương trình Vector của mặt phẳng thì pháp tuyến là Xn và điểm 3D
(cũng là gốc của vector) là X. Chỉ có một giá trị cần phải chú ý là d (giá trị này cũng có thể
tính được từ phương trình vector)
Chú ý: Phương trình Vector trên hoàn toàn tương đương với phương trình mà ta
thường dung là Ax + By + Cz + D = 0. Ở đây, ta chỉ cần thay Xn = (A,B,C) và X = (x,y,z)
thì 2 phương trinh hoàn toàn tương đương.
Tổng kết ta có được 2 phương trình:
PointOnRay = RayStart + t * Raydirection (1)
Xn dot X = d (2)
Nếu tia giao với đường thẳng tại điểm nào đó thì điểm đó thì điểm đó thoả mãn cả 2
phương trinh (1) và (2). Vậy từ (1), (2):
Xn dot PointOnRay = d
Trang 12
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
hay:
(Xn dot RayStart)+ t * (Xn dot Raydirection) = d
Giải phương trình với ẩn t ta có :
onRaydirectidot Xn
RayStartdot Xn -d
t
=
Thay d vào ta được :
onRaydirectidot Xn
RayStartdot Xn NEPointOnPLAdot Xn
t
−
=
Cuối cùng:
onRaydirectidot Xn
RayStart)-ANE(PointOnPLdot Xn
=
t
Ta nhận thấy rằng t chính là khoảng cách tử điểm gốc (gốc của tia) cho đến giao điểm
của tia với mặt phẳng. Do vậy thông qua phương trình Vector ta nhận được t, từ đó có thể
tìm thấy giao điểm của tia với mặt phẳng.
Có một số trường hợp đặc biệt. Chẳng hạn :
Nếu Xn dot Raydirection = 0 thì 2 vector này song song với nhau. Tức là tia song song
với mặt phẳng và như vậy không có giao điểm nào.
Nếu như tia không hướng vào mặt phẳng thì cũng không có giao điểm nào.
int TestIntersionPlane(const Plane& plane, const TVector& position, const TVector& direction , double lamda,
TVector& pNormal)
{
double DotProduct = direction.dot(plane._Normal); // Xn dot Raydirection
double l2;
// Nếu tia song song với mặt phẳng
if((DotProduct < ZERO) && (DotProduct >-ZERO))
return 0;
// t = l2
l2 = (plane._Normal.dot(plane_Position – position)) / DotProduct;
if(l2 < - ZERO) return 0;
pNormal = plane._Normal;
lamda = l2;
return 1;
}
Đoạn mã ở trên thực hiện việc tính toán và trả về giao điểm. Nếu tia cắt mặt phẳng thì
hàm trả về 1 ngược lại trả về 0. Các đối số là mặt phẳng (plane), điểm gốc (position), hướng
của tia (direction), số thực lamda chính là khoảng cách tới giao điểm tính từ điểm gốc (nếu
có giao điểm), pNormal là vector pháp tuyến với mặt phẳng tại giao điểm.
b. Tìm giao điểm giữa 2 khối cầu:
Một khối cầu được xác định bởi tâm và bán kính của nó. Giải quyết vấn đề va chạm
giữa 2 khối cầu có vẻ đơn giản hơn. Bằng cách tính khoảng cách giữa 2 tâm của khối cầu,
Trang 13
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
nếu khoảng cách này nhỏ hơn hoặc bằng tổng của 2 bán kính của 2 khối cầu thì 2 khối cầu
giao nhau.
Nhưng vấn đề lại không chỉ có vậy, ta hay xem hình dưới:
Rõ ràng là theo hướng chuyển động của 2 quả bóng trên (ball 1 và ball 2) thì chắc chắn
là 2 quả bóng đó sẽ va chạm với nhau. Nhưng thực tế thì chưa chắc như vậy là bởi vì ở đây
chúng ta quên mất yếu tố thời gian. Gọi C là giao điểm của r1 với r2 (ở đây chưa nói C là
điểm giao của ball 1 với ball 2). Nếu xét đến yếu tố thời gian thì tại thời điểm t1 quả bóng
ball 1 chuyển động qua điểm C, tại thời điểm t2 quả bóng ball 2 chuyển động qua điểm C.
Ta hoàn toàn có thể cho rằng t1 khác t2 và như vậy thì ball 1 không va chạm với ball 2. Đó
chính là vấn đề chính ta cần giải quyết.
Các phương trình ở trên chỉ giải quyết được giao điểm khi chưa xét đến vấn đề thời
gian. Đối với các đối tượng có hình dạng phức tạp hoặc khi không thể thiết lập được phương
trình cụ thể để tìm giao điểm hoặc khi phương trình trở nên quá phức tạp không thể giải
được thì tất nhiên là chúng ta phải sử dụng đến những phương thức khác.
Các thông số cần thiết để tính toán giao điểm của 2 khối cầu đó là : điểm đầu, điểm cuối,
thời gian, vận tốc (bao gồm hướng và tốc độ) của khối cầu. Để tính được điểm giao thì thời
gian (time step) lại được chia thành các khoảng nhỏ hơn và chúng ta sẽ thực hiện việc di
chuyển khối cầu trong mỗi khoảng thời gian đó bằng cách sử dụng đại lượng vận tốc và
kiểm tra sự giao nhau trong mỗi khoảng thời gian đó. Khi có bất cứ giao điểm nào được tìm
thấy (cũng có nghĩa là khối cầu này sẽ “xuyên” một phần của nó vào khối cầu khác), chúng
ta sẽ lấy vị trí của khối cầu ngay trước khi khối cầu đó “xuyên” vào khối cầu khác làm vị trí
giao điểm.
Rõ ràng là chúng ta không muốn 2 khối cầu xuyên vào nhau như hình trên. Do vậy
chúng ta phải lấy vị trí của khối cầu ngay trước khi chúng xuyên vào nhau làm vị trí giao
điểm. Khoảng chia thời gian (time step) càng nhỏ thì độ chính xác càng cao.
Ta có thể cài đặt phương thức tìm giao điểm giữa 2 khối cầu và thời gian xảy ra va
chạm như sau:
int FindBallCol(TVector & point, double & TimePoint, double Time2, int & BallNr1,int BallNr2)
{
TVector RelativeV;
TRay rays;
double MyTime=0.0,Add=Time2/150.0,Timedummy=10000,Timedummy2=-1;
Trang 14
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
TVector posi;
//Kiểm tra va chạm của từng khối cầu trong mỗi khoảng thời gian là Time2/150.0
for (int i ; i < NrOfBalls - 1 ; i++)
{
for (int j = i + 1; j < NrOfBalls ; j ++)
{
// Tìm khoảng cách giữa 2 tâm
RelativeV = ArrayVel [i] – ArrayVel [j] ;
rays = TRay (OldPos [i] , TVector :: unit (RelativeV));
MyTime = 0.0 ;
// Nếu khoảng cách giữa 2 tâm lớn hơn 2 * bán kính
if ((rays . dist (OldPos [j])) > 40) continue;
// Nếu có va chạm xảy ra thì lặp cho đến khi tìm được giao điểm
while (MyTime < Time2)
{
MyTime += Add ;
posi = OldPos [i] + RelativeV * MyTime ;
if (posi . dist (OldPos [j]) < = 40)
{
point = posi ;
if(Timedummy > (MyTime–Add))Timedummy=MyTime – Add ;
BallNr1 = i ;
BallNr2 = j ;
break;
}
}
}
}
if (Timedummy != 10000)
{
Timepoint = Timedummy ;
return 1;
}
return 0;
}
Vấn đề tiếp theo chúng ta phải giải quyết đó là sẽ xảy ra va chạm trong khoảng giữa
mỗi khoảng thời gian (Timestep) mà ta xét. TimeStep chính là mỗi khoảng thời gian ta thực
hiện di chuyển khối cầu từ vị trí hiệnt tại dọc theo hướng của vector vận tốc. Vì chúng ta
kiểm tra khối cầu di chuyển trên một tia vô hạn nên luôn có khả năng điểm xảy ra va chạm
nằm sau vị trí mới của khối cầu đó. Để giải quyết vấn đề này chúng ta sẽ di chuyển khối cầu,
tính toán vị trí mới và tìm khoảng cách giữa điểm đầu và điểm cuối. Từ thủ tục tìm va chạm
chúng ta sẽ nhận được khoảng cách từ điểm bắt đầu tời điểm va chạm. Nếu khoảng cách này
nhỏ hơn khoảng cách từ điểm bắ đầu đến điểm cuối thì sẽ có một va chạm. Để tính toán
chính xác thời gian xảy ra va chạm chúng ta chỉ cần giải một phương trình đơn giản sau.
Đặt:
Dst = khoảng cách giữa điểm bắt đầu và điểm kết thúc.
Dsc = khoảng cách từ điểm bắt đầu và điểm xảy ra va chạm
T = TimeStep.
Vậy thời gian xảy ra va chạm (Tc) sẽ là:
Tc = Dsc * T / Dst
Trang 15
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Giả sử TimeStep là 1 giây và chúng ta tìm thấy chính xác vị trí giao điểm nằm ở
khoảng cách chính giữa thời gian này. Như vậy, thời gian xảy ra va chạm chính xác phải là
0.5 giây. Điều này sẽ được hiểu là “0.5 giây sau khi bắt đầu sẽ xảy ra một va chạm”. Điểm
va chạm sẽ được tính bằng cách nhân Tc với vận tốc hiện tại và cộng với vị trí điểm bắt đầu:
[Điểm va chạm] = [Vị trí bắt đầu] + [Vận tốc]*Tc
2.1.2. Xử lý va chạm
a. Va chạm với đối tượng tĩnh
Giải quyết vấn đề phản hồi sau va chạm với các đối tượng tĩnh (như mặt phẳng, khối
trụ) cũng không kém phần quan trọng như việc kiểm tra và phát hiện va chạm. Sử dụng các
thuật toán và hàm chức năng đã được mô tả ở phần trên chúng ta có thể tìm ra chính xác
điểm va chạm, Vector pháp tuyến tại điểm va chạm và thời gian xảy ra va chạm nếu như có
va chạm giữa các đối tượng.
Để giải quyết vấn đề sau va chạm một cách đúng đắn và chính xác, ta phải áp dụng các
định luật vật lý. Nói chung, khi một đối tượng va chạm với một đối tượng khác hay một bề
mặt, một cách khách quan thì hướng chuyển động của đối tượng sẽ thay đổi
(đây không phải là trường hợp của va chạm mềm). Góc của hướng chuyển động mới hợp
với pháp tuyến tại điểm va chạm bằng với góc của hướng chuyển động trước lúc va chạm
hợp với pháp tuyến tại điểm va chạm (hay góc “phản xạ” bằng với góc “tới”).
• R : Vector biểu diễn hướng chuyển động mới
• I : Vector biểu diễn hướng chuyển động trước khi va chạm
• N : Vector pháp tuyến đặt tại điểm xảy ra va chạm.
Ta có thể tính được R theo công thức:
R = 2 * (-I dot N) * N + I
H ình 2.1.2a: góc “phản xạ”
và góc “tới”
Chú ý rằng ở đây I và N đều phải là các vector đơn vị. Vector vận tốc của chúng ta
biểu diễn tốc độ và hướng chuyển động. Vì thế nó sẽ không được đưa vào phương trình trên.
Độ lớn của vận tốc chính là độ lớn của Vector vận tốc. Nhưng tất nhiên ta hoàn toàn có thể
chuẩn hoá Vector này để đưa nó vào phương trình trên thay thế vào vị trí của vector R.
Vector R cho chúng ta biết hướng chuyển động mới hay tia phản xạ nhưng để sử dụng được
như vector vận tốc thì nó cần có thêm yếu tố về tốc độ, tức là độ lớn của vận tốc. Muốn vậy
ta chỉ cần nhân R với độ lớn của vận tốc chính là độ lớn của tia gốc, từ đó sẽ cho ta chính
xác vector vận tốc.
Đoạn mã sau sẽ thực hiện tính góc phản xạ:
rt2=ArrayVel[BallNr].mag(); //Tìm độ lớn của vận tốc
ArrayVel[BallNr].unit(); // Chuẩn hoá
//Tính toán sự phản xạ
ArrayVel[BallNr]=TVector::unit((normal*(2*normal.dot(-ArrayVel[BallNr]))) +
ArrayVel[BallNr]);
ArrayVel[BallNr]=ArrayVel[BallNr]*rt2;
Trang 16
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
b. Va chạm với đối tượng đang chuyển động (Đối tượng động)
Ta xét trường hợp 2 khối cầu đang chuyển động va chạm với nhau. Trường hợp này có
lẽ phức tạp hơn nhiều so với trường hợp va chạm với các đối tượng tĩnh.
H ình 2.1.2b: Va chạm giữa 2 đối tượng động
Giả sử 2 khối cầu có Vector vận tốc ngày trước thời điểm va chạm là U
1
và U
2
(hình
vẽ). Ta sẽ phân tích các vector vận tốc U
1
, U
2
thành các vector thành phần tại thời điểm xảy
ra va chạm. X_Axis là Vector nối tâm của 2 khối cầu.
U
1x
và U
2x
là hình chiếu của vector vận tốc U
1
, U
2
lên Vector X_Axis.
U
1y
và U
2y
là hình chiếu của vector vận tốc U
1
, U
2
lên trục vuông góc với
X_Axis.
M
1
và M
2
là trọng lượng của 2 khối cầu này. V
1
, V
2
là vận tốc mới sau khi xảy
ra va chạm.
V
1x
, V
1y
, V
2x
, V
2y
là các hình chiếu tương ứng của V
1
, V
2
lên trục X_Axis và
trục vuông góc với X_Axis.
Ta sẽ đi tìm từng thành phần nêu trên:
a. Tìm X_Axis:
X_Axis = (Center2 – Center1)
Chuẩn hoá X_Axis => X_Axis.unit()
b. Tìm các hình chiếu
U
1x
= X_Axis * (X_Axis dot U
1
)
U
1y
= U
1
- U
1x
U
2x
= -X_Axis * (-X_Axis dot U
2
)
U
2y
= U
2
- U
2x
c. Tìm các vận tốc mới
( ) ( ) ( )
( ) ( )
21
1122211
2
21
2212211
1
)(
MM
MUUMUMU
V
MM
MUUMUMU
V
xxxx
x
xxxx
x
+
∗−−∗+∗
=
+
∗−−∗+∗
=
Để cho bài toán đơn giản hơn ta giả sử M
1
= M
2
= 1
Trang 17
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
d. Tìm các thành phần vận tốc cuối cùng
V
1y
= U
1y
V
2y
= U
2y
V
1
= V
1x
+ V
1y
V
2
= V
2x
+ V
2y
Các công thức trên đây đã được chứng minh nên ở đây chỉ nêu lên công thức cuối cùng
chứ không dẫn dắt đi từng bước cụ thể (đây cũng không phải là mục đích chính của tài liệu
này nên cũng chẳng thành vấn đề)
Dưới đây là đoạn Code thực hiện việc tính toán các thánh phần nêu trên:
TVector pb1,pb2,xaxis,U1x,U1y,U2x,U2y,V1x,V1y,V2x,V2y;
double a,b;
// Tìm vị trí khối cầu 1
pb1=OldPos[BallColNr1]+ArrayVel[BallColNr1]*BallTime;
// Tìm vị trí khối cầu 2
pb2=OldPos[BallColNr2]+ArrayVel[BallColNr2]*BallTime;
xaxis=(pb2-pb1).unit(); // Tìm trục X_Axis
a=xaxis.dot(ArrayVel[BallColNr1]); // Tìm hình chiếu
U1x=xaxis*a; // Tìm hình chiếu của vector vận tốc
U1y=ArrayVel[BallColNr1]-U1x;
xaxis=(pb1-pb2).unit(); // Tương tự như trên
b=xaxis.dot(ArrayVel[BallColNr2]);
U2x=xaxis*b;
U2y=ArrayVel[BallColNr2]-U2x;
V1x=(U1x+U2x-(U1x-U2x))*0.5;
//Tìm vận tốc mới
V2x=(U1x+U2x-(U2x-U1x))*0.5;
V1y=U1y;
V2y=U2y;
// Cập nhật vị trí của tất cả các khối cầu
for (j=0;j<NrOfBalls;j++)
ArrayPos[j]=OldPos[j]+ArrayVel[j]*BallTime;
ArrayVel[BallColNr1]=V1x+V1y; //Đặt lại vận tốc mới
c. Di chuyển dưới tác dụng của trọng lực – Phương trình Euler
Để mô phỏng sự chuyển động và va chạm giống với thực tế thì chỉ xác định được điểm
va chạm và phản hồi va chạm là chưa đủ, mà ta còn phải sử dụng thêm yếu tố đó là trọng
lực. Sử dụng phương trình Eule, tại mỗi bước (TimeStep) vị trí và vận tốc của các đối tượng
tham gia chuyển động được tính toán lại như sau:
Velocity_New = Velocity_Old + Acceleration * TimeStep hay v = v
o
+ a.t
Position_New = Position_Old + Velocity_New * TimeStep hay x = x
o
+ v.t
Trang 18
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Như vậy, các đối tượng sẽ di chuyển và được kiểm tra va chạm với vận tốc mới này.
Gia tốc (acceleration : a) của từng đối tượng được xác định bởi phương trình sau:
Force = mass * acceleration hay F= m.a
Trong trường hợp của chúng ta thì lực F chỉ là trọng lực (các trường hợp khác hoàn
toàn tương tự). Gia tốc ở đây cũng được biểu diễn dưới dạng Vector.
2.2. Kỹ thuật sử dụng hộp bao phát hiện va chạm
Để kiểm tra 2 hộp bao có va chạm với nhau hay không ta sử dụng định lý sau: 2 đối
tượng lồi sẽ không giao nhau khi và chỉ khi tồn tại mặt phẳng P cô lập được chúng.
Trong không gian 3 chiêu R
3
, nếu 2 hộp bao giao nhau thì hình chiếu của chúng trên các
trục toạ độ x, y và z cũng phải giao nhau.
Thuật toán tổng quát có thể phát biểu ngắn gọn như sau:
Chiếu mỗi hộp bao (AABB) lên các trục toạ độ x, y và z. Kết quả thu được là
các đoạn thẳng.
Hoặc có thể chiếu mỗi hộp bao (AABB) lên các mặt phẳng toạ độ xOy, yOz và
zOx. Kết quả thu được là các hình chữ nhật.
Kiểm tra sự giao nhau giữa các đoạn thẳng được chiếu lên các trục toạ độ. Nếu
hình chiếu của 2 hộp bao giao nhau trên cả 3 trục toạ độ thì 2 hộp bao đó giao
nhau. Ngược lại chúng không giao nhau.
Nếu chiếu lên các mặt phẳng toạ độ thì 2 hộp bao giao nhau khi và chỉ khi hình
chiếu của 2 hộp bao đó lên mỗi mặt phẳng toạ độ đều giao nhau.
H ình 2.2: Chiếu các đối tượng lên các trục toạ độ
Ta sẽ đi sâu vào tìm hiểu phương pháp này.
Hộp bao (Oriented Bounding Boxes)
Trong phần này, tất cả các vectors được hiểu là trong không gian R
3
.
Ta định nghĩa lại OBB: một OBB được định nghĩa bởi vector
C
, một tập các trục
210
,, AAA
và tập các phạm vi (extents - khoảng, phạm vi) a
0
> 0, a
1
> 0, a
2
> 0. Cũng giống
như một hộp rắn (solid box), OBB được mô tả bởi hệ thức:
∀≤+
∑
=
iaxAxC
ii
i
ii
___:
2
0
và 8 đỉnh của hộp là:
Trang 19
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
∑
=
+
2
0i
iii
AaC
σ
trong đó:
1
=
i
σ
với mọi i.
2.2.1. Sự phân tách giữa các OBB
OBB đầu tiên có tâm
0
C
, các trục
210
,, AAA
và các khoảng a
0
, a
1
, a
2
. OBB thứ hai có
tâm
1
C
, các trục
210
,, BBB
và các khoảng b
0
, b
1
, b
2
. Các trục phân tách 2 hộp bao có thể
có dạng sau
LsC
+
0
trong đó
L
là một trong các thành phần
ji
BA
,
hoặc
ji
BxA
với
i=0,1,2 và j = 0,1,2.
Hình chiếu của một điểm
P
lên đường
LsC
+
0
theo
0
C
là:
( )
L
LL
CPL
.
.
0
−
Khoảng cách từ đường gốc
0
C
tới hình chiếu là : ProjDist(
P
) =
( )
LL
CPL
.
.
0
−
Khoảng cách hình chiếu các đỉnh của OBB thứ nhất liên hệ với đường gốc
0
C
theo hệ
thức:
∑∑
==
=
+
2
0
2
0
0
.
.
Pr
i
i
ii
i
iii
LL
AL
aAaCojDist
σσ
Độ dài ngắn nhất gồm tất cả 8 khoảng hình chiếu có tâm K
0
= 0 và bán kính được xác
định bởi:
( )
LL
ALALSigna
r
iii
.
...
0
∑
=
Khoảng cách hình chiếu của các đỉnh của OBB thứ hai liên hệ với đường gốc
0
C
theo
hệ thức:
∑∑
==
+=
+
2
0
2
0
0
.
.
.
.
Pr
i
i
ii
i
iii
LL
BL
a
LL
DL
AaCojDist
σσ
Trong đó:
01
CCD
−=
.
Độ dài ngắn nhất gồm tất cả 8 khoảng hình chiếu có tâm
DLK
.
1
=
và bán kính:
( )
LL
BLBLSignb
r
i
iii
.
..
2
0
1
∑
=
=
Hai khoảng chiếu sẽ không giao nhau khi và chỉ khi khoảng cách giữa các tâm lớn hơn
tổng của các bán kính: |K
1
- K
0
| > r
0
+ r
1
. Mỗi đại lượng ở 2 vế có cùng mẫu số
LL
.
. Do đó
ta bỏ đi mẫu số này, điều kiện không giao nhau sẽ là:
( )
( )
i
i
ii
i
iii
BLBLSignbALALSignaDL
.....
2
0
2
0
∑∑
==
+>
Đặt:
Trang 20
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
DLR
.
=
( )
i
i
ii
ALALSignaR
..
2
0
0
∑
=
=
( )
i
i
ii
BLBLSignbR
..
2
0
1
∑
=
=
(1)
điều kiện không giao nhau là R > R0 + R1.
Các trục của OBB thứ 2 có thể được viết dưới dạng tổ hợp các trục của OBB thứ nhất:
2211
AcAcAcB
iiooii
++=
với i = 0, 1, 2.
Gọi: A là ma trận với cột là các thành phần của
i
A
B là ma trận với cột là các thành phần của
i
B
C là ma trận với cột là các thành phần c
ij
Khi đó, ta có:
B = AC → C = A
T
B trong đó T là toán tử chuyển vị.
ji
j
i
BAc
.
=
Cũng như vậy các trục của OBB thứ nhất có thể viết dưới dạng tổ hợp các trục của OBB
thứ hai:
2211
BcBcBcA
iioioi
++=
với i = 0, 1, 2.
Kiểm tra điều kiện không giao nhau gồm tích vô hướng của các bộ ba sau:
( )
jiojii
ciiSignBxAA
210
1
,.
=
( )
2
011
,.
j
ijijo
cjjSignBxAB
=
(2)
Trong đó:
Sign(0,1) = Sign(1,2) = Sign(2,0) = +1 và Sign(1,0) = Sign(2,1) = Sign(0,2) = -1.
Từ phương trình (1) và (2) ta có bảng sau:
Trang 21
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Bảng 1:Bảng các giá trị của R, R
o
,R
1
để kiểm tra điều kiện 2 OBB không giao nhau:
R>R
o
+R
1
2.2.2. Kiểm tra sự va chạm giữa các OBB
a. Đối tượng tĩnh
Kiểm tra sự giao nhau được xử lí trên 15 khả năng có thể của các trục phân tách. Nếu
một trục nào được tìm thấy thì các trục còn lại không cần phải xử lý. Các đại lượng c
ij
và |c
ij
|
được tính toán khi cần thiết. Điều này để tránh những tính toán không cần thiết khi có một
trục nào đó được tìm thấy và một vài c
ij
không cần được tính. Để tìm ra các trục phân tách ta
dựa trên các điều kiện về R
o
,R
1
và R và kiểm tra điều kiện không giao nhau bằng cách so
sánh R>R
o
+R
1
.
b. Đối tượng động - vận tốc không đổi
Việc phát hiện giao nhau như các OBBs cần phải được sửa đổi đôi chút để có thể nắm
được sự va chạm khi các OBBs có các thành phần vận tốc (giả sử là vận tốc không đổi). Nếu
coi OBB thư nhất là đối tượng tĩnh thì vận tốc của OBB thư hai phải trừ đi vận tốc của OBB
thứ nhất.
Nếu vận tốc của các OBB lần lượt là
o
V
và
1
V
, đặt
o
VVW
+=
1
. Gọi thời gian ban
đầu và kết thúc quá trình là t = 0 và t = T. Đặt
W)(
01
tCCtD
+−=
với
],0[ Tt
∈
.
Giả sử trục phân tách có dạng
LsC
+
0
. Các đại lượng R
0
và R
1
độc lập đối với t và có
thể được tính trong trường hợp đối tượng tĩnh, R phụ thuộc vào thời gian. Việc kiểm tra điều
kiện không giao nhau sẽ là R(t) > R
0
+ R
1
với
],0[ Tt
∈
. Do vận tốc dài (hay vận tốc tuyến
tính) nên ta chỉ cần chỉ ra điều kiện không giao nhau sẽ là R(0) > R
0
+ R
1
, R(T)>R
0
+R
1
và
).().(
10
DLSignDLSign
=
.
Trang 22
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Ý tướng của vấn đề là chỉ ra rằng |p + tw| > r > 0.
if(p > r)
{
if(p + T*w > r)
return no_intersection;
}
else if(p < -r)
{
if(p + T*w < -r)
return no_intersection;
}
Nếu như có bất cứ một trục phân tách nào trong 15 trục có thể phân tách được 2 OBB
trong toàn bộ khoảng thời gian thì sẽ không có va chạm xảy ra. Tuy nhiên, nếu không có trục
nào trong 15 trục phân tách 2 OBB trong khoảng thời gian trên thì vẫn có khả năng không có
sự giao nhau xảy ra. Ở đây trục phân tách chỉ có tác dụng chính là nếu nó được tìm thấy thì
chắc chắn 2 OBB sẽ không giao nhau. Sự chuyển động của OBB đôi khi cũng khá phức tạp.
Nếu như bạn nhìn các OBB dọc theo hướng chuyển động thì OBB xuất hiện như một đối
tượng tĩnh. Do vậy hình chiếu của OBB lên bất kì một mặt phẳng nào vuông góc với hướng
chuyển động
W
sẽ không chuyển động khi OBB chuyển động. Nếu các hình chiếu không
giao nhau thì 2 OBB không giao nhau trong khoảng thời gian đang xét. Nếu các hình chiếu
giao nhau thì các OBB giao nhau. việc kiểm tra các hình chiếu không giao nhau yêu cầu thực
hiện kiểm tra trên 6 trục bổ xung, các trục đó là :
i
AxW
và
i
BxW
với 0 ≤ i ≤ 2.
Đặt:
ii
AxW
=
α
và
i
BxW
=
i
β
với 0 ≤ i ≤ 2
Bảng 1': bảng các giá trị của R, R
o
, R
1
để kiểm tra điều kiện không giao nhau theo hướng
chuyển động của 2 OBB: R > R
0
+ R
1
2.2.3. Tìm va chạm giữa 2 OBBs
Kiểm tra sự giao nhau của các OBB dùng toán tử boolean. Thuật toán trả về giá trị true
nếu có sự giao nhau xảy ra và false trong trường hợp ngược lại. Không có thông tin thêm
nào được cung cấp về vị trí xảy ra va chạm (có thể va chạm ở nhiều điểm).
Trong trường hợp va chạm giữa các đối tượng tĩnh, vùng va chạm có thể được tính toán
hơi khó. Đây là lĩnh vực tính toán của các đối tượng cứng. Đối với hệ thống động, các đối
tượng chuyển động thì phải khởi tạo ban đầu không giao nhau và kiểm tra giao nhau trong
suốt khoảng thời gian được chỉ định. Những trường hợp giao nhau sau có thể cho ra một
điểm va chạm (nếu có): đỉnh - đỉnh, đỉnh - cạnh, đỉnh - mặt, cạnh - cạnh (không song song
hoặc trùng nhau !) khi đó giao điểm là duy nhất. Trong trường hợp mặt - mặt hoặc cạnh -
cạnh thì điểm giao không phải là duy nhất. Ta cần cung cấp thông tin về một trong những
điểm va chạm.
Trang 23
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
a. Tìm lần va chạm đầu tiên
Cho 2 đối tượng không giao nhau tại thời điểm t = 0, nhưng chúng sẽ giao nhau ở một
điểm sau đó, ta cần sử đổi thuật toán để quá trình kiểm tra giao nhau nếu phát hiện giao nahu
thì sẽ cung cấp thời điểm va chạm đầu tiên. Lân va chạm đầu tiên sẽ phải nằm khoảng thời
gian giới hạn lớn nhất là T
max
> 0, trong khoảng thời gian này tối thiểu phải tìm thấy một trục
phân tách với mọi 0 ≤ t < T nhưng không tồn tại một trục phân tách nào ở thời điểm T.
b. Tìm điểm va chạm
Nếu T là thời điểm xảy ra lần va chạm đầu tiên, vấn đề hiện tại là phải tìm ra một điểm
P là điểm giao của 2 OBB vào thời điểm đó. Ta cần giải phương trình sau:
∑∑
==
+=
2
0
2
0 j
jj
i
ii
ByDAx
(3)
Trong đó:
)()(
0011
VTCVTCD
+−+=
, |x
i
| ≤ a
i
với i = 0,1,2, |y
j
| ≤ b
j
với j = 0,1,2.
Trục
i
A
:
Nếu trục phân tách ở thời điểm T là
i
A
thì sự giao nhau phải xảy ra trên một trong 2
mặt vuông góc với
i
A
.
Nhân vô hướng 2 vế của phương trình (3) với
i
A
ta được:
∑
=
+=
2
0
.
i
jijii
ycDAx
Nếu
0.
>
DA
i
thì
10
. RRDA
i
+=
, 2 khoảng giao nhau ở điểm phía phải của [-R
0
, R
0
]
Nếu
0.
>
DA
i
thì
)(.
10
RRDA
i
+−=
,2 khoảng giao nhau ở điểm phía trái của [-R
0
, R
0
]
Do đó,
)(.
10
RRDA
i
+=
σ
, ở đây
1
=
σ
và :
( )( )
( )
∑
∑∑ ∑
=
== =
−++=
+
+=++=
2
0
2
0
2
0
2
0
10
..0
)(
j
iijijjij
j
jij
j j
ijjijiji
xaycSignbc
yccbaycRRx
σσ
σσ
(4)
Trong đó,
jj
by
≤
và
1)(.
≤
ij
cSign
σ
;
Vậy,
0)(.
≥+
jijj
ycSignb
σ
,
Tương tự,
0.
≥−
ii
xa
σ
, trong trường hợp
ii
ax .
σ
=
Nếu c
ij
≠ 0 thì phương trình (4) thoả mãn khi :
jiji
bcSigny ).(.
σ
−=
Nếu mọi c
ij
= 0 thì phương trình (4) không phụ thuộc vào y
j
. Điều này xảy ra khi khả năng
giao nhau là cạnh - mặt hoặc mặt - mặt.
Nhân vô hướng cả 2 vế của phương trình (3) với
j
B
ta được :
∑
=
+−=
2
0
.
k
kjkjj
cxDBy
Từ |x
k
| ≤ a
k
ta được:
∑∑
==
=+−≤≤−−=
2
0
2
0
)max(....)min(
k
jkkjjjk
k
kjjj
yacDByacDBy
Trang 24
Luận văn tốt nghiệp Nghiên cứu phát hiện va chạm và ứng dụng
Hơn nữa, chúng ta biết rằng |y
j
| ≤ b
j
. Chúng ta phải chọn giá trị của y
j
sao cho:
( ) ( )
[ ] [ ]
jjjjj
bbyyy ,max,min
−∩∈
.
Va chạm xảy ra khi min(y
j
) ≤ b
j
và –b
j
≤ max(y
j
).
Nếu b
j
≤ max(y
j
) thì y
j
= b
j
là một điểm giao.
Nếu –b
j
≥ min(y
j
) thì y
j
= -b
j
là một điểm giao,
Ngược lại, ta sẽ chọn y
j
= min(y
j
) như một điểm giao.
Trục
j
B
:
Nếu trục phân tách ở thời điểm T là
i
B
thì sự giao nhau phải xảy ra ở trên một trong 2 mặt
vuông góc với
i
B
. Nhân vô hướng 2 vế của phương trình (3) với
i
B
ta được:
∑
=
+=
2
0
..
j
iijij
yDBxc
Cũng tương tự như lý luận ở trên ta có :
( )
10
. RRDB
i
+=
σ
với
1
=
σ
, hơn nữa:
( )
( )( )
( )
00
2
0
10
2
0
...0
..
ybxcSignac
ybcayRRxc
jjij
j
ji
iiijji
j
jij
σσ
σσ
++−=
+
+=++=
∑
∑∑
=
=
(5)
Với |x
j
| ≤ a
j
và
( )
1.
≤
ji
cSign
σ
, do vậy
( )
0..
≥−
jjij
xcSigna
σ
Tương tự,
0.
≥+
ii
yb
σ
, trong trường hợp
ii
by .
σ
−=
.
Nếu mọi c
ji
=0 thì tổng ở phương trình trên không phụ thuộc vài x
i
. Chẳng hạn, điều này xảy
ra khi giao nhau ở trường hợp cạnh - mặt hoặc mặt - mặt.
Ta lại nhân 2 vế của phương trình (3) với
A
được:
jk
k
kjj
cyDAx
∑
=
+=
2
0
.
Do |y
k
| ≤ b
k
nên ta có:
)max(..)min(
2
0
2
0
j
k
kjkjj
k
kjkjj
xbcDAxbcDAx
=+≤≤−=
∑∑
==
Thêm nữa ta biết rằng: |x
j
| ≤ a
j
. Do vậy ta phải chọn x
j
sao cho:
[ ] [ ]
jjjjj
aaxxx ,)max(),min(
−∩∈
Sự giao nhau chỉ xảy ra khi : min(x
j
) ≤ a
j
và –a
j
≤ max(x
j
).
Nếu –a
j
≥ min(x
j
) thì x
j
= -a
j
là một điểm giao.
Nếu a
j
≤ max(x
j
) thì x
j
= a
j
là một điểm giao.
Các trường hợp còn lại chúng ta có thể chọn x
j
= min(x
j
) như một điểm giao.
Trục
ji
BxA
:
Các chỉ số (i
o
, i
1
, i
2
) và (j
o
, j
1
, j
2
) là hoán vị của (0, 1, 2) trong tập :
{ (0, 1, 2),(1, 0, 2), (2, 0, 1) }.
Trang 25