3D模型三角麵片相交檢測

2021-08-21 01:25:08 字數 1268 閱讀 4606

是做的一些測試結果(相交面為紅色標記的三角面)

對空間中三角面的相交檢測,基本思路是怎樣確定,兩個空間三角形,各個頂點間的關係。為了找到切入點,將問題轉述為三角形與包含另乙個********所在的平面之間的關係。

要判斷三角形與平面的關係,可以通過頂點與平面的關係來區分不同的情況,分別進行處理。

給定空間四個點:a(ax,ay,az),b=(bx,by,bz),c=(cx,cy,cz),d=(dx,dy,dz),定義行列式如下:

//線性變換

通過計算行列式的值來判斷點與面的關係,行列式的值》0是在平面法向正方向的一側,<0在平面的另一側,=0則表示在平面上。

如此通過計算三頂點與平面的位置關係可以將空間中三角形與平面的關係粗分為三種,在平面上(行列式的值全 > 0),在平面下(行列式的值全 < 0),與平面有關聯(行列式的值有異號)。

//思維導圖

這樣可以知道兩三角面相交,只在滿足「與平面有關聯」的條件下。

在「有關聯的條件下」,又存在「分居兩側」、「一點在面上」、「與平面重合(同一平面)」、「一邊在面上的情況」(這裡我們暫且先把一邊在面上的情況歸併到分居兩側的情況)。

一、針對「一點在面上」的情況,進行點在三角形內的判斷(包含點在邊上,點與頂點重合的情況(對3d模型上三角面的處理,要對這兩種情況給出處理方法))

給出兩種方法處理判斷「點在三角形內」的情況

1.同向法(點與三邊的關係)

2.重心法(向量法)

具體參考:這裡

二、針對「同一平面」的情況,進行線段相交的檢測,及完全重合情況的處理

空間中線段相交的處理,與平面上的線段相交處理沒有關係。

1、做三個座標面的投影,利用叉積去進行判斷

2、可以進行座標的仿射變換代替針對要做座標面的投影,即平面的旋轉(沒有實現,有經驗的話,望聯絡)

上面簡述了,空間中任意兩個三角面的相交判定,針對3d模型並未涉及。因為3d模型中面與面間存在的大量相鄰關係。就要針對這些情況寫出處理方法。

首先針對「一點在面上」的情況,討論了點在邊上,點與其中的乙個頂點重合的情況。這兩種情況應做return nonintersect;其他的都是一些細節編碼。

框選三角麵片並改變顏色

cellrubberbandpick.cpp 定義控制台應用程式的入口點。include stdafx.h include vtkpolydatareader.h include vtksmoothpolydatafilter.h include vtkpolydatanormals.h inclu...

3D空間中射線與三角形的交叉檢測演算法

射線ray,在3d圖形學中有很多重要的應用。比如,pick操作就是使用射線ray來實現的,還有諸如子彈射線的碰撞檢測等等都可以使用射線ray來完成。所以,在本次部落格中,將會簡單的像大家介紹下,如何進行ray 的交叉檢測。在tomas moller的mt97 中,提出了一種新的演算法。這種演算法能夠...

3D空間中射線與三角形的交叉檢測演算法

射線ray,在3d圖形學中有非常多重要的應用。比方,pick操作就是使用射線ray來實現的,還有諸如子彈射線的碰撞檢測等等都能夠使用射線ray來完畢。所以,在本次部落格中,將會簡單的像大家介紹下。怎樣進行ray 的交叉檢測。在tomas moller的mt97 中,提出了一種新的演算法。這樣的演算法...