Tam giác thứ nhất có các đỉnh là A0,A1,A2, các cạnh
Pháp tuyến : N =E0xE1
Tam giác thứ hai có các đỉnh là : B0,B1,B2, các cạnh:
Pháp tuyến: M =F0xF1
Việc phát hiện va chạm giữa các tam giác trong môi trường 3D được thực hiện thông qua các trục phân tách (dùng để kiểm tra tam giác không giao nhau). Tập các trục phân tách có thể phụ thuộc vào 2 tam giác có song song với nhau hay không.. Nếu 2 tam giác song song với nhau nhưng không đồng phẳng thì pháp tuyến các pháp tuyến của 2 tam giác sẽ là trục phân tách. Tuy nhiên nếu các tam giác đồng phẳng thì pháp tuyến của một tam giác sẽ là trục phân tách. Tích có hướng của một vector pháp tuyến với một cạnh của tam giác sẽ cho ta trục phân tách có thể có.Tích có hướng giữa các cạnh tam giác cũng cho ta trục phân tách có thể.
Cho 2 tam giác không song song, các trục phân tách có thể có dạng là: A0 +s.L, trong đó L là một trong các trục N,M hoặc EixFj với i=0,1,2 và j=0,1,2. Trường hợp các tam giác đồng phẳng hoặc song song thì L có thể là một trong các thành phần sau
i i NxF E x N N, , với i=0,1,2. Ta đặt: (17) và:
Từ các đại lượng trong (17) và (18) ta có được bảng mô tả các trục phân tách có thể của 2 tam giác không song song là:
Bảng 5: các giá trị của pi và pj để kiểm tra điều kiện không giao nhau của 2 tam giác không đồng phẳng: mini(pi) > maxj(qj) hoặc maxi(pi) < minj(qj).
Bảng các trục phân tách có thể đối với 2 tam giác đồng phẳng được cho trong bảng sau. Các đại lượng trong bảng là:
Với i = 0,1 và j=0,1.
Bảng 6: Các giá trị của pivà qj kiểm tra sự không giao nhau của 2 tam giác đồng phẳng: mini(pi) > maxj(qj) hoặc maxi(pi) < minj(qj)
b. Phát hiện va chạm giữa 2 tam giác không đồng phẳng
Ta chỉ xét trường hợp 2 tam giác không đồng phẳng. Với hệ thống va chạm trong môi trường 3D thì các đối tượng chủ yếu được chia mặt thành các tam giác (ít khi chia thành các đa giác: 4 hoặc nhiều hơn ... các cạnh).
• Tam giác tĩnh
Việc kiểm tra va chạm trong trường hợp này vẫn là xử lý các trục phân tách. Các hệ số trong các phép nhân phức tạp được tính toán một lần và chỉ khi cần thiết. Để kiểm tra các trục phân tách cơ sở ta đi xét các khoảng [mini(pi),maxi(pi)] và [minj(pj),maxj(pj)] . Cuối cùng để kiểm tra xem 2 tam giác có giao nhau hay không ta so sánh các khoảng này.
Xét các trục N hoặc M :
Đây là các pháp tuyến của các tam giác, nên nếu chọn một pháp tuyến làm trục thì hình chiếu của tam giác đó lên trục này sẽ được 1 điểm p duy nhất, tam giác còn lại khi chiếu các đỉnh lên sẽ cho ta 3 điểm q, q + do và q + d1. Điều kiện không giao nhau là :
min(q, q+d0, q+d1) > p hoặc max(q, q+d0, q+d) < p. Thủ tục được cài đặt như sau:
if (q > p) { if (q+d0 > p && q+d1 > p) return no_intersection; } else if (q < p) { if (q+d0 < p && q+d1 < p) return no_intersection; } Xét các trục EixFj:
Mỗi tam giác sẽ chiếu lên trục này sẽ cho ta 2 điểm, tam giác thứ nhất cho 0 và p, tam giác thứ 2 cho q và q+d. Điều kiện kiêm tra không giao nhau là :
min(q, q+do, q+d1) > max{0, p} hoặc: max(q, q+do, q+d1) < min{0, p}
Thủ tục được cài đặt như sau: if (p >= 0) { if ((q < 0 && q+d < 0) || (q > p && q+d > p)) return no_intersection; } else { if ((q > 0 && q+d > 0) || (q < p && q+d < p)) return no_intersection; }
• Trường hợp động - vận tốc không đổi
Trường hợp tam giác tĩnh cần được chỉnh lại để phù hợp với trường hợp tam giác có thành phần vận tốc. Nếu lấy một tam giác làm gốc thì tam giác vận tốc của tam giác còn lại phải được trừ đi độ lớn của tam giác thứ nhất, vì vậy tất cả các trường hợp ta có thể quy về cho một tam giác tĩnh (giả sử là tam giác thứ nhất).
Giả sử vận tốc của các tam giác lần lượt là: V0 và V1, đặt W =V1−V0. Gọi thời điểm ban đầu và kết thúc là t = 0 và t = T.
Xét các trục N hoặc M :
Như đã trình bày ở trên, sẽ tồn tại một tam giác mà khi chiếu lên một trong 2 trục này sẽ cho hình chiếu là một điểm p duy nhất. Tam giác còn lại khi chiếu lên sẽ cho 3 điểm di động q.
Vấn đề của chúng ta ở đây là cần chỉ ra rằng: min(q+t.w, q+do+t.w, q+d1+t.w) > p hoặc: max(q+t.w, q+do+t.w, q+d1+t.w) < p
Với t∈[0,T]. Thủ tục được cài đặt như sau:
if (q > p) { if (d0 >= 0) { if (d1 >= 0) { min = q; if (min+T*w > p) return no_intersection; } else { min = q+d1;
if (min > p && min+T*w > p) return no_intersection; } } else if (d1 <= d0) { min = q+d1;
if (min > p && min+T*w > p) return no_intersection; } else { min = q+d0;
if (min > p && min+T*w > p) return no_intersection; } } else if (q < p) { if (d0 <= 0) { if (d1 <= 0) { max = q; if (max+T*w < p) return no_intersection; } else { max = q+d1;
if (max < p && max+T*w < p) return no_intersection; } } else if (d1 >= d0) { max = q+d1;
if (max < p && max+T*w < p) return no_intersection; }
else {
max = q+d0;
if (max < p && max+T*w < p) return no_intersection; }
}
Xét trục EixFj:
Hình chiếu của tam giác thứ nhất là 0 và p.
Hình chiếu của tam giác thứ hai là q + tw và q + d + tw với t∈[0,T]
Vấn đề của chúng ta là phải chỉ ra được rằng: min(q+tw, q+d+tw) > max(0,p) hoặc: max(q+tw, q+d+tw) < min(0,p) Thủ tục được cài đặt như sau:
if (p >= 0) {
{ if (d <= 0) { max = q; if (max+T*w < 0) return no_intersection; } else { max = q+d;
if (max < 0 && max+T*w < 0) return no_intersection; } } else if (q > p) { if (d >= 0) { min = q; if (min+T*w > p) return no_intersection; } else { min = q+d;
if (min > p && min+T*w > p) return no_intersection; } } } else { if (q > 0) { if (d >= 0) { min = q; if (min+T*w > 0) return no_intersection; } else { min = q+d;
if (min > 0 && min+T*w > 0) return no_intersection; } } else if (q < p) { if (d <= 0) { max = q; if (max+T*w < p) return no_intersection; }
else {
max = q+d;
if (max < p && max+T*w < p) return no_intersection; }
} }
c. Tìm va chạm giữa 2 tam giác không đồng phẳng
• Tìm lần va chạm đầu tiên
Cho 2 tam giác không giao nhau ở thời điểm t = 0, nhưng sẽ giao nhau ở thời điểm nào đó (sau t = 0). Thuật toán của chúng ta cần cung cấp lần va chạm đầu tiên (nếu có). Lần va chạm đầu tiên được tính trong khoảng thời gian lớn nhất là T > 0 trong khoảng thời gian này tồn tại tối thiểu một trục phân tách, nhưng sẽ không tồn tại trục phân tách nào ở thời điểm T.
• Tìm điểm va chạm
Nếu T là lần va chạm đầu tiên, vấn đề của chúng ta là tìm ra được một điểm P là giao điểm của 2 tam giác. Các tam giác không đồng phẳng, khả năng tập giao điểm sẽ là một điểm hoặc một đoạn thẳng giao nhau. Ta cần giải phương trình:
(19) Trong đó:
Với: 0 ≤ x0 ≤ 1, 0 ≤ x1 ≤ 1, x0 + x1 ≤ 1 0 ≤ y0 ≤ 1, 0 ≤ y1 ≤ 1, y0 + y1 ≤ 1 Giải phương trình (19) ta được:
với i = 0,1 và j = 0,1.
Giá trị cực trị của nghiệp phương trình cho ta các khoảng của mỗi biến: [min( i),max( i)]
i x x
x ∈ và yi ∈[min(yi),max(yi)]. Các điểm mút là:
(20)
Xét trục phân tách N :
Nhân vô hướng phương trình (19) với N ta được:
Hình chiếu của các đỉnh của tam giác sẽ cho ta một điểm p có giá trị 0.
Các đỉnh của tam giác thứ 2 sẽ cho ta các điểm q phân biệt {q0,q1,q2} được định nghĩa trong Bảng 5. Có 3 trường hợp:
Trường hợp 1 :
q0 = mini(qi) với σ =1 hoặc q0 = maxi(qi) với σ =−1 Như vậy: 0 .D = N , và: (21) Nếu N.F0 ≠0 và N.F1 ≠0thì y0=0 và y1=1.
Nếu N.F0 =0 và N.F1 ≠0thì y1=0 và không phụ thuộc vào y0. Điểm va chạm sẽ là bất cứ điểm y0 ∈[min(y0),max(y0)] [ ]∩ 0,1 trong đó min(y0) và max(y0) được cho trong phương trình (20).
Nếu N.F0 ≠0 và N.F1 =0phương trình (21) cần y0 = 0 và không phụ thuộc vào y1.
Điểm va chạm sẽ là bất cứ điểm y1∈[min(y1),max(y1)] [ ]∩ 0,1 trong đó min(y1) và max(y1) được cho trong phương trình (20).
Nếu N.F0 =0 và N.F1 =0thì Nvà M phải song song và 2 tam giác phải đồng phẳng. Trong phần này chúng ta đã giả sử rằng 2 vector không song song, như vậy giả thuyết trên là sai. Chúng ta sẽ thảo luận về va chạm giữa 2 tam giác đồng phẳng sau.
Trường hợp 2 :
q1 = mini(qi) với σ =1 hoặc q1 = maxi(qi) với σ =−1 Như vậy:
và:
(20)
Nếu N.F0 ≠0 và N.F1 ≠N.F0 thì y0 + y1 =1 và y0 = 0. Do đó: y0=1 và y1=0.
Nếu N.F0 =0 và N.F1 ≠N.F0 thì phương trình (22) cần y1 = 0 nhưng không phụ thuộc vào y0. Với y0 ∈[min(y0),max(y0)] [ ]∩ 0,1 trong đó min(y0) và max(y0) được cho trong phương trình (20).
Nếu N.F0 ≠0 và N.F1 =N.F0 thì phương trình (22) cho y0 + y1 =1 nhưng không phụ thuộc vào y1. Trong trường hợp này y1∈[min(y1),max(y1)] [ ]∩ 0,1 với min(y1) và max(y1) được cho trong phương trình (20). Nếu ta chọn y1 thì y0=1-y1.
Nếu N.F0 =0 và N.F1 =N.F0thì N và M phải song song, suy ra 2 tam giác đồng phẳng.
Trường hợp 3 :
q2 = mini(qi) với σ =1 hoặc q2 = maxi(qi) với σ =−1 Như vậy:
và:
(23) Nếu N.F0 ≠N.F1 và N.F1 ≠0 thì y0 = 0 và y0+y1=0 do đó: y0=0, y1=1.
Nếu N.F0 ≠N.F1 và N.F1 ≠0 thì y0 = 0 và y0+y1=0 do đó: y0=0, y1=1. Trong trường hợp này y0∈[min(y0),max(y0)] [ ]∩ 0,1 với min(y0) và max(y0) được cho trong (20). Nếu ta chọn y0 thì y1 = 1-y0.
Nếu N.F1 ≠N.F0 và N.F1 =0 thì phương trình (23) cần y0=0 và không phụ thuộc vào y1. Trong trường hợp này: y1∈[min(y1),max(y1)] [ ]∩ 0,1 với min(y1) và max(y1) được cho trong (20).
Nếu N.F0 =N.F1 và N.F1 =0 thì N và M phải song song, suy ra 2 tam giác đồng phẳng.
Xét các trục M :
Nhân vô hướng phương trình (19) với M ta được:
Các đỉnh của tam giác thứ nhất chiếu lên trục này sẽ cho các điểm p phân biệt {p0,p1,p2}. Các đỉnh của tam giác thứ 2 khi chiếu lên trục này sẽ cho giá trị q, q0 được cho trong Bảng 5. Có 3 trường hợp xảy ra:
Trường hợp 1 :
p0 = mini(pi) với σ =−1 hoặc p0 = maxi(pi) với σ =1 Như vậy: 0 .D = M và: (24)
Nếu M.E0 ≠0 và M.E1 ≠0 thì x0=0 và x1=0.
Nếu M.E0 =0 và M.E1 ≠0 thì phương trình (24) cần x1=0 và không phụ thuộc vào x0. Điểm giao được cho bởi x0 bất kì sao cho x0∈[min(x0),max(x0)] [ ]∩ 0,1 với min(x0) và max(x0) được cho trong (20).
Nếu M.E0 ≠0 và M.E1 =0thì phương trình (24) cần x0=0 và không phụ thuộc vào x1. Điểm giao là x1 bất kì sao cho x1∈[min(x1),max(x1)] [ ]∩ 0,1 với min(x1) và max(x1) được cho trong phương trình (20).
Nếu M.E0 =0 và M.E1 =0 thì M và N phải song song dẫn đến 2 tam giác đồng phẳng (không xét).
Trường hợp 2 :
p1 = mini(pi) với σ =−1 hoặc p1 = maxi(pi) với σ =1 Như vậy:
và:
(25) Nếu M.E0 ≠0 và M.E1 ≠M.E0 thì x0 + x1 = 1 và x1 = 0. Do đó: x1=0 và x0=1.
Nếu M.E0 =0 và M.E1 ≠M.E0 thì phương trình (25) cần x1 = 0 và không phụ thuộc vào x0. Trong trường hợp này x0 ∈[min(x0),max(x0)] [ ]∩ 0,1 với min(x0) và max(x0) được cho trong (20).
Nếu M.E0 ≠0 và M.E1 =M.E0 thì phương trình (25) cần x0+x1=1 và không phụ thuộc vào x1. Trong trường hợp này x1∈[min(x1),max(x1)] [ ]∩ 0,1 với min(x1) và max(x1) được cho trong (20). Chọn một điểm x1 thì x0 = 1-x1.
Nếu M.E0 =0 và M.E1 =M.E0 thì N và M song song với nhau , do đó 2 tam giác đồng phẳng.
Trường hợp 3 :
p2 = mini(pi) với σ =−1 hoặc p2 = maxi(pi) với σ =1 Như vậy:
và:
(26) Nếu M.E1 ≠0 và M.E1 ≠M.E0 thì x0 + x1 = 1 và x0 = 0. Do đó: x1=1 và x0=0.
Nếu M.E1 ≠0 và M.E1 =M.E0 thì phương trình (25) cần x0+x1=1 và không phụ thuộc vào x0. Trong trường hợp này x0 ∈[min(x0),max(x0)] [ ]∩ 0,1 với min(x0) và max(x0) được cho trong (20). Chọn một điểm x0 thì x1 = 1-x0.
Nếu M.E1 =0 và M.E1 ≠M.E0 thì phương trình (25) cần x0 = 0 và không phụ thuộc vào x1. Trong trường hợp này x1∈[min(x1),max(x1)] [ ]∩ 0,1 với min(x1) và max(x1) được cho trong (20).
Nếu M.E1 =0 và M.E1 =M.E0 thì N và M song song với nhau , do đó 2 tam giác đồng phẳng.
Xét các trục EixFj:
Cho (i0,i1,i2) và (j0,j1,j2) là các hoán vị của (0,1,2) trong tập {(0,1,2),(1,0,2),(2,1,0)}. Các hàm α,β,γ,δ được định nghĩa trong phần phát hiện va chạm giữa OBB và tam giác.
Nhân vô hướng phương trình (19) với EixFj ta được:
Sau khi rút gọn phương trình trên ta được:
(27) Chiếu các đỉnh của tam giác thứ nhất lên trục này ta được 2 giá trị p phân biệt là:
p0 = 0
Chiếu các đỉnh của tam giác thứ 2 lên trục này ta được 2 giá trị q phân biệt là:
Có 4 trường hợp xảy ra tuỳ thuộc vào hình chiếu có giá trị lớn nhất hoặc nhỏ nhất. Trong mỗi trường hợp ta sẽ đưa ra giải pháp để tìm được điểm va chạm duy nhất.
Nhân vô hướng phương trình (19) với M và N ta được:
(28) Trường hợp 1 :
min(q)=q0 và max(p)=0 với σ =1 hoặc max (q)=q0 và min(p)=0 với σ =−1 Như vậy:
Phương trình (27) tương đương với phương trình sau:
Phương trình (28) sẽ cho nghiệm duy nhất x0,x1,y0 và y1. Trường hợp 2 :
min(q)=q0 và với σ =1
hoặc max(q)=q0 và với σ =−1
Như vậy: và
Phương trình (27) tương đương với phương trình sau:
Nếu N.Fjo ≠0 và M.Eio ≠0 thì ta phải có:
Với điều kiện như trên thì phương trình (28) sẽ cho nghiệm duy nhất x0, x1, y0 và y1. Trường hợp 3 :
và max(p) = 0 với σ =1
hoặc và min(p) = 0 với σ =−1
Như vậy:
Phương trình (27) tương đương với phương trình sau:
Nếu N.Fjo ≠0 và M.Eio ≠0 thì :
Với điều kiện như trên thì phương trình (28) sẽ cho duy nhất nghiệm x0, x1, y0 và y1. Trường hợp 4 :
và với σ =1
hoặc max(q) = và vớiσ =−1
Như vậy:
Nếu N.Fjo ≠0 và M.Eio ≠0 thì :
Bảng sau sẽ tổng kết các hệ số trong các trường hợp để cho ra điểm va chạm duy nhất:
Chương 3:
PHẦN THỰC NGHIỆM
Phần thực nghiệm mô phỏng một tình huống trong thực tế đó là va chạm giữa 2 ôtô.
1.Bài toán :
Tình huống được đặt ra là có 2 ôtô đang chuyển động trên 2 xa lộ vuông góc với nhau, hợp với nhau một góc 90o. Xe thứ nhất phóng với tốc độ cao và xe thứ 2 phóng với tốc độ trung bình. Khi đến đoạn đường giao nhau do xe 1 không giảm tốc độ nên đã đâm vào xe 2. Phần thực nghiệm sẽ phát hiện (cài đặt) được va chạm và xử lý hậu va chạm để mô phỏng được tình huống đã đặt ra ở trên.
2. Hướng giải quyết
Ta sẽ sử dụng hộp bao OBB để bao lấy mỗi xe và xử lý trên các hộp bao OBB này. Ta sẽ chiếu hộp bao này lên mặt phẳng chính là mặt đường và việc phát hiện sự va chạm giữa 2 ôtô chính là phát việc phát hiện giao nhau giữa 2 hình chiếu này. Ta chưa cần chiếu lên pháp tuyến của mặt đường vì trong quá trình chuyển động, 2 ôtô luôn luôn chuyển động trên cùng một mặt phẳng (chính là mặt đường).
Việc xử lý hậu va chạm: dùng các định luật 2 và 3 của Newton, phương trình Euler và định lý về momen. Các lực tác dụng lên các vị trí khác nhau của ôtô thì sẽ gây ra tình huống va chạm (hay kết quả) khác nhau. Dưới đây là một số khung cảnh của vụ va chạm và tình huống va chạm được xử lý…
KẾT LUẬN
Sau một thời gian tìm hiểu, nghiên cứu về việc phát hiện và xử lý va chạm trong thực tế để mô phỏng vào máy tính, tôi thấy rằng đây là một lĩnh vực rất khó nhưng nếu được quan tâm, phát triển nó sẽ giải quyết được rất nhiều vấn đề của thực tiễn và khoa học.
Việc nghiên cứu các vấn đề về phát hiện va chạm trên thế giới hiện nay đã tiến được một bước xa và đã thu được rất nhiều thành tựu vô cùng khả quan. Ở Việt Nam hiện nay vấn