1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Нормали

Тема в разделе "MAXScript", создана пользователем -, 20 мар 2004.

Модераторы: Savin Denis
  1. Guest

    Господа, разрешите такой вопрос по макс скрипту. Я сам не моделлер, а программист, мне требуется в скрипте получить нормаль точки, которую указал моделлер (нормаль указал).
    То есть:
    есть ф-я getfacenormal - не подходит, понятно почему (нормаль не точки, а номаль грани).
    функция же getnormal (это функция точки, а не грани) выдает какие странные результаты. например для кубика 1х1х1 для одной из точек выдает (0;0;1.57)
    1.57 - это явно пи пополам.... одним словом, я не разобрался.
    резюмируя: необходимо получить ту нормаль точки, которая задана моделлером! если моделлер сгладил нормаль - тогда сглаженную, если нет - тогда, разумеется, не сглаженную. и, ЖЕЛАТЕЛЬНО, чтобы эти нормали можно было редактировать через модификатор EditNormals, а не через группы сглаживания.
    Извините за сумбурность. Прошу помочь. :)
     
  2. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Если тебе нужны нормали точек как их делает макс, то надо смотреть
    в SDK-е алгоритм,если не разберешся пиши прийду домой гляну,вроде
    писал что-то на эту тему.
     
  3. Guest

    наверное, да. я не моделлер, поэтому не могу четко сформулировать, что мне надо. в-общем, на пальцах: если в модификаторе EditNormals мы сказал нормали сгладить, тогда экспортер должен это определить и получить сглаженую нормаль, а если наоборот, "разбить" нормали для точки по полигонам, тогда, разумеется, скрипт должен выдавать для каждого полигона свою нормаль в этой точке. Не очень понятно, согласен, но более доходчиво объяснить не могу.
    Посмотри, если тебе не трудно, или скажи, в каком направлении копать?

    ЗЫ: может все-ткаи можно как-то привети к понятному виду результат функции getnormal?

    Заранее спасибо.
     
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Посмотрел. Вроде там все нормально работает.
    только нужно пользоватьлся методами самого модификатора Edit_Normals

    Сотвевтственно получить номали принадлежещие нужной точке:
    obj = $Box01
    my_verts = #{1}
    my_normals = #{}
    obj.Edit_Normals.ConvertVertexSelection &my_verts &my_normals

    -- my_normals = #{1, 9, 22}
    -- если количество получаемых нормалей в точке больше одной
    -- значит нормали в этой точке не сглаженны полностью

    if my_normals.count > 1 then
    (
    for i= 1 to my_normals.count do
    (
    vnornals = obj.Edit_Normals.getNormal my_normals
    ..........
    )
    ) else vnornal = obj.Edit_Normals.getNormal my_normals[1]


    PS. max6
     
  5. Guest

    спасибо, я попробую!
     
  6. Guest

    Denis
    Денис, спасибо за помощь, возникла проблема несколько другого рода, но для той же задачи.
    Итак, воспользовался твоим советом:
    obj.Edit_Normals.ConvertVertexSelection &my_verts &my_normals
    только несколько видоизменив (мне так надо и так удобнее):
    obj.Edit_Normals.ConvertFaceSelection &my_faces &my_normals
    одним словом ф-я возвращает номера нормалей для точек фейса, а не вертекса (пишу по памяти - могу ошибиться. надеюсь ты понимаешь меня)
    так вот, в максе есть интересная фишка. создай сферу, выдели её и набери:
    $.numfaces
    $.mesh.numfaces
    получишь, что первое число меньше, чем второе. В этом и проблема. Я экспортирую меш, а там число полигонов меньше, чем в node. Почему то в ноде могут быть четырехуголные полигончики, т.о. число этих полигонов меньше, чем в меше (SnapShotAsMesh), где только треугольники
    Теперь суть проблемы: идет цикл по треугольникам меша, и стоят команды
    obj.Edit_Normals.ConvertFaceSelection &my_faces &my_normals
    obj.Edit_Normals.GetNormal <НЕ ПОМНЮ ПАРАМЕТРЫ>
    примерно в середине цикла, когда цикл выходит за пределы числа фейсов нода (НО НЕ МЕША) происходит, разумеется, ошибка.
    Конкретика: как мне определить соответствие между фейсом нода и фейсом меша, и соотв. между вершинами и номерами нормалей. Одним словом: я знаю номер фейса меша, но не могу "установить связь" с вершиной и фейсом нода, чтобы можно было воспользоваться модификатором EditNormals.
    Прошу помочь.
     
  7. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Модификатор едит_нормаль нормально работает
    только с едит_поли обьектами
    (хоть и пишут что в 6ке может работать с мешем, но видать не доконца)


    Вобшем прейдеться сконвертировать обьект в едит_поли но при этом триангулировав полигоны до триугольников:

    -------------------------------------------



    fn triangulatePoly obj = (
    local m = convertToMesh(obj)
    meshop.autoEdge m #all .0 type:#set
    (convertToPoly(m))
    )

    obj = $

    triangulatePoly obj

    modPanel.addModToSelection (Edit_Normals ())
    my_faces = #{obj.Edit_Normals.getNumFaces()}
    my_normals = #{}

    obj.Edit_Normals.ConvertFaceSelection &my_faces &my_normals
    print (my_normals)


    -------------------------------------------
     
  8. Guest

    Денис, спасибо тебе, реально помог!
    Проблема решилась установкой Макс6, до этого был Макс5.1.

    Кстати, интересное наблюдение:
    команды convertfaceselection И convertedgeselection в максе6 для тримеш не работают - вызывают интернал еррор. видимо это ошибка разработчиков.
    пришлось использовать getnormal и getnormalid
     
  9. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Так о чем я и писал выше.
     
Модераторы: Savin Denis

Поделиться этой страницей