Приветствую. В общем сабж. Допустим имеются все вершины объекта в массиве и еще один массив индексов. Как вычислить нормали для каждой вершины?
Индексов чего? Где-то на GameDev было про это. Нормаль к вершине, вроде, среднее что-то нормалей всех граней прилегающих к вершине.
да ну! все зависит от ваших целей. скажем есть у вас шар из полигонов вычесляя нормаль к полигону а стало быть и плоскости вы при освещении такого шара увидите что это не шар а многоугольник. а вот если вы каждой вершине посчитаете свою нормаль то свет ляжет очень даже красиво. вы это легко можете увидеть в 3дс макс убрав фишечку сглаженные нормали.
asd Дано: 1. Массив вершин, допустим float x,y,z 2. Массив индексов вершин, из которых строится примитивы(треугольники). Например: 0,1,2, 2,3,1 надо: построить массив нормалей к каждой вершине
1. vertices x,y,z 2. face veritces a,b,c 3. normals for each face vertice aX, aY, aZ, bX, bY, bZ, cX, cY, cZ
Rustem в начале находишь нормаль для каждой грани. потом для каждой вершины вычисляешь сумму нормалей тех граней, где присутствует эта вершина. нормируешь вектор - получаешь нормаль для вершины. для шарика можно обойтись точным вычислением
Kozyr__ К сожалению не только шарик А объект любой формы. Конкретно пишу риппер моделей из игр дх7-9, и опенгл Возникла проблема что не у всех заданы нормали, а для конвертации в obj они необходимы
Rustem лови алгоритм выдрал его из своих старых кодов думаю все вполне понятно это не сглаженная нормаль! тоесть нормаль для плоскости вы ее можете положить для каждого фейс вертекса. Код (Text): ; AB mov eax, d_w_p [ebx.EDGE_FACES_VERTEX_A] mov edx, d_w_p [ebx.EDGE_FACES_VERTEX_B] fld d_w_p [esi.edx.PrimitiveVerticeCoord_X] fsub d_w_p [esi.eax.PrimitiveVerticeCoord_X] fst d_w_p [@CE_AB.offs_X] fmul st(00), st(00) fld d_w_p [esi.edx.PrimitiveVerticeCoord_Y] fsub d_w_p [esi.eax.PrimitiveVerticeCoord_Y] fst d_w_p [@CE_AB.offs_Y] fmul st(00), st(00) faddp st(01), st(00) fld d_w_p [esi.edx.PrimitiveVerticeCoord_Z] fsub d_w_p [esi.eax.PrimitiveVerticeCoord_Z] fst d_w_p [@CE_AB.offs_Z] fmul st(00), st(00) faddp st(01), st(00) fsqrt fld d_w_p [@CE_AB.offs_X] fdiv st(00), st(01) fstp d_w_p [@CE_oAB.offs_X] fld d_w_p [@CE_AB.offs_Y] fdiv st(00), st(01) fstp d_w_p [@CE_oAB.offs_Y] fld d_w_p [@CE_AB.offs_Z] fdiv st(00), st(01) fstp d_w_p [@CE_oAB.offs_Z] fstp d_w_p [@CE_sAB] ; AC mov edx, d_w_p [ebx.EDGE_FACES_VERTEX_C] fld d_w_p [esi.edx.PrimitiveVerticeCoord_X] fsub d_w_p [esi.eax.PrimitiveVerticeCoord_X] fst d_w_p [@CE_AC.offs_X] fmul st(00), st(00) fld d_w_p [esi.edx.PrimitiveVerticeCoord_Y] fsub d_w_p [esi.eax.PrimitiveVerticeCoord_Y] fst d_w_p [@CE_AC.offs_Y] fmul st(00), st(00) faddp st(01), st(00) fld d_w_p [esi.edx.PrimitiveVerticeCoord_Z] fsub d_w_p [esi.eax.PrimitiveVerticeCoord_Z] fst d_w_p [@CE_AC.offs_Z] fmul st(00), st(00) faddp st(01), st(00) fsqrt fld d_w_p [@CE_AC.offs_X] fdiv st(00), st(01) fstp d_w_p [@CE_oAC.offs_X] fld d_w_p [@CE_AC.offs_Y] fdiv st(00), st(01) fstp d_w_p [@CE_oAC.offs_Y] fld d_w_p [@CE_AC.offs_Z] fdiv st(00), st(01) fstp d_w_p [@CE_oAC.offs_Z] fstp d_w_p [@CE_sAC] ; calculate normal ortho vector ; Xn fld d_w_p [@CE_AC.offs_Y] ; (Yc-Ya)(Zb-Za) fmul d_w_p [@CE_AB.offs_Z] fld d_w_p [@CE_AC.offs_Z] ; (Zc-Za)(Yb-Ya) fmul d_w_p [@CE_AB.offs_Y] fsubp st(01), st(00) ; (Yc-Ya)(Zb-Za)-(Zc-Za)(Yb-Ya) fstp d_w_p [edi.PrimitiveNormal_X] ; Yn fld d_w_p [@CE_AC.offs_Z] ; (Zc-Za)(Xb-Xa) fmul d_w_p [@CE_AB.offs_X] fld d_w_p [@CE_AC.offs_X] ; (Xc-Xa)(Zb-Za) fmul d_w_p [@CE_AB.offs_Z] fsubp st(01), st(00) ; (Zc-Za)(Xb-Xa)-(Xc-Xa)(Zb-Za) fstp d_w_p [edi.PrimitiveNormal_Y] ; Zn fld d_w_p [@CE_AC.offs_X] ; (Xc-Xa)(Yb-Ya) fmul d_w_p [@CE_AB.offs_Y] fld d_w_p [@CE_AC.offs_Y] ; (Yc-Ya)(Xb-Xa) fmul d_w_p [@CE_AB.offs_X] fsubp st(01), st(00) ; (Xc-Xa)(Yb-Ya)-(Yc-Ya)(Xb-Xa) fstp d_w_p [edi.PrimitiveNormal_Z] ; normalize fld d_w_p [edi.PrimitiveNormal_X] fmul st(00), st(00) fld d_w_p [edi.PrimitiveNormal_Y] fmul st(00), st(00) faddp st(01), st(00) fld d_w_p [edi.PrimitiveNormal_Z] fmul st(00), st(00) faddp st(01), st(00) fsqrt fld d_w_p [edi.PrimitiveNormal_X] fdiv st(00), st(01) fstp d_w_p [edi.PrimitiveNormal_X] fld d_w_p [edi.PrimitiveNormal_Y] fdiv st(00), st(01) fstp d_w_p [edi.PrimitiveNormal_Y] fld d_w_p [edi.PrimitiveNormal_Z] fdiv st(00), st(01) fstp d_w_p [edi.PrimitiveNormal_Z] ffree st(00)
попробуй посчитать: нужно чтоб было два вектора u и v естественно нормаль это перпендикуляр этим векторам тогда нормаль это произведение векторов UxV nx=uy*vz-uz*vy; ny=uz*vx-ux*vz; nz=ux*vy-uy*vx; берем треугольник с точками ABC берем точку А - это будет начало вектора тогда векторы AB и AC вот их производим таким способом я находил нормали для чего угодно p.s. UxV= -(VxU) поэтому порядок перемножения может определить направления вектора прямо или в противоположную сторону