Render.ru

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

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

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

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

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

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
Это тебе поможет:
------------------------------------------------------------------------------
numFace = .. -- [1..maxFace]
vertFace = meshop.getVertsUsingFace $ #{numFace}
vertNormal = meshop.getFaceRNormals $ numFace

------------------------------------------------------------------------------
да и Max 5й
 
#4
А разве у коробки в кажой вершине нормаль не равна нормали к грани?! Помоему вопроса нет. У меня есть готовый скрипт для экспорта Mesh объектов, который всегда экспортирует нормали вершин, модели в моей проге выглядят также как и в MAX. Smooth groups, видимо только на работе самого Макса отражаются, а экспортиться уже результат...
ICQ 330927525
lordodin@mtu-net.ru
 
#5
Тогда, пожалуйста, выложи этот скрипт где-нибуть, или ссылку на него дай.
 
#6
--- начало файла 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
)
)
)
--- Конец файла ---
 
Сверху