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

Экспорт нормалей

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

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

    Здравствуй, All!

    У меня возникла такая проблема.
    Если объект Editable Mesh. Мне нужно получить последовательность треугольников (3 вершины; 3 текстурных координат для diffuse, и 3 нормали) из которых состоит этот объект. Проблема возникает с нормалями, я не знаю, какую нормаль нужно экспортировать: нормаль к вершине, или нормаль к грани. Этот выбор должен производится исходя из значения Smoothing Group, но как это сделать я, к сожалению, не понимаю.
    То есть если есть коробка, то должны экспортироваться нормали к граням, если это шар, то к вершинам, а если это будет что-то вроде болта, то нормали будут выбираться исходя из местоположения этого треугольника в модели.

    По моему, получается, что нужно анализировать это значение у всех треугольников смежных с очередным… Но на этом я и торможу.
    Помогите советом, что да как сделать.

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

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

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Это тебе поможет:
    ------------------------------------------------------------------------------
    numFace = .. -- [1..maxFace]
    vertFace = meshop.getVertsUsingFace $ #{numFace}
    vertNormal = meshop.getFaceRNormals $ numFace

    ------------------------------------------------------------------------------
    да и Max 5й
     
  3. Guest

    Большое спасибо за ответ.
     
  4. Guest

    А разве у коробки в кажой вершине нормаль не равна нормали к грани?! Помоему вопроса нет. У меня есть готовый скрипт для экспорта Mesh объектов, который всегда экспортирует нормали вершин, модели в моей проге выглядят также как и в MAX. Smooth groups, видимо только на работе самого Макса отражаются, а экспортиться уже результат...
    ICQ 330927525
    lordodin@mtu-net.ru
     
  5. Guest

    Тогда, пожалуйста, выложи этот скрипт где-нибуть, или ссылку на него дай.
     
  6. Guest

    --- начало файла MaXport.ms ---
    utility MaXport "MaXport 1.0" width:162 height:160
    (
    local ostream, a, b, ut

    GroupBox grp1 "Properties" pos:[4,7] width:154 height:89
    checkbox cb_exportSelOnly "Selected only" pos:[13,26] width:129 height:15
    button btn_export "Export" pos:[5,103] width:60 height:21
    button btn_about "About" pos:[5,133] width:60 height:21
    progressBar pb "" pos:[70,103] width:87 height:21
    edittext edit_fname "" pos:[5,70] width:146 height:21
    label lbl2 "File name" pos:[13,51] width:46 height:13
    button btn_browse "Browse" pos:[96,47] width:55 height:17 posdf:[96,49]

    -------------------------------------------------------------------------------------
    function ExportMesh meshObj =
    (
    if (meshObj.numTVerts>0 and meshObj.name != 'NoTex' and b!=1)or
    ((meshObj.numTVerts==0 or meshObj.name == 'NoTex') and b==1)then
    (
    a = a + 1
    if a<3 then
    (
    pb.value=0
    v = meshObj.numVerts + meshObj.numFaces + MeshObj.numTVerts
    v = 100.0/v

    x = 0
    y = 0
    pb.value = 0

    if meshObj.numTVerts == 0 or meshObj.name == 'NoTex' then
    ut=ut+1

    if meshObj.numTVerts <= 0 or meshObj.name == 'NoTex' then
    Format ("%\n% 0 %\n") meshObj.name meshObj.numverts meshObj.numfaces to:eek:stream
    else
    Format ("%\n% % %\n") meshObj.name meshObj.numverts meshObj.numTVerts meshObj.numfaces to:eek:stream

    if meshObj.numVerts > 0 then
    (
    for i = 1 to meshObj.numVerts do
    (
    Format ("% % % ") ((GetVert meshObj i).x - meshObj.Center.x) ((GetVert meshObj i).y - meshObj.Center.y) ((GetVert meshObj i).z - meshObj.Center.z) to:eek:stream
    Format ("% % %\n") (GetNormal meshObj i).x (GetNormal meshObj i).y (GetNormal meshObj i).z to:eek:stream
    x = x + 1
    if (x-y)*v >= 1 then
    (
    pb.value = x * v
    y = x
    )
    )
    )

    if MeshObj.numTVerts > 0 and meshObj.name != 'NoTex' then
    (
    for i = 1 to meshObj.NumTVerts do
    (
    Format ("% % %\n") (GetTVert meshObj i).x (GetTVert meshObj i).y (GetTVert meshObj i).z to:eek:stream
    x = x + 1
    if (x-y)*v >= 1 then
    (
    pb.value = x * v
    y = x
    )
    )
    )

    if meshObj.numFaces > 0 then
    (
    for i = 1 to meshObj.numFaces do
    (
    Format ("% % % ") ((GetFace meshObj i).x as Integer) ((GetFace meshObj i).y as integer) ((GetFace meshObj i).z as Integer) to:eek:stream
    if meshObj.numTVerts>0 or meshObj.name == 'NoTex' then
    Format ("% % %") ((GetTVFace meshObj i).x as Integer) ((GetTVFace meshObj i).y as Integer) ((GetTVFace meshObj i).z as Integer) to:eek:stream
    Format ("\n") to:eek:stream
    x = x + 1
    if (x-y)*v >= 1 then
    (
    pb.value = x * v
    y = x
    )
    )
    )
    )
    )
    )
    -------------------------------------------------------------------------------------
    function ExportPoint pObj =
    (
    Format ("%\n% % %\n") pObj.name pObj.center.x pObj.center.y pObj.center.z to:eek:stream
    )
    -------------------------------------------------------------------------------------
    function ExportNode node =
    (
    if b==100 and SuperClassOf node == GeometryClass and ClassOf node == Editable_mesh and (node.numTVerts == 0 or node.name == 'NoTex') then ut=ut+1

    if b==100 and SuperClassOf node == GeometryClass and ClassOf node == Editable_mesh then a=a+1 else
    if b==0 and SuperClassOf node == GeometryClass and ClassOf node == Editable_mesh then ExportMesh node
    else
    if b==1 and SuperClassOf node == GeometryClass and ClassOf node == Editable_mesh then ExportMesh node
    else
    if b==2 and SuperClassOf node == helper and ClassOf node == point then ExportPoint node
    )
    -------------------------------------------------------------------------------------
    function RecursiveExportNode node =
    (
    ExportNode node
    for child in node.children do
    RecursiveExportNode child
    )

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

    on btn_export pressed do
    (
    btn_export.Enabled = false
    ostream = CreateFile edit_fname.text
    if ostream == undefined then
    (
    MessageBox "MaXport. Version 1.00\n Cannot access file." title:"MaXport export error"
    )else(
    Format ("MaXport 1.0\n") to:eek:stream
    ut=0;
    a=0
    ut=0
    b=100
    if cb_exportSelOnly.checked then
    for node in selection do ExportNode node
    else
    for node in rootnode.children do RecursiveExportNode node
    Format ("%\n") a to:eek:stream
    a=0
    b=0
    if (a-ut)<=1 then
    (
    if cb_exportSelOnly.checked then
    (
    for node in selection do ExportNode node
    b=1
    for node in selection do ExportNode node
    b=2
    for node in selection do ExportNode node
    )else(
    for node in rootnode.children do RecursiveExportNode node
    b=1
    for node in rootnode.children do RecursiveExportNode node
    b=2
    for node in rootnode.children do RecursiveExportNode node
    )
    )else(
    MessageBox "MaXport. Version 1.00\n There can be only 2 meshes: textured and untextured parts, the second part must be named 'NoTex'." title:"MaXport export error"
    )
    Close ostream
    ostream = OpenFile edit_fname.text
    Close ostream
    )
    btn_export.Enabled = true
    )

    on btn_about pressed do
    (
    MessageBox "MaXport. Version 1.00\n Ярышев Юрий 2003г. Москва." title:"About MaXport"
    )
    on btn_browse pressed do
    (
    fname = GetSaveFileName types:"Max export files (*.mxf)|*.mxf|All Files(*.*)|*.*|"
    if fname!=undefined then
    (
    edit_fname.text = fname
    )
    )
    )
    --- Конец файла ---
     
Модераторы: Savin Denis

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