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

Порядок вершин в полигоне.

Тема в разделе "MAXScript", создана пользователем Kuulman, 4 окт 2008.

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

    Kuulman Пользователь сайта

    С нами с:
    30.09.2008
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    2
    Я сделал экспорт сцены в нужный мне формат и вывожу её в своей программе. Столкнулся с такой проблемой:
    при отрисовке сцены в программе играет роль, в каком порядке указаны вершины для полигона - по часовой или против часовой стрелки. Это определяет, с какой стороны полигон видно, а с какой он прозрачный. Некоторые сцены содержат объекты, которые нормально выглядят в 3Дмаксе, нормально рендерятся, но после экспорта оказывается, что у части объектов полигоны заданы в неправильном направлении, и они отображаются наоборот. Подскажите, cull_fase в 3Д максе определяется только нормалью полигона, и нужно вычислять порядок вершин самому, или есть ещё какой-то параметр у объекта?
     
  2. Savin Denis vip

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Глянул в SDK нормаль face (EditMesh) в максе напрямую расчитывается от направления индексов вертексов
    так что ошибка скорее вего у тебя в экспортере или программе.
     
  3. Kuulman

    Kuulman Пользователь сайта

    С нами с:
    30.09.2008
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    2
    Большое спасибо за помощь.
     
  4. Kuulman

    Kuulman Пользователь сайта

    С нами с:
    30.09.2008
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    2
    По всей видимости, ошибки нигде нету. Возможно, так получается из-за различных преобразований объекта. Нашёл код, который позволяет бороться с такой проблемой:

    local WorldMatrix = copy tmpObj.transform
    WorldMatrix.row1 = normalize WorldMatrix.row1
    WorldMatrix.row2 = normalize WorldMatrix.row2
    WorldMatrix.row3 = normalize WorldMatrix.row3
    local CCW=(WorldMatrix.determinantsign < 0)

    и дальше опираясь на условие уже указываем порядок вертексов:
    face = (getFace tmpObj i) --получаем фейс
    for j = 1 to 3 do
    (
    if (not CCW) then
    jj = j
    else
    jj = 4 - j

    writefloat f (meshop.getFaceRNormals tmpObj i)[jj][1] --добавляем X-нормали вертекса
    writefloat f (meshop.getFaceRNormals tmpObj i)[jj][2] --добавляем Y-нормали вертекса
    writefloat f (meshop.getFaceRNormals tmpObj i)[jj][3] --добавляем Z-нормали вертекса
    writefloat f (getVert tmpObj face[jj])[1] -- добавляем X вертекса
    writefloat f (getVert tmpObj face[jj])[2] -- добавляем Y вертекса
    writefloat f (getVert tmpObj face[jj])[3] -- добавляем Z вертекса
    )

    Но есть проблема с нормалями на объектах с обратным порядком вершин. Они отображаются неправильно:(
     
  5. Savin Denis vip

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Понятно работаеш с глобальными координатами.
    Можно приатачитьвсе объекты к обьекту пустышке в цетре координат и экспортнуть.
    Или дорабатывай этот скрипт: Для повернутых фейсов нужно и нормали инвертировать - домнож их на -1
     
Модераторы: Savin Denis

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