Render.ru

Нормали

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

Savin Denis

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

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

Заранее спасибо.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
Посмотрел. Вроде там все нормально работает.
только нужно пользоватьлся методами самого модификатора 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
 
#6
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.
Прошу помочь.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#7
Модификатор едит_нормаль нормально работает
только с едит_поли обьектами
(хоть и пишут что в 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
Денис, спасибо тебе, реально помог!
Проблема решилась установкой Макс6, до этого был Макс5.1.

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