2013-11-27 3 views
1

Я борюсь за вычисление нормалей для каждой из 8 вершин для моего куба в C++. я подумал, что это должно идти, как это: - вычислить нормали для каждого из 6 граней кубы - каждая вершина прикасается 3 лица, поэтому вычисление нормированного вектора для всех 3-х гранейвычисление нормалей для каждой из 8 вершин для моего куба в C++

m_iNoVerts=8; 
Vertex verts[8]; 
verts[0].position = XMFLOAT3(-1.0f, -1.0f, 1.0f); 
verts[1].position = XMFLOAT3(-1.0f, 1.0f, 1.0f); 
verts[2].position = XMFLOAT3(1.0f, -1.0f, 1.0f); 
verts[3].position = XMFLOAT3(1.0f, 1.0f, 1.0f); 
verts[4].position = XMFLOAT3(-1.0f, -1.0f, -1.0f); 
verts[5].position = XMFLOAT3(-1.0f, 1.0f, -1.0f); 
verts[6].position = XMFLOAT3(1.0f, -1.0f, -1.0f); 
verts[7].position = XMFLOAT3(1.0f, 1.0f, -1.0f); 

m_iNoIndices = 36; 
int indices[36] = {0, 1, 2, // front face 0 
        1, 2, 3, 

        4, 5, 6, // back face 1 
        5, 6, 7, 

        4, 5, 0, // left face 2 
        5, 0, 1, 

        2, 3, 6, // right face 3 
        3, 6, 7, 

        1, 5, 3, // top face  4 
        5, 3, 7, 

        0, 4, 2, // bottom face 5 
        4, 2, 6}; 

// Calculate the normals for each face 
XMVECTOR result[6]; // cross product of vec1 and vec2 represents the normal of the face 
XMVECTOR vec1;  // vec1 = B - A example first calc: B = verts[1] and A = verts[0] 
XMVECTOR vec2;  // vec2 = C - B 
int ii = 0; 
for(int i = 0; i < 6; ++i) 
{ 
    vec1.x = verts[indices[ii+1]].position.x - verts[indices[ii]].position.x; 
    vec1.y = verts[indices[ii+1]].position.y - verts[indices[ii]].position.y; 
    vec1.z = verts[indices[ii+1]].position.z - verts[indices[ii]].position.z; 

    vec2.x = verts[indices[ii+2]].position.x - verts[indices[ii+1]].position.x; 
    vec2.y = verts[indices[ii+2]].position.y - verts[indices[ii+1]].position.y; 
    vec2.z = verts[indices[ii+2]].position.z - verts[indices[ii+1]].position.z; 

    // calculate the cross product 
    //result[i].x = (vec1.y * vec2.z) - (vec1.z * vec2.y); 
    //result[i].y = (vec1.z * vec2.x) - (vec1.x * vec2.z); 
    //result[i].z = (vec1.x * vec2.y) - (vec1.y * vec2.x); 
    //result[i].w = 0; 
    result[i] = XMVector3Cross(vec1, vec2); 

    ii += 6; // increasing the counter for the indices to jump to the next face 
} 

// calculating the normals of each vertex 
XMVECTOR normal[8]; 
// building the resulting vector of the 3 sites on each vertex 
normal[0] = result[0] + result[2] + result[5]; 
normal[1] = result[0] + result[2] + result[4]; 
normal[2] = result[0] + result[3] + result[5]; 
normal[3] = result[0] + result[3] + result[4]; 
normal[4] = result[1] + result[2] + result[5]; 
normal[5] = result[1] + result[2] + result[4]; 
normal[6] = result[1] + result[3] + result[5]; 
normal[7] = result[1] + result[3] + result[4]; 

for(int i = 0; i < m_iNoVerts; ++i) 
{ 
    normal[i] = XMVector3Normalize(normal[i]); // normalization of the vector 
    verts[i].normal.x = normal[i].x; 
    verts[i].normal.y = normal[i].y; 
    verts[i].normal.z = normal[i].z; 
} 

когда Я проверяю нормалей в отладчике, значения + -0,577 .. приведенные значения от моего учителя являются

0.0 0.5 0.5 
0.0 0.5 0.5 
0.0 -0.5 0.5 
0.0 -0.5 0.5 
0.0 0.5 -0.5 
0.0 0.5 -0.5 
0.0 -0.5 -0.5 
0.0 -0.5 -0.5 

что вещь я делаю неправильно? Спасибо!

+2

Это странно что нормали вашего учителя не имеют X-компонента. Итак, вершина слева имеет ту же норму, что и вершина справа от нее? Разве они не должны указывать друг на друга, как на 35 градусов? – Kevin

ответ

2

Нормали граней куба просто

[+-1, 0, 0], [0,+-1,0], [0,0,+-1] 
(Left/Right), (Top/Bottom), (Front/Back) 

В 8 нормалей для вершин, если такое понятие имеет смысл, даже более просто vertex - center или vertex это сам в этом случай, потому что центр находится в начале.

Это может быть, конечно, рассчитанная путем сложения 8 линейных комбинаций лица нормалей и нормализацией, давая

[+-1, +-1, +-1]/sqrt(3) 

Но, в сущности, есть не так много, чтобы вычислить ...

+0

это хорошо для системы координат объекта. Но мой куб определен в мировом пространстве. Если бы я повернул все это, нормали поверхности изменились бы, или? – p4si

+0

Нормали соответственно изменятся. Нормалью «вершин» всегда является линия, идущая от центра куба к повернутой вершине угла ==, но имеющая нормализованную величину, которая также является инвариантом вращения. Конечно, ничто не запрещает вам вычислять нормаль, вычисляя перекрестные произведения и усредняя нормали связных граней. –

0
  1. Каждая грань может быть определена только тремя вершинами. У вас есть список из 6, почему?

  2. Если вы сделаете это: vec1 = B - A; vec2 = C - A то в случае куба они будут ортогональны :)

  3. Нормали можно масштабировать на любую константу, они будут по-прежнему нормально. Скорее всего, это означает, что они должны быть единичными векторами. Для этого просто разделите каждую на свою норму (длину вектора). 0,577 - это квадрат (1/3), вероятно. (+ -0,577, + -0,577, + -0,577) являются единичными векторами.

+0

1. У меня есть список из 6 вершин для рисования куба позже. Каждое лицо получило два треугольника. Ах, ладно, теперь я знаю, откуда такое 0,577. Я все еще удивляюсь, почему у моего учителя нет значений x. – p4si