Houdini 快速點雲連線以及避免重取樣的技巧

2022-07-04 07:45:11 字數 2125 閱讀 5821

今天和挪威的同事討論點雲的vex函式pcunshaded(),結果兩個人都沒搞太明白倒是轉到了另乙個話題,就是點雲取樣製作連線怎樣避免重複計算,這裡做一下記錄。

如果採用嚴格的避免重複連線的方法,我們可以在每個點上增加兩個點屬性,乙個是確定自己是否已經建立連線的判斷屬性,另乙個是儲存連線對應的另一端點的點數,同時使用setattrib()函式在對應點上標記自己的點數。但由於setattrib()的侷限性,這種方法只能從乙個點上生出一根(int or float),三根(vector), 四根(vector4)以及九根(matrix3)這樣的線段數,所以侷限性比較大。

還有一種方法不是非常嚴格的直接避免重複,而是在重複連線之後再刪除overlap的連線,這種方法雖然有計算冗餘,但是卻非常直接而且連線數是可以任意變化的。

houdini在connect adjacent pieces節點中已經實現了這個方法,我從中提取出來稍微做了修改。下圖是將connect adjacent pieces精簡後的樣子:

其中connect_nearby_points的**修改完之後為:

/// creates a new line between the given point numbers.

void createline(int pt_a; int pt_b)

/// returns true if the item is contained in the list.

int contains(string list; string item)

return0;}

int handle = pcopen(0, "p", @p, chf("../searchradius"), chi("../maxsearchpoints"));

int max_connections = chi("../maxconnections");

string other_name;

string known_pieces;

int num_connections =

0;string my_name = s@name;

while (pciterate(handle) && num_connections < max_connections)

}pcclose(handle);

這段**的精妙之處在於可以將點通過name屬性進行分類,比如左手和右手的點進行連線,那麼全在左手上的點之間是絕對不會相互進行連線的。其中 !contains(known_pieces, other_name) 確保了另一端點是不在同乙個name下面的。另外 push(known_pieces, other_name) 決定了該點只會與另乙個name下的所有點只會生成一根連線,好比左手上的乙個點與右手在的乙個點產生連線後就再也不會訪問右手的其他點了,當然這個在我們的這個需求裡面是可有可無的,因為我在事前用點數給每個點取了單獨的名字,所以沒有乙個點在同乙個name下。

最後的技巧就在clean裡面的fix overlaps上,這個確保重複再亮點之間建立的連線都會清理乾淨至一條,其實我廢話了這麼多重點都在這個開關上 :p

補充:經過 機器貓的建議,我嘗試了使用他說的當前點之比較比自己點序號小的或者大的點。結果這個方法非常的靠譜,有點類似堆疊出棧的方法,確實是非常直接了當的避免了重複鏈結,這裡貼上簡易的實驗**。非常短但是沒有了上面**中的通過name來將點分群的功能:

//

get the max connection number

int maxnumber = ch("

maxnumber");

///creates a new line between the given point numbers.

void createline(int pt_a; int

pt_b)

int handle = pcopen(geoself(), "

p", @p, 99

, maxnumber);

while

(pciterate(handle))

}

點雲學習3 兩個點雲連線

include include include intmain int argc,char ar for size t i 0 i cloud b.points.size i std cerr cloud a std endl for size t i 0 i cloud a.points.size...

Halcon快速讀取點雲的方法

直接上 dev update off filename 1.txt 點雲資料的名稱,txt csv asc等格式的都可以 numcolumns 3 如果點雲的每行資料有3個數字就寫3 只有xyz 的資料 count seconds then open file filename,input file...

連線兩個點雲的字段或資料形成新點雲

學習如何連線兩個不同點雲為乙個點雲,進行操作前要確保兩個資料集中欄位的型別相同和維度相等,同時了解如何連線兩個不同點雲的字段 例如顏色 法線 這種操作的強制約束條件是兩個資料集中點的數目必須一樣,例如 點雲a是n個點xyz點,點雲b是n個點的rgb點,則連線兩個字段形成點雲c是n個點xyzrgb型別...