Войти
IrrlichtФорум

Exporter 3DSMax -> Irrlicht (2 стр)

Страницы: 1 2
#15
22:03, 1 фев. 2009

...ссылка не работает, перезалейте пожалуйста....сейчас как-раз столкнулся с проблемой экспорта сцены, в Irrlicht нету толковых привязок к сожалению, точно что-либо расставить проблема, а тут экспортёр всей сцены!


#16
15:38, 7 фев. 2009

sergant
Если бы он экспортировал анимацию, да еще больше, чем позволяет стандартный экспорт через .Х файл -- цены бы твоей утилите не было...

#17
11:52, 9 фев. 2009

witchers
http://www.gamedev.ru/download/?id=8485
Только сейчас разобрал почту и увидел твое сообщение, так бы выложил раньше

#18
11:56, 9 фев. 2009

constructor_
По причине перехода на Blitz3D, экспортер я больше не развиваю
Но экспорт анимации добавить не очень сложно, просто дописать чтобы геометрия имеющая анимацию сохранялась в *.X файл а не *.3DS, остальное делает сам MAX

#19
3:18, 11 фев. 2009

...большое спасибо!...

#20
9:39, 18 мар. 2009

sergant
> По причине перехода на Blitz3D
К слову говоря, Irrlicht удовлетворительно понимает формат b3d (статические модели и скелетную анимацию). Так что экспортер для 3ds max в .b3d вполне полезен http://www.onigirl.com/pipeline/

#21
11:27, 18 мар. 2009

alrusdi
> и скелетную анимацию
скажем так - далеко не отлично :)
ирр лучше всего понимает скелетку .Х формата, потом - .ms3d и аж потом - .b3d, увы, но последний лоадер со скелеткой для ирра все еще дорабатывается:(
точнее - там проблемы с анимацией

#22
13:36, 18 мар. 2009

Nup
> скажем так - далеко не отлично :)
УДОВЛЕТВОРИТЕЛЬНО понимает формат .b3d

Зато экспортер надежный и toolset неплохой (кстати нативный моделвиевер ирлихта легко прикручивается к родному набору B3DPipeline). С Panda я встречал проблемы экспорта (некорректная анимация, некорректное расположение осей субмоделей). А .ms3d экспортер для макса существет?
С .b3d у меня тоже были проблемы, но они в коде загрузчика, который всегда под рукой и доступен к отладке и доработке. А вот что делать если сама модель некорректна (в некоторых случаях экспортера .x файлов) это уже вопрос.

#23
14:32, 21 мар. 2009

>А .ms3d экспортер для макса существет?
в самом милкшейпе можна импортировать/экспортировать в макс
насчет плагина для макса - не знаю, не видел и не искал, думаю должен быть:)

#24
13:14, 29 июня 2009

Выкладываю исходники здесь по причине частой инвалидности ссылок исходников

readme.txt
Это экспортер статической геметрии из 3DSMax в сцену Irrlicht (*.irr) версии 1.4alpha на других не пробовал.
Текстуры и меши размещаются в относителых директориях (если указать).
Для правельной работы перед загрузкой сцены irr, необходимо рабочую директорию изменить на ту в которой лежит сцена(*.irr), а после грузить.
Связано это с тем, что пути мешей и текстур прописаны относительно файла сцены.

Геометрия:
  Dummy
  Box
  Sphere
  Geosphere
  EditableMesh -> .3DS
Материалы:
  StandardMaterial(diffusemap.bitmap) и MultiMaterial(StandardMaterial)
Свет:
  все кроме SkyLight(наличие на сцене приводит к ошибке)
  Параметры света нужно корректировать
Камеры:
  Только FreeCamera, наличие TargerCamera на сцена приводит к ошибке
Particles:
  Snow:  Параметры нужно корректировать, отсутствие поддержки гравитации
Иерахия узлов:
  Поддерживатся

Дополнительно:
  Добавлена утилита позваляющая задавть объектам сцены уникальные идентификаторы, полезно при поиске объектов на сцене.
  Если идентификатор не задан экспортируется с id = -1

Примечание:
  При первой попытке выполнения скрипта в максе, возникает ошибка. Связано это с тем что в макс_скрипте нет объявления функций, только определения, а в экспортере две функции вызывают друг друга.
  Для устраненеи этого необходимо скрипт запустить из listener-а ( Ctrl+E  ) несколько раз, пока все функции не определяться, двух достаточно.

Исправленные баги:
  Исправлен баг копирования текстуры в директорию сцены. Раньше если файл текстуры уже существовал в папке назнацения в логе писалась ошибка копирования файла.

Utility.ms
--------------------------------------------------
--
--  Sergant`s object property utilitys
--
--------------------------------------------------

include "Globals.ms"

utility util_node_id "Object type props" width:150 height:240
  (
  GroupBox grp9 "Object settings" pos:[10,10] width:130 height:130
  dropdownList m_ddl "DropDownList" pos:[20,20] width:110 height:15 items:g_node_id selection:0
  button m_btn_reset "Reset" pos:[10,150] width:130 height:20
  button m_btn_read "Read" pos:[10,180] width:130 height:20
  button m_btn_write "Write" pos:[10,210] width:130 height:20

  on m_btn_reset pressed do
    (
    m_ddl.selection = 0
    )
  on m_btn_read pressed do
    (
    m_ddl.selection = 0
   
    if selection.count == 1 then
      m_ddl.selection = (getUserPropId selection[1] "g_node_id" g_node_id)
    else
      messageBox("Select one object !!!")
    )
  on m_btn_write pressed do
    (
    if selection.count == 1 then
      (
      for obj in objects do
        if m_ddl.selection == (getUserPropId obj "g_node_id" g_node_id) then
          if (queryBox "Do yoy want set id to undefined?" title:("object have same id: " + obj.name) ) then
            setUserProp obj "g_node_id" undefined
      setUserProp selection[1] "g_node_id" m_ddl.selected
      )
    else
      messageBox("Select one object !!!")
    )
  on m_ddl selected sel do
    (
 
    )
  )

CreateDialog util_node_id


Globals.ms

--------------------------------------------------
--
--  Sergant`s exporter global functions and variebles
--
--------------------------------------------------

function ObjRotation obj =
  (
  if(isKindOf  obj.rotation.controller rotation_list) == true then
    return [0,0,0]
  else
    return [-obj.rotation.controller.x_rotation, -obj.rotation.controller.y_rotation, -obj.rotation.controller.z_rotation]
  )

function getUserPropId obj prop_type prop_arr =
  (
  local l_user_prop = getUserProp obj prop_type
  for l_index = 1 to prop_arr.count do
    if prop_arr[l_index] == l_user_prop then
      return l_index
  return -1
  )

IrrExporterUI.mcr
-------------------------------------------------
--  Sergant`s exporter GUI
-------------------------------------------------

include "Utility.ms"

macroScript IrrExporter category:"Exporters" buttonText:"IrrExport" toolTip:"Sergant`s IrrExporter"
  (
  on execute do
    (
    sysInfo.currentdir = "D:\SergantDoc\!!!Projects\BeaversIrrlicht\Script"
    fileIn "IrrExporter.ms"

    )
  )

macroScript IrrExporterUtil category:"Exporters" buttonText:"IrrProps" toolTip:"Sergant`s Irr property utilitys"
  (
  on execute do
    (
    sysInfo.currentdir = "D:\SergantDoc\!!!Projects\BeaversIrrlicht\Script"
    fileIn "Utility.ms"
    )
  )
macroScript IrrExporterInfo category:"Exporters" buttonText:"IrrInfo" toolTip:"Sergant`s Irr property info"
  (
  on execute do
    (
    )
  )

#25
13:19, 29 июня 2009

IrrExporter.ms
-------------------------------------------------
--  Sergant`s Max to Irrlicht exporter
-------------------------------------------------

include "Globals.ms"

global g_path = ""
global g_meshdir = ""
global g_texturedir = ""
global g_file

function IrrExportMaterial a_mat a_prefix =
  (
  local l_ambient    = black
  local l_diffuse    = black
  local l_specular  = black
  local l_emission  = black
  local l_shine    = 0.0
  local l_texturefilename = ""
 
  if (classOf a_mat ) == StandardMaterial then
    (
    l_ambient = a_mat.ambient
    l_diffuse = a_mat.diffuse
    l_specular = a_mat.specular
    l_ambient.a = l_diffuse.a = l_specular.a = l_emission.a = ((a_mat.opacity/100) * 255) as Integer
   
    if a_mat.useSelfIllumColor == true then    l_emission = a_mat.SelfIllumColor
    else                    l_emission = a_mat.diffuse * (a_mat.selfIllumAmount/100)

    l_shine = ((a_mat.specularLevel/999) * 255) as Integer
   
    if a_mat.diffuseMap != undefined then
      if a_mat.diffuseMap.bitmap != undefined then
        (
        l_texturefilename = g_texturedir + filenameFromPath( a_mat.diffuseMap.bitmap.filename )
       
        local l_old_filename = a_mat.diffuseMap.bitmap.filename
        local l_new_filename = g_path + l_texturefilename
        if (getfiles l_new_filename).count == 0 then    --not exist
          if (copyFile l_old_filename l_new_filename) == false then    --error copy
            format "Error:  Can`t copy texture!  %\n" l_old_filename
        )
    )
  local l_ambient    = l_ambient /255
  local l_diffuse    = l_diffuse /255
  local l_specular  = l_specular /255
  local l_emission  = l_emission /255
 
  format (a_prefix + "<attributes>\n")                                            to:g_file
  format (a_prefix + "  <enum name=\"Type\" value=\"solid\" />\n")                              to:g_file
  format (a_prefix + "  <colorf name=\"Ambient\" value=\"% % % %\" />\n")  l_ambient.r l_ambient.g l_ambient.b l_ambient.a  to:g_file
  format (a_prefix + "  <colorf name=\"Diffuse\" value=\"% % % %\" />\n")  l_diffuse.r l_diffuse.g l_diffuse.b l_diffuse.a  to:g_file
  format (a_prefix + "  <colorf name=\"Emissive\" value=\"% % % %\" />\n") l_emission.r l_emission.g l_emission.b l_emission.a  to:g_file
  format (a_prefix + "  <colorf name=\"Specular\" value=\"% % % %\" />\n")  l_specular.r l_specular.g l_specular.b l_specular.a  to:g_file
  format (a_prefix + "  <float name=\"Shininess\" value=\"%\" />\n")  l_shine                        to:g_file
  format (a_prefix + "  <float name=\"Param1\" value=\"0.000000\" />\n")                          to:g_file
  format (a_prefix + "  <float name=\"Param2\" value=\"0.000000\" />\n")                          to:g_file
  format (a_prefix + "  <texture name=\"Texture1\" value=\"%\" />\n") l_texturefilename                    to:g_file
  format (a_prefix + "  <texture name=\"Texture2\" value=\"\" />\n")                            to:g_file
  format (a_prefix + "  <texture name=\"Texture3\" value=\"\" />\n")                            to:g_file
  format (a_prefix + "  <texture name=\"Texture4\" value=\"\" />\n")                            to:g_file
  format (a_prefix + "  <bool name=\"Wireframe\" value=\"false\" />\n")                            to:g_file
  format (a_prefix + "  <bool name=\"GouraudShading\" value=\"true\" />\n")                          to:g_file
  format (a_prefix + "  <bool name=\"Lighting\" value=\"false\" />\n")                            to:g_file
  format (a_prefix + "  <bool name=\"ZWriteEnable\" value=\"true\" />\n")                          to:g_file
  format (a_prefix + "  <int name=\"ZBuffer\" value=\"1\" />\n")                              to:g_file
  format (a_prefix + "  <bool name=\"BackfaceCulling\" value=\"true\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"FogEnable\" value=\"false\" />\n")                            to:g_file
  format (a_prefix + "  <bool name=\"NormalizeNormals\" value=\"false\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"BilinearFilter1\" value=\"true\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"BilinearFilter2\" value=\"true\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"BilinearFilter3\" value=\"true\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"BilinearFilter4\" value=\"true\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"TrilinearFilter1\" value=\"false\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"TrilinearFilter2\" value=\"false\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"TrilinearFilter3\" value=\"false\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"TrilinearFilter4\" value=\"false\" />\n")                        to:g_file
  format (a_prefix + "  <bool name=\"AnisotropicFilter1\" value=\"false\" />\n")                      to:g_file
  format (a_prefix + "  <bool name=\"AnisotropicFilter2\" value=\"false\" />\n")                      to:g_file
  format (a_prefix + "  <bool name=\"AnisotropicFilter3\" value=\"false\" />\n")                      to:g_file
  format (a_prefix + "  <bool name=\"AnisotropicFilter4\" value=\"false\" />\n")                      to:g_file
  format (a_prefix + "  <enum name=\"TextureWrap1\" value=\"texture_clamp_repeat\" />\n")                  to:g_file
  format (a_prefix + "  <enum name=\"TextureWrap2\" value=\"texture_clamp_repeat\" />\n")                  to:g_file
  format (a_prefix + "  <enum name=\"TextureWrap3\" value=\"texture_clamp_repeat\" />\n")                  to:g_file
  format (a_prefix + "  <enum name=\"TextureWrap4\" value=\"texture_clamp_repeat\" />\n")                  to:g_file
  format (a_prefix + "</attributes>\n")                                            to:g_file
  )

#26
13:22, 29 июня 2009

function IrrExportMesh a_obj a_prefix =
  (
  format (a_prefix + "<node type=\"mesh\">\n")                          to:g_file
  format (a_prefix + "  <attributes>\n")                            to:g_file
 
  IrrFormatNode a_obj (a_prefix + "\t\t")
 
  format (a_prefix + "    <string name=\"Mesh\" value=\"%%.3ds\" />\n") g_meshdir a_obj.name  to:g_file
  format (a_prefix + "    <bool name=\"ReadOnlyMaterials\" value=\"false\" />\n")        to:g_file
  format (a_prefix + "  </attributes>\n")                            to:g_file
 
  IrrExportMaterials a_obj (a_prefix + "\t")
  IrrExportChild a_obj (a_prefix + "\t")
 
  format (a_prefix + "</node>\n")    to:g_file
 
  select( a_obj )
  local l_transform = a_obj.transform
  a_obj.transform = matrix3 1
  exportFile (g_path + g_meshdir + a_obj.name + ".3ds") #noPrompt selectedOnly: true
  a_obj.transform = l_transform
  )

function IrrExportPartSys a_obj a_prefix =
  (
  local l_speed = (a_obj.dir * (-a_obj.speed)) / 100
  swap l_speed.y l_speed.z
  local l_lifetime = (a_obj.lifetime.frame / frameRate) * 3000 --msec
  local l_part_per_sec = a_obj.viewportcount / (l_lifetime/1000)
  format (a_prefix + "<node type=\"particleSystem\">\n")  to:g_file
  format (a_prefix + "  <attributes>\n")        to:g_file
 
  IrrFormatNode a_obj (a_prefix + "\t\t")
 
  format (a_prefix + "    <bool name=\"GlobalParticles\" value=\"false\" />\n")              to:g_file
  format (a_prefix + "    <float name=\"ParticleWidth\" value=\"%\" />\n")    (particleSize a_obj)    to:g_file
  format (a_prefix + "    <float name=\"ParticleHeight\" value=\"%\" />\n")    (particleSize a_obj)    to:g_file
  format (a_prefix + "    <enum name=\"Emitter\" value=\"Box\" />\n")                    to:g_file
  format (a_prefix + "    <vector3d name=\"Box\" value=\"0.000000, 0.000000, 0.000000\" />\n")      to:g_file
  format (a_prefix + "    <vector3d name=\"Direction\" value=\"%, %, %\" />\n")  l_speed.x l_speed.y l_speed.z  to:g_file
  format (a_prefix + "    <int name=\"MinParticlesPerSecond\" value=\"%\" />\n")  l_part_per_sec      to:g_file
  format (a_prefix + "    <int name=\"MaxParticlesPerSecond\" value=\"%\" />\n")  l_part_per_sec      to:g_file
  format (a_prefix + "    <color name=\"MinStartColor\" value=\"ffffffff\" />\n")              to:g_file
  format (a_prefix + "    <color name=\"MaxStartColor\" value=\"ffffffff\" />\n")              to:g_file
  format (a_prefix + "    <int name=\"MinLifeTime\" value=\"%\" />\n")      l_lifetime        to:g_file
  format (a_prefix + "    <int name=\"MaxLifeTime\" value=\"%\" />\n")      l_lifetime        to:g_file
  format (a_prefix + "    <int name=\"MaxAngleDegrees\" value=\"%\" />\n")    a_obj.variation      to:g_file
  format (a_prefix + "    <enum name=\"Affector\" value=\"Gravity\" />\n")                to:g_file
  format (a_prefix + "    <vector3d name=\"Gravity\" value=\"0.000000, -0.100000, 0.000000\" />\n")    to:g_file
  format (a_prefix + "    <float name=\"TimeForceLost\" value=\"%\" />\n")    l_lifetime        to:g_file
  format (a_prefix + "  </attributes>\n")        to:g_file
 
  IrrExportMaterials a_obj (a_prefix + "\t")
  IrrExportChild a_obj (a_prefix + "\t")
 
  format (a_prefix + "</node>\n")    to:g_file
  )

function IrrExportCamera a_obj a_prefix =
  (
  local l_target
  local l_up = [0,1,0] * (a_obj.transform.rotationpart as matrix3)
  if a_obj.target != undefined then
    (
    l_target = a_obj.target.position
    )
  else
    (
    l_target = [0,0,-1] * (a_obj.transform.rotationpart as matrix3)
    l_target += a_obj.position
    )
 
  a_obj.fovType = 2
 
  format (a_prefix + "<node type=\"camera\">\n")  to:g_file
  format (a_prefix + "  <attributes>\n")    to:g_file
 
  IrrFormatNode a_obj (a_prefix + "\t\t")
 
  format (a_prefix + "    <vector3d name=\"Target\" value=\"%, %, %\" />\n")    l_target.x l_target.z l_target.y    to:g_file
  format (a_prefix + "    <vector3d name=\"UpVector\" value=\"%, %, %\" />\n")  l_up.x l_up.z l_up.y    to:g_file
  format (a_prefix + "    <float name=\"Fovy\" value=\"%\" />\n")        (a_obj.curFOV / 180 * 3.14)  to:g_file
  format (a_prefix + "    <float name=\"Aspect\" value=\"1.250000\" />\n")                to:g_file
  format (a_prefix + "    <float name=\"ZNear\" value=\"1.000000\" />\n")                  to:g_file
  format (a_prefix + "    <float name=\"ZFar\" value=\"3000.000000\" />\n")                to:g_file
  format (a_prefix + "  </attributes>\n")                                  to:g_file
 
  IrrExportChild a_obj (a_prefix + "\t")
 
  format (a_prefix + "</node>\n")    to:g_file
  )

function IrrExportNode a_obj a_prefix =
  (
  case (classOf a_obj) of
    (
    Dummy :        IrrExportDummy a_obj a_prefix
    Light :        IrrExportLight a_obj a_prefix
    Box :        IrrExportBox a_obj a_prefix
    Sphere :      IrrExportSphere a_obj a_prefix
    Geosphere :      IrrExportSphere a_obj a_prefix
    Editable_Mesh :    IrrExportMesh a_obj a_prefix
    Snow :        IrrExportPartSys a_obj a_prefix
    default :
      case(superClassOf a_obj) of
        (
        Light :    IrrExportLight a_obj a_prefix
        camera :  IrrExportCamera a_obj a_prefix
        default :  format "Unknown Node! name: %, type: % \n" a_obj.name (ClassOf a_obj)
        )         
    )
  )

function IrrExportScene =
  (
  clearListener()
 
  g_filename = getSaveFileName  filename:((getFilenameFile maxFileName) + ".irr")  types:"Irrlicht scene(*.irr)|*.irr|"  caption:"Select filename and folder to export scene"
 
  if g_filename == undefined then
    (
    messageBox "Error:  You must select file!\n"
    return false
    )
  else
    (
    g_path = getFilenamePath g_filename
    g_file = createFile g_filename
    if g_file == undefined then
      (
      messageBox "Error:  Cunt create output file!\n"
      return false
      )
    )
 
  local l_time = timeStamp()
 
  makeDir (g_path + g_meshdir)
  makeDir (g_path + g_texturedir)
 
  format "<?xml version=\"1.0\"\?>\n"                                    to:g_file
  format "<irr_scene>\n"                                          to:g_file
  format "  <attributes>\n"                                        to:g_file
  format "    <string name=\"Name\" value=\"%\" />\n"  (getFilenameFile maxFileName)          to:g_file
  format "    <int name=\"Id\" value=\"1\" />\n"                            to:g_file
  format "    <colorf name=\"AmbientLight\" value=\"0.000000, 0.000000, 0.000000, 0.000000\" />\n"  to:g_file
  format "  </attributes>\n"                                      to:g_file
 
  if g_path != undefined then
    for obj in objects  do
      if obj.parent == undefined then
        (
        set coordsys world
        IrrExportNode obj "\t"
        )
  format "</irr_scene>\n"    to:g_file
  close g_file
 
  local l_text = stringStream ""
  format "Time elapsed: %sec\n" ((timeStamp() - l_time)as Float/1000) to:l_text
 
  messageBox (l_text as string)
  )

rollout IrrExporter "Irrlicht Exporter" width:250 height:160
  (
  button m_bn_export "Export" pos:[140,100] width:100 height:50
  button m_bn_cancel "Cancel" pos:[10,100] width:100 height:50
  edittext m_edt_meshdir "mash dir" pos:[10,10] width:230 height:20 text:"meshes\\"
  edittext m_edt_texturedir "texture dir" pos:[10,40] width:230 height:20 text:"textures\\"
 
  on m_bn_cancel pressed do
    (
    DestroyDialog( IrrExporter )
    )
  on m_edt_meshdir entered text do
    (
    if text.count > 0 then
      if text[text.count] != "\\" then
        m_edt_meshdir.text = text + "\\"
    )
  on m_edt_texturedir entered text do
    (
    if text.count > 0 then
      if text[text.count] != "\\" then
        m_edt_texturedir.text = text + "\\"
    )
  on m_bn_export pressed do
    (
    clearListener()
    g_meshdir = m_edt_meshdir.text
    g_texturedir = m_edt_texturedir.text
    IrrExportScene()
    )
  )
CreateDialog IrrExporter

Прошло более 5 лет
#27
18:27, 14 фев. 2015

Ребята, к сожалению похоже создатель больше не сидит на геймдеве, и мне очень нужны исходники этого экспортера, так как вышепредставленные не работают.

Страницы: 1 2
IrrlichtФорум

Тема в архиве.