-1
我需要一個計算曲面和頂點法線的C#代碼片段。表面類型是三角形3D封閉網格。所需的代碼片段必須能夠使用頂點集和三角形指示符。這些準備就緒可以使用。 3D網格物體的表面不光滑,所以需要平滑。計算曲面和頂點法線的C#代碼片段
你能幫助我嗎?
我需要一個計算曲面和頂點法線的C#代碼片段。表面類型是三角形3D封閉網格。所需的代碼片段必須能夠使用頂點集和三角形指示符。這些準備就緒可以使用。 3D網格物體的表面不光滑,所以需要平滑。計算曲面和頂點法線的C#代碼片段
你能幫助我嗎?
這聽起來像是你試圖顯示你的3D網格並通過插入曲面法線來應用平滑的着色外觀,例如在Phong shading中,你需要首先計算法線。這與平滑網格本身的表面不同,因爲這意味着改變其頂點的位置。
表面法線可通過三角形的兩條邊的getting the vector cross product來計算。
至於代碼,我不知道任何C#示例,但這裏是一個在C++中,應該是很容易地移植。它是從流行NeHe tutorials for OpenGL採取:
void calcNormal(float v[3][3], float out[3]) // Calculates Normal For A Quad Using 3 Points
{
float v1[3],v2[3]; // Vector 1 (x,y,z) & Vector 2 (x,y,z)
static const int x = 0; // Define X Coord
static const int y = 1; // Define Y Coord
static const int z = 2; // Define Z Coord
// Finds The Vector Between 2 Points By Subtracting
// The x,y,z Coordinates From One Point To Another.
// Calculate The Vector From Point 1 To Point 0
v1[x] = v[0][x] - v[1][x]; // Vector 1.x=Vertex[0].x-Vertex[1].x
v1[y] = v[0][y] - v[1][y]; // Vector 1.y=Vertex[0].y-Vertex[1].y
v1[z] = v[0][z] - v[1][z]; // Vector 1.z=Vertex[0].y-Vertex[1].z
// Calculate The Vector From Point 2 To Point 1
v2[x] = v[1][x] - v[2][x]; // Vector 2.x=Vertex[0].x-Vertex[1].x
v2[y] = v[1][y] - v[2][y]; // Vector 2.y=Vertex[0].y-Vertex[1].y
v2[z] = v[1][z] - v[2][z]; // Vector 2.z=Vertex[0].z-Vertex[1].z
// Compute The Cross Product To Give Us A Surface Normal
out[x] = v1[y]*v2[z] - v1[z]*v2[y]; // Cross Product For Y - Z
out[y] = v1[z]*v2[x] - v1[x]*v2[z]; // Cross Product For X - Z
out[z] = v1[x]*v2[y] - v1[y]*v2[x]; // Cross Product For X - Y
ReduceToUnit(out); // Normalize The Vectors
}
的歸一化函數ReduceToUnit()can be found there爲好。
注意,此計算通常爲一個三角形的表面。既然你沒有提供關於你的頂點和索引如何存儲的信息,我將留給你來推導出你需要傳遞給這個函數的一組三角形。
編輯:作爲補充說明,我認爲三角形的「卷繞方向」很重要。以錯誤的方向纏繞會導致法線指向相反的方向。
更具體。你有什麼投入?這是多面體嗎?他們如何定義? – jason 2009-11-27 20:50:51
它是什麼樣的表面?三角網格?格?式?你能發表一些你到目前爲止的代碼嗎? – 2009-11-27 20:51:34
請返回並將您的澄清添加到您原來的問題中,以便每個人都可以輕鬆看到它們。 – bobbymcr 2009-11-27 21:28:32