Вычисление нормалей

Тема в разделе "WASM.GRAPHICS", создана пользователем Rustem, 9 янв 2007.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Приветствую.

    В общем сабж.
    Допустим имеются все вершины объекта в массиве и еще один массив индексов.
    Как вычислить нормали для каждой вершины?
     
  2. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Дык, нормали ведь обычно вычисляются для полигонов (а не вершин) ?!?!?
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Индексов чего?

    Где-то на GameDev было про это. Нормаль к вершине, вроде, среднее что-то нормалей всех граней прилегающих к вершине.
     
  4. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    да ну! все зависит от ваших целей. скажем есть у вас шар из полигонов вычесляя нормаль к полигону а стало быть и плоскости вы при освещении такого шара увидите что это не шар а многоугольник. а вот если вы каждой вершине посчитаете свою нормаль то свет ляжет очень даже красиво. вы это легко можете увидеть в 3дс макс убрав фишечку сглаженные нормали.
     
  5. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    asd
    Дано:
    1. Массив вершин, допустим float x,y,z
    2. Массив индексов вершин, из которых строится примитивы(треугольники). Например: 0,1,2, 2,3,1

    надо: построить массив нормалей к каждой вершине
     
  6. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    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
     
  7. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    Rustem
    в начале находишь нормаль для каждой грани. потом для каждой вершины вычисляешь сумму нормалей тех граней, где присутствует эта вершина. нормируешь вектор - получаешь нормаль для вершины.

    для шарика можно обойтись точным вычислением :)
     
  8. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Kozyr__
    К сожалению не только шарик ;)

    А объект любой формы. Конкретно пишу риппер моделей из игр дх7-9, и опенгл
    Возникла проблема что не у всех заданы нормали, а для конвертации в obj они необходимы
     
  9. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    Rustem
    лови алгоритм выдрал его из своих старых кодов думаю все вполне понятно
    это не сглаженная нормаль! тоесть нормаль для плоскости вы ее можете положить для каждого фейс вертекса.

    Код (Text):
    1. ; AB
    2.         mov     eax, d_w_p [ebx.EDGE_FACES_VERTEX_A]
    3.         mov     edx, d_w_p [ebx.EDGE_FACES_VERTEX_B]
    4.  
    5.         fld     d_w_p [esi.edx.PrimitiveVerticeCoord_X]
    6.         fsub    d_w_p [esi.eax.PrimitiveVerticeCoord_X]
    7.         fst     d_w_p [@CE_AB.offs_X]
    8.         fmul    st(00), st(00)
    9.  
    10.         fld     d_w_p [esi.edx.PrimitiveVerticeCoord_Y]
    11.         fsub    d_w_p [esi.eax.PrimitiveVerticeCoord_Y]
    12.         fst     d_w_p [@CE_AB.offs_Y]
    13.         fmul    st(00), st(00)
    14.         faddp   st(01), st(00)
    15.  
    16.         fld     d_w_p [esi.edx.PrimitiveVerticeCoord_Z]
    17.         fsub    d_w_p [esi.eax.PrimitiveVerticeCoord_Z]
    18.         fst     d_w_p [@CE_AB.offs_Z]
    19.         fmul    st(00), st(00)
    20.         faddp   st(01), st(00)
    21.  
    22.         fsqrt
    23.         fld     d_w_p [@CE_AB.offs_X]
    24.         fdiv    st(00), st(01)
    25.         fstp    d_w_p [@CE_oAB.offs_X]
    26.  
    27.         fld     d_w_p [@CE_AB.offs_Y]
    28.         fdiv    st(00), st(01)
    29.         fstp    d_w_p [@CE_oAB.offs_Y]
    30.  
    31.         fld     d_w_p [@CE_AB.offs_Z]
    32.         fdiv    st(00), st(01)
    33.         fstp    d_w_p [@CE_oAB.offs_Z]
    34.  
    35.         fstp    d_w_p [@CE_sAB]
    36.  
    37. ; AC
    38.  
    39.         mov     edx, d_w_p [ebx.EDGE_FACES_VERTEX_C]
    40.  
    41.         fld     d_w_p [esi.edx.PrimitiveVerticeCoord_X]
    42.         fsub    d_w_p [esi.eax.PrimitiveVerticeCoord_X]
    43.         fst     d_w_p [@CE_AC.offs_X]
    44.         fmul    st(00), st(00)
    45.  
    46.         fld     d_w_p [esi.edx.PrimitiveVerticeCoord_Y]
    47.         fsub    d_w_p [esi.eax.PrimitiveVerticeCoord_Y]
    48.         fst     d_w_p [@CE_AC.offs_Y]
    49.         fmul    st(00), st(00)
    50.         faddp   st(01), st(00)
    51.  
    52.         fld     d_w_p [esi.edx.PrimitiveVerticeCoord_Z]
    53.         fsub    d_w_p [esi.eax.PrimitiveVerticeCoord_Z]
    54.         fst     d_w_p [@CE_AC.offs_Z]
    55.         fmul    st(00), st(00)
    56.         faddp   st(01), st(00)
    57.  
    58.         fsqrt
    59.         fld     d_w_p [@CE_AC.offs_X]
    60.         fdiv    st(00), st(01)
    61.         fstp    d_w_p [@CE_oAC.offs_X]
    62.  
    63.         fld     d_w_p [@CE_AC.offs_Y]
    64.         fdiv    st(00), st(01)
    65.         fstp    d_w_p [@CE_oAC.offs_Y]
    66.  
    67.         fld     d_w_p [@CE_AC.offs_Z]
    68.         fdiv    st(00), st(01)
    69.         fstp    d_w_p [@CE_oAC.offs_Z]
    70.  
    71.         fstp    d_w_p [@CE_sAC]
    72.  
    73. ; calculate normal ortho vector
    74. ; Xn
    75.         fld     d_w_p [@CE_AC.offs_Y] ; (Yc-Ya)(Zb-Za)
    76.         fmul    d_w_p [@CE_AB.offs_Z]
    77.         fld     d_w_p [@CE_AC.offs_Z] ; (Zc-Za)(Yb-Ya)
    78.         fmul    d_w_p [@CE_AB.offs_Y]
    79.         fsubp   st(01), st(00)    ; (Yc-Ya)(Zb-Za)-(Zc-Za)(Yb-Ya)
    80.         fstp    d_w_p [edi.PrimitiveNormal_X]
    81. ; Yn
    82.         fld     d_w_p [@CE_AC.offs_Z] ; (Zc-Za)(Xb-Xa)
    83.         fmul    d_w_p [@CE_AB.offs_X]
    84.         fld     d_w_p [@CE_AC.offs_X] ; (Xc-Xa)(Zb-Za)
    85.         fmul    d_w_p [@CE_AB.offs_Z]
    86.         fsubp   st(01), st(00)    ; (Zc-Za)(Xb-Xa)-(Xc-Xa)(Zb-Za)
    87.         fstp    d_w_p [edi.PrimitiveNormal_Y]
    88. ; Zn
    89.         fld     d_w_p [@CE_AC.offs_X] ; (Xc-Xa)(Yb-Ya)
    90.         fmul    d_w_p [@CE_AB.offs_Y]
    91.         fld     d_w_p [@CE_AC.offs_Y] ; (Yc-Ya)(Xb-Xa)
    92.         fmul    d_w_p [@CE_AB.offs_X]
    93.         fsubp   st(01), st(00)    ; (Xc-Xa)(Yb-Ya)-(Yc-Ya)(Xb-Xa)
    94.         fstp    d_w_p [edi.PrimitiveNormal_Z]
    95.  
    96. ; normalize
    97.         fld     d_w_p [edi.PrimitiveNormal_X]
    98.         fmul    st(00), st(00)
    99.         fld     d_w_p [edi.PrimitiveNormal_Y]
    100.         fmul    st(00), st(00)
    101.         faddp   st(01), st(00)
    102.         fld     d_w_p [edi.PrimitiveNormal_Z]
    103.         fmul    st(00), st(00)
    104.         faddp   st(01), st(00)
    105.         fsqrt
    106.         fld     d_w_p [edi.PrimitiveNormal_X]
    107.         fdiv    st(00), st(01)
    108.         fstp    d_w_p [edi.PrimitiveNormal_X]
    109.         fld     d_w_p [edi.PrimitiveNormal_Y]
    110.         fdiv    st(00), st(01)
    111.         fstp    d_w_p [edi.PrimitiveNormal_Y]
    112.         fld     d_w_p [edi.PrimitiveNormal_Z]
    113.         fdiv    st(00), st(01)
    114.         fstp    d_w_p [edi.PrimitiveNormal_Z]
    115.         ffree   st(00)
     
  10. DARK_FURY

    DARK_FURY New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    3
    попробуй посчитать:
    нужно чтоб было два вектора 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)
    поэтому порядок перемножения может определить направления вектора прямо или в противоположную сторону