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
Trang 1MỤC LỤC
1.1 Môi trường thực tại ảo (Virtual Reality) 3
1.2 Tầm quan trọng của việc tìm hiểu phát hiện va chạm trong VR 4
1.3 Một số khái niệm cơ bản 4
1.3.1 Khối bao (Bounding volumes) 4
1.3.2 Xây dựng các khối bao cơ sở 8
Chương 2 :CÁC PHƯƠNG PHÁP PHÁT HIỆN VA CHẠM 11 2.1 Phương pháp dùng bao cầu - Bounding Sphere 11
2.1.1 Phát hiện va chạm 11
2.1.2 Xử lý va chạm 16
2.2 Kỹ thuật sử dụng hộp bao phát hiện va chạm 19
2.2.1 Sự phân tách giữa các OBB 20
2.2.2 Kiểm tra sự va chạm giữa các OBB 22
2.2.3 Tìm va chạm giữa 2 OBBs 23
2.3 Phương pháp Elipsoid 27
2.3.1 Không gian vector và sự tịnh tiến các vật thể trong không gian 27
2.3.2 Phát hiện va chạm 29
2.3.3 Xử lý va chạm 35
2.4 Phát hiện va chạm giữa các đối tượng cơ sở 41
2.4.1 Phát hiện va chạm giữa hộp bao và tam giác (Box – Triangle) 41
2.4.2 Phát hiện va chạm giữa 2 tam giác (Triangle-Triangle) 52
Trang 2MỞ ĐẦ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, conngườ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ậthoặ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ườnghợ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ẳnghạ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ữngvấ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ênthự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ạmnà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 đốitượ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 vachạ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 quankhi 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ìnhcủ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ạmThế 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ỏithiế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 3Chươ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ạmnà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ớicá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
Cp O x O x R3 với mọi đối tượng o1,o2 và cho biết các điểm va chạm giữa chúng
p1,2 R3
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 đốitượ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 vachạ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ểnthô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 theotrong 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ácvớ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ậttrong 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ácvà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ôitrưở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 4tươ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 (đaphầ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ùngcá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 trongmộ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ốcphò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ảitrí 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ấtnhiề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ôitrườ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ũngphả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ươngphá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ôitrườ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 đốitượ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ấtphứ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ầnlớ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àmgiả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 địnhbởi tâm và bán kính
Trang 5Hì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(xc, yc, zc) 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
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
Trang 6giữa 2 Bounding Sphere
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 (xmax, ymax, zmax) và nhỏ nhất (xmin, ymin, zmin) Loại BV nàyrấ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
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
Trang 7Sự 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 baotrụ (bounding cylinder)
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ậtthể 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 đồ)
Trang 81.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 baoAABB 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ậtthể) 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à : pk , qk , rk
Diện tích của mỗi tam giác là ak , vậy ta có tổng diện tích là :
Gọi trọng tâm của tam giác thứ i là mi = (pi + qi + ri)/3
Trọng tâm của đa diện lồi mH được cho bởi công thức sau;
1 n 10
k k k H
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 địnhhướng cho 8 cạnh của OBB là:
k
j k i k j k i k j k i k j k i k k H
a c
0
, , , , , , , ,
121
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 9Với phương pháp này thì hạn chế được khoảng không gian trống hơn phương pháptrê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ôngphả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ớitấ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 Vmax 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 Vmin 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 Vmin, Vmax 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 Vmax - Vmin
Bước 5 : Chọn bán kính của khối cầu bằng một nửa độ dài vector Vmax - Vmin
Trang 10Bướ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ầumộ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 11 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ậtphá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ạikiể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 (N2-N)/2 bướckiểm tra - O(N2) 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ụngcá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 đếncá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ơnthì đô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àonhau 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ảiquyế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 chotấ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 theotia (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
Trang 12một đ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ómlạ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ácgiá 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 R3 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 R3 tachỉ 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 vectorphá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ặtphẳ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à tathườ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
Trang 13(Xn dot RayStart)+ t * (Xn dot Raydirection) = d
Giải phương trình với ẩn t ta có :
on Raydirecti dot
Xn
RayStart dot
Xn - d
t
Thay d vào ta được :
on Raydirecti dot
Xn
RayStart dot
Xn NE PointOnPLA dot
Xn
Cuối cùng:
on Raydirecti dot
Xn
RayStart) -
ANE (PointOnPL dot
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 songsong 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;
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ạmgiữ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 14nế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ầugiao 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ắcchắ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ớiball 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ờigian Đố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 đượcphươ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ôngthể 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ờigian (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 dichuyể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 đượctì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áclà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ậychú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 vachạ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 15TVector 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++)
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;
} } }
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 vachạ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ểnkhố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ụctì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ếukhoả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 vachạ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ươngtrì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à:
Trang 16Tc = Dsc * T / Dst
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ốitrụ) 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ácthuậ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ụngcá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 haymộ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ợpvớ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ạmhợ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 tabiểu diễn tốc độ và hướng chuyển động Vì thế nó sẽ không được đưa vào phương trìnhtrê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ạ:
Trang 17b 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 độngGiả sử 2 khối cầu có Vector vận tốc ngày trước thời điểm va chạm là U1 và U2 (hìnhvẽ) Ta sẽ phân tích các vector vận tốc U1, U2 thành các vector thành phần tại thời điểmxảy ra va chạm X_Axis là Vector nối tâm của 2 khối cầu
U1x và U2x là hình chiếu của vector vận tốc U1, U2 lên Vector X_Axis
U1y và U2y là hình chiếu của vector vận tốc U1, U2 lên trục vuông góc vớiX_Axis
M1 và M2 là trọng lượng của 2 khối cầu này V1, V2 là vận tốc mới sau khi xảy
1 1 2 2 2 1 1 2
2 1
2 2
1 2 2 1 1 1
)(
M M
M U U M U M U V
M M
M U U M U M U V
x x x
x x
x x x
x x
Trang 18Dướ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:
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 19Như 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àntoà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 đốitượ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 R3, nếu 2 hộp bao giao nhau thì hình chiếu của chúng trêncá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ỉ khihì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 R3
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ục2
x A x
i i
Trang 20trong đó: i 1 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 C0 , các trục A0 ,A1 ,A2 và các khoảng a0, a1, a2 OBB thứ hai
có tâm C1, các trục B0 ,B1 ,B2 và các khoảng b0, b1, b2 Các trục phân tách 2 hộp bao cóthể có dạng sau C0 s L trong đó L là một trong các thành phần Ai,Bj hoặc Ai x Bj
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 C0 s L theo C0 là: L
L L
C P
Khoảng cách từ đường gốc C0 tới hình chiếu là : ProjDist(P) =
L L
C P L
.Pr
i
i i i i
i i i
L L
A L a A
a C
A L A L Sign a
.Pr
i
i i i i
i i i
L L
B L a L
L
D L A a C
Độ dài ngắn nhất gồm tất cả 8 khoảng hình chiếu có tâm K1 L.Dvà bán kính:
L L
B L B L Sign b
2 0
i
i i
a D
D L
Trang 21 đ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:
2 2 1
1 A c A c
A c
1B c B c
B c
Trang 22Bảng 1:Bảng các giá trị của R, Ro,R1 để kiểm tra điều kiện 2 OBB không giao nhau:
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ủaOBB thứ nhất
Nếu vận tốc của các OBB lần lượt là Vo và V1, đặt WV1Vo Gọi thời gian banđầu và kết thúc quá trình là t = 0 và t = T Đặt D(t) C1 C0 tW với t [ T0 , ]
Giả sử trục phân tách có dạng C0 s L Các đại lượng R0 và R1 độ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) > R0 + R1 với t [ T0 , ] Do vận tốc dài (hay vận tốctuyến tính) nên ta chỉ cần chỉ ra điều kiện không giao nhau sẽ là R(0) > R0 + R1,R(T)>R0+R1 và Sign(L.D0) Sign(L.D1)
Trang 23Bảng 1': bảng các giá trị của R, Ro, R1 để kiểm tra điều kiện không giao nhau theo
hướng chuyển động của 2 OBB: R > R0 + R1
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ị truenế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êmnà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ánhơ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 đốitượng chuyển động thì phải khởi tạo ban đầu không giao nhau và kiểm tra giao nhau trongsuố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 songhoặ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 -
Trang 24cạ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.
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ệngiao 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ằmkhoảng thời gian giới hạn lớn nhất là Tmax > 0, trong khoảng thời gian này tối thiểu phải tìmthấ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
0
0
)(
j
i i j ij j
ij
j j ij
ij j i
j ij i
x a y c Sign b
c
y c c
b a
y c R
R x
Tương tự, a i x i 0, trong trường hợp x i a i
Nếu cij ≠ 0 thì phương trình (4) thoả mãn khi :y i Sign(c ij).b j
Nếu mọi cij = 0 thì phương trình (4) không phụ thuộc vào yj Điều này xảy ra khi khả nănggiao 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 Bj ta được :
Từ |xk| ≤ ak ta được:
Trang 25
)min(
j j
Va chạm xảy ra khi min(yj) ≤ bj và –bj ≤ max(yj)
Nếu bj ≤ max(yj) thì yj = bj là một điểm giao
Nếu –bj ≥ min(yj) thì yj = -bj là một điểm giao,
Ngược lại, ta sẽ chọn yj = min(yj) như một điểm giao
j
i i
0
.
0
.
y b x c Sign a
c
y b c a y
R R x
c
j ji j
j ji
i i ij j i
Với |xj| ≤ aj và Signc ji 1, do vậy a j .Sign c ji .x j 0
Tương tự, b i y i 0, trong trường hợp y i b i
Nếu mọi cji =0 thì tổng ở phương trình trên không phụ thuộc vài xi Chẳng hạn, điều nàyxả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 k j
Sự giao nhau chỉ xảy ra khi : min(xj) ≤ aj và –aj ≤ max(xj)
Nếu –aj ≥ min(xj) thì xj = -aj là một điểm giao
Nếu aj ≤ max(xj) thì xj = aj là một điểm giao
Các trường hợp còn lại chúng ta có thể chọn xj = min(xj) như một điểm giao
Trục Ai x Bj:
Trang 26Các chỉ số (io, i1, i2) và (jo, j1, j2) là hoán vị của (0, 1, 2) trong tập :
2
1
2 2
1 1
2 2
1 1
,
,
.
.
.
,
,
.
.
.
.
.
j ioj j
ioj o
j j i j j i i jo i i
jo
i
i jo i o i
jo i
o
j jo io j j jo io j jo
io i
jo io i i jo
io
i
y c j j Sign y
c j j Sign b
c b c a c a
c
x c i i Sign x
Ở đây: 1 Chuyển về một vế, sau khi nhóm các số hạng lại với nhau ta được:
Như đã nói ở phần trước, khi cij ≠ 0 thì tất cả các số nhân với |cij| phải bằng 0 để thỏa mãnphương trình trên
Trường hợp đầu tiên là : ci2jo ≠ 0, ci1jo ≠ 0, cioj2 ≠ 0 và cioj1 ≠ 0 thì:
Để giải tìm xio và yjo, ta nhân vô hướng 2 vế của phương trình (3) với Aio và Bjo ta được:
Sau khi thay các giá trị cần thiết vào ta được kết quả là:
Mẫu số của phân số trên khác không khi: 1 2 0
2 2 1 2
c iojo c i jo c i jo , suy ra c i1jo 0và c i2jo 0
Về phương diện hình học, các số cij phải bằng 0 trong trường hợp:
(1) va chạm cạnh - cạnh và điểm giao là duy nhất hoặc
(2) va chạm cạnh - cạnh trong đó các cạnh thực sự sắp thẳng hàng
Những khả năng cần thiết để sinh ra điểm giao duy nhất được tổng kết lại trong bảng sau:
Trang 27Bảng 2: các khả năng cho giao điểm duy nhất giữa 2 OBB
2.3 Phương pháp Elipsoid
2.3.1 Không gian vector và sự tịnh tiến các vật thể trong không gian
Thuật toán sử dụng phương pháp Elipsoid sau đây thiên về việc sử dụng khônggian vector không phải thuộc dạng chuẩn để làm đơn giản hoá việc tính toán Chúng ta sẽ
đi tìm hiểu sơ qua cách chuyển từ một không gian vector này sang không gian vector khác
Phần lớn chúng ta chưa từng bắt gặp bấ kì không gian vector nào khác 2 loại khônggian mà chúng ta đã học ở trường và sử dụng rất nhiều đó là không gian 2 và 3 chiều hay
R2 và R3 Những không gian này được dùng trong hệ toạ độ chuẩn Chúng ta cũng dễ dàngđịnh nghĩa các không gian có số chiều lớn hơn (4 , 5 hoặc vô hạn) bằng cách đưa ra cácluật mà tất cả các vector trong không gian đó phải tuân theo Tất nhiên R2 và R3 cũng phảituân theo
Tất nhiên chúng ta cũng khó có thể tưởng tượng loại không gian có số chiếu lớnhơn 3 và rõ ràng đây là một thách thức rất lớn khi chúng ta phải làm việc với các loạikhông gian vector như vậy Tuy nhiên trong phần này chúng ta cũng chỉ sử dụng khônggian 3 chiều mà thôi
Sau đây sẽ đưa ra các luật mà một không gian vector đều phải theo:
Thỏa mãn luật cộng và nhân Có nghĩa là cho 2 vector X, Y thuộc không gianvector đang xét thì Z = X + Y cũng thuộc không gian đó Cho một số thực r, nếu Xnằm trong không gian thì r*X cũng thuộc không gian đó
Tồn tại vector không V0 sao cho với mọi vector X trong không gian đó thì
V0+X=X Với mọi vector X thì X*0 = V0
Trang 28 Nó phải thoả mãn các phép toán học chuẩn như : luật kết hợp và luật giao hoán.Khái niệm về tổ hợp tuyến tính của các vector trong một không gian vector: đó làmột vector nhận được khi ta tổ hợp các vector trong không gian vector bởi các phép cộng
và phép nhân với một số vô hướng Ví dụ, nếu bạn có các Vector X, Y ,Z và phép tổ hợpđược thực hiện như sau:
Tất cả các Vector trong không gian vector là tổ hợp tuyến tính của các vector cơ sở
Mỗi vector cơ sở không thể được tạo thành bằng cách tổ hợp các vector còn lạitrong cơ sở đó
Số lượng các vector cần thiết để tạo nên cơ sở cho không gian vector đó bằng với
số chiều của không gian đó
R3 là một không gian Vector và cơ sở của nó là:
e1 = (1,0,0)
e2 = (0,1,0)
e3 = (0,0,1)Toạ độ của một điểm trong không gian vector chính là các thành phần vô hướngtrong phép nhân với các vector cơ sở trong phép tổ hợp tuyến tính Ví dụ, ta có điểm v
=(5,2,4), ta có thể phân tích thành như sau:
v = 5*e1 + 2*e2 + 4*e3 (OK)
Đi thẳng vào vấn đề chính của chúng ta đó là làm thể nào để tạo ra được một khônggian vector (ta sẽ tạo không gian Elipsoid) Chúng ta sẽ bắt đầu đi từ cơ sở của không gian
đó (và đó cũng là đủ để định nghĩa không gian vector) Nếu như một ellipsoid được địnhnghĩa bởi vector các bán kính là (x,y,z) thì chúng ta sẽ chọn cơ sở của không gian đó là:
v1 = (x,0,0) v2 = (0,y,0) v3 = (0,0,y)Trong không gian ellipsoid này thì bán kính của ellipsoid sẽ là (1,1,1) Vấn đề cuốicùng của chúng ta là làm thế nào để chuyển được một điểm từ không gian R3 vào khônggian mới (không gian Ellipsoid) Chúng ta sẽ sử dụng cơ sở ở trên để thực hiện việc này(thông qua phép tổ hợp tuyến tính):
3 2
1
1 1*v 0 *v 0 *v x
3 2
1
2 0 * 1*v 0 *v
y v
3 2
1
3 0 * 0 * 1*v
z v v
Từ đó ta có được ma trận chuyển là :
Trang 292.3.2 Phát hiện va chạm
Ý tưởng của thuật toán là mô phỏng đối tượng trong thế
giới thực bởi Ellipsoid (hình bao Ellipsoid) Ellipsoid này được
định nghĩa bởi tâm và bán kính của nó theo 3 trục tọa độ Ví dụ
như hình sau:
Vị trí của tâm Ellipsoid được ta coi như là vị trí của đối
tượng… Ta di chuyển đối tượng bằng cách tác dụng lực lên đối
tượng theo một hướng nào đó Hướng này được biểu diễn bởi
vector vận tốc Vị trí mới của Ellipsoid sau khi di chuyên được
tính bằng cách cộng vị trí hiện tại với vector vận tốc
Giả sử thế giới ta giả lập được tạo bởi các tam giác
(phân chia bề mặt vật thể hay mặt nền bởi các tam giác) Chúng ta không thể biết được chính xác là Ellipsoid trong lúc di chuyển sẽ va chạm chính xác vào tam giác nào Chính vìvậy ta sẽ phải kiểm tra tất cả các tam giác đó (ta cũng có thể chia các vật thể thành các đơn
vị nhỏ hơn) Kiểm tra tất cả các khả năng va chạm nếu có Nếu phát hiện có một va chạm xảy ra (với một tam giác nào đó) thì ta không được dừng lại mà phải kiểm tra với các tam giác khác để tìm ra va chạm xảy ra gần nhất
Hình vẽ sau mô tả hiện tượng xảy ra khi ta tìm thấy một va chạm với tam giác A vàkhông kiểm tra các tam giác còn lại (bao gồm tam giác B – cũng va chạm với Ellipsoid):
Để làm giảm độ phức tạp của vấn đề ta sẽ chuyển tất cả
các đối tượng vào trong không gian mới của chúng ta – không
gian Ellipsoid Trong không gian này thì Ellipsoid thực sự là
hình cầu đơn vị Thao ta và tính toán trên hình cầu tất nhiên là
dễ dàng hơn rất nhiều (chỉ có bán kính và không bị ảnh hưởng
bởi phép quay quanh trục đi qua tâm)
Tiếp theo chúng ta sẽ kiểm tra tất cả các mặt (tam giác) Thủ tục kiểm tra mỗi mặt
có thể được chia làm 5 bước nhỏ như sau:
1 Tính mặt phẳng chứa tam giác
2 Tính điểm giao trên hình cầu khi chúng sẽ va chạm với mặt phẳng
3 Tính điểm giao trên mặt phẳng khi hình cầu va chạm với mặt phẳng
4 Tính toán nếu điểm va chạm trên mặt phẳng nằm trong tam giác Nếu không ta phảitính lại điểm va chạm thực sự
5 Nếu xảy ra khả năng điểm giao không thực sự và khoảng cách tới điểm giao nhỏ hơn hoặc bằng độ lớn của khoảng cách mà chúng ta muốn di chuyển đối tượng, chúng ta sẽ kiểm tra điểm va chạm gần nhất có thể Lưu thông tin va chạm
Khi thuật toán kết thúc, chúng ta sẽ lưu thông tin về điểm va chạm gần nhất (nếu có), những thông tin này là cần thiết để xử lý phản hồi sau va chạm (response)
Trang 30Khi toàn bộ quá trình phát hiện và xử lý va chạm kết thúc chúng ta sẽ chuyển toàn bộ kết quả vào không gian R3 chuẩn để được kết quả cuối cùng, cập nhật vị trí mới của đối tượng.
Ta sẽ lần lượt thực hiện 5 bước trên:
a Tính mặt phẳng chứa tam giác.
Ta cần nhớ mặt phẳng là vô hạn còn tam giác là một tập con của mặt phẳng đó (tập đóng) Chúng ta định nghĩa một mặt phẳng bởi một điểm gốc và một vector pháp tuyến vuông góc với mọi vector nằm trong mặt phẳng đó Để xác định vector pháp tuyến ta dựa vào 2 vector không song song nằm trong mặt phẳng
Giả sử ta có mặt phẳng chưa tam giác ABC Chọn A làm
gốc và ta có 2 vector không song song được tính bởi công thức:
v1 = B – A
v2 = C – AVector pháp tuyến được tính thông qua tích có hướng của 2
phẳng chứa tam giác
inline D3DVECTOR wedge(D3DVECTOR v1, D3DVECTOR v2) {
D3DVECTOR result;
// Tính tích có hướng của 2 vector v1 và v2
result.x = (v1.y * v2.z) - (v2.y * v1.z);
D3DVECTOR pNormal = wedge(v1,v2);
Chú ý rằng thứ tự của các Vector v1,v2 là rất quan trọng, nó xác định chiều của vectorpháp tuyến Chuẩn hóa vector pháp tuyến (độ dài bằng 1):
inline void normalizeVector(D3DVECTOR& v) {
double len = sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
b Tính điểm va chạm giả định trên hình cầu (cầu đơn vị)
Trong bước này chúng ta sẽ tính trước điểm giao (nằm trên mặt cầu) khi mặt cầu vachạm với tam giác Chúng ta chỉ dựa vào hình cầu và mặt phẳng chứa tam giác Nếu ta sử
Trang 31dụng Ellipsoid thì bước này cũng hơi khó, tuy nhiên ta phải tận dụng không gian Ellipsoid
để làm giảm độ phức tạp của vấn đề Vấn đề hiện tại được mô tả bởi hình sau:
Hình 2.3.2b: Tìm điểm va chạm giả địnhHình vẽ trên có vẻ hơi phức tạp ! Tuy nhiên ý tưởng của nó được thể hiện rất rõ: ta sẽtính điểm giao trên hình cầu trước khi di chuyển hình cầu bằng cách tịnh tính (giả định)mặt phẳng tới làm mặt phẳng tiếp diện với mặt cầu và ta được tiếp điểm chính là giao điểm
sẽ xảy ra va chạm Đường chấm chấm ở trên biểu diễn mặt phẳng tiếp diện khi ta tịnh tiếnmặt phẳng Thuật toán thực hiện việc này rất đơn giản chỉ là:
eIPoint = source – pNormal;
c Tính điểm va chạm giả định nằm trên mặt phẳng
Bước tiếp theo chúng ta sẽ tính điểm giao trên mặt phẳng khi hình cầu di chuyển dọc theo vector vận tốc sẽ va chạm với mặt phẳng tại điểm này Để tìm điểm này thì rất đơn giản, ta chỉ cần kéo một tia từ điểm nằm trên mặt cầu dọc theo vector vận tốc, tia này cắt mặt phẳng tại đầu thì nó chính là điểm giao Còn điểm nằm trên mặt cầu đó là điểm khi ta
vẽ bán kính của mặt cầu song song và ngược chiều với vector pháp tuyến của mặt phẳng Hình vẽ sau sẽ minh hoạ rõ điều này:
Hình 2.3.2c: Tính điểm va chạm giả định
nằm trên mặt phẳngCài đặt như sau:
inline float dot(D3DVECTOR& v1, D3DVECTOR& v2) {
return (v1.x * v2.x + v1.y * v2.y + v1.z * v2.z);
}
double intersectRayPlane(D3DVECTOR rOrigin, D3DVECTOR rVector, D3DVECTOR pOrigin, D3DVECTOR pNormal) {
double d = - (dot(pNormal,pOrigin));
Trang 32double numer = dot(pNormal,rOrigin) + d;
double denom = dot(pNormal,rVector);
if (denom == 0) // không xảy ra va chạm
//nếu pháp tuyến trực giao với vector vận tốc return (-1.0f);
return -(numer / denom);
}
Trong thủ tục trên thì rVector là hướng của tia và vector này phải được chuẩn hoá.Hàm trả về độ dài của tia, tức là khoảng cách từ điểm sẽ va chạm trên hình cầu tới điểm sẽ
va chạm trên mặt phẳng
// kéo tia theo vector vận tốc
distToPlaneIntersection = intersectRayPlane(eIPoint, normalizedVelocity, pOrigin, pNormal); // tính điểm va chạm trên mặt phẳng
pIPoint.x = eIPoint.x + distToPlaneIntersection * normalizedVelocity.x;
pIPoint.y = eIPoint.y + distToPlaneIntersection * normalizedVelocity.y;
pIPoint.z = eIPoint.z + distToPlaneIntersection * normalizedVelocity.z;
eIPoint: điểm va chạm nằm trên Ellipsoid
pIPoint: điểm va chạm nằm trên mặt phẳng
Tuy nhiên, thủ tục nêu trên chưa xét hết tất cả các trường hợp Ta hãy xét trường hợp mặt phẳng cắt mặt cầu như hình dưới, như vậy sẽ có chuyện gì xảy ra Ta thấy rằng điểm
va chạm bây giờ không phải là một điểm mà là một tập các điểm dẫn đến thủ trên sẽ gặp vấn đề
Hình 2.3.2c1: điểm va chạm sẽ là một tập các điểm
Ta phải chọn điểm nằm trên mặt phẳng chính là điểm khi ta vẽ bán kính theo hướngcủa vector pháp tuyến của mặt phẳng, bán kính này giao với mặt phẳng tại điểm nào thìđiểm đó là điểm cần tìm
Ta chỉ phải làm việc này khi mặt phẳng cắt mặt cầu Thủ tục để kiểm tra trường hợpnày là:
DWORD classifyPoint(D3DVECTOR point, D3DVECTOR pO, D3DVECTOR pN) {
D3DVECTOR dir = pO - point;
double d = dot(dir, pN);
if (d<-0.001f)
return PLANE_FRONT;
else
Trang 33Thủ tục quản lý trường hợp này như sau:
DWORD pClass = classifyPoint(eIPoint, pOrigin, pNormal);
// tìm điểm va chạm trên mặt phẳng
if (pClass == PLANE_BACKSIDE) { // Mặt phẳng cắt mặt cầu
// Tìm điểm va chạm bằng cách keo một tia dọc theo pháp tuyến của mặt phẳng
distToPlaneIntersection = intersectRayPlane(eIPoint, pNormal, pOrigin, pNormal); // Tính điểm va chạm trên mặt phẳng
pIPoint.x = eIPoint.x + distToPlaneIntersection * pNormal.x;
pIPoint.y = eIPoint.y + distToPlaneIntersection * pNormal.y;
pIPoint.z = eIPoint.z + distToPlaneIntersection * pNormal.z;
}
Từ lúc này ta không cần quan tâm đến vấn đề là mặt phẳng có cắt mặt cầu hay không
d Tính toán điểm giao thực (nếu có)
Đây là bước mà ta tính được điểm xảy ra va chạm thực sự (nếu có) - điểm mà hình cầu
sẽ va chạm với tam giác Có 2 trường hợp xảy ra: hoặc là điểm va chạm nằm trong tam giác chúng ta đang xét hoặc là nằm ngoài tam giác (thuộc mặt phẳng) - tất nhiên là không tính trường hợp mặt cầu không va chạm với mặt phẳng
Nếu điểm giao trên mặt phẳng nằm trong tam giác thì ta được điểm giao thực sự Nếu không ta rơi vào tình huống là cả điểm giao trên mặt cầu và mặt phẳng đều không đúng và tất nhiên ta phải tính toán lại
Trong trường hợp điểm va chạm với mặt phẳng nằm ngoài tam giác Ta sẽ lấy điểm nằm trên cạnh của tam giác sao cho điểm này nằm gần với điểm va chạm với mặt phẳng nhất Từ điểm này ta sẽ kéo một tia song song với vector vận tốc và cắt mặt cầu tại điểm nào thì điểm đó chính là điểm va chạm thực sự Trong trường hợp tia không cắt hình cầu thì sẽ không có va chạm xảy ra Hình vẽ sau đây sẽ cho thấy rõ ý tưởng của bước này
Hình 2.3.2d: Tính điểm giao thựcNói tóm lại là chúng ta chỉ cần tính toán xem điểm va chạm có nằm trong tam giác haykhông Chắc chắn rằng điểm này nằm trong cùng một mặt phẳng với tam giác Ta sẽ làm