
MAXScript脚本用于建筑可视化
3dMax脚本用于建筑可视化。
MAXScript脚本用于建筑可视化
MAXScript是Autodesk 3ds Max的内置脚本语言。它允许用户通过自定义和自动化扩展3ds Max的功能,以满足其特定需求。对如何使用MAXScript的扎实理解在建筑可视化和室内设计渲染中非常有价值。尽管这是一个实质性的话题。在本文中,我们将介绍入门的简单步骤,然后介绍一些用于架构可视化工作的实用脚本示例。
开始!
虽然您可以在3ds Max内部编写MAXScript,但我们不建议您这样做。我们的第一个技巧是安装一个更适合编写代码的程序。对于MAXScript,我们建议使用Sublime Text。它是一个轻量级程序,看起来很棒,并提供了大量有用的脚本功能。这些功能中最有用的是能够选择一个单词的多个实例并同时编辑它们。
安装Sublime Text后,您将需要安装包控件。您可以通过按ctrl+shift+p、键入“安装包控制”并按enter来完成此操作。包控件允许您通过使用包扩展Sublime Text的功能。按与之前相同的快捷方式,键入“安装”并选择“包控制:安装包”。从这里,您可以访问许多有用的软件包。我们最重要的软件包是“Send to 3ds Max”。它为我们提供了语法高亮显示,以及将MAXScript发送到3ds Max实例的能力。我们还建议安装并激活“Material Theme”包。这让眼睛看起来更容易。
现在我们可以通过编写一些代码来测试它。首先在Sublime中创建一个新文件并保存。你可以随意称呼它,但一定要给它分机“.ms”。这告诉Sublime我们正在使用MAXScript。现在输入Box()并按ctrl+e将文件发送到3ds Max。瞧!一个简单的立方体。
作为使用ctrl+e发送整个文件的替代方案。我们还可以发送MAXScript的较小部分。为此,突出显示要执行的脚本部分并按shift+enter。这对于测试较大脚本的部分非常有用。
下一步
现在我们已经开始工作了,让我们尝试一些其他命令:
-- deletes all helpers in the scene
delete helpers
-- Prepend "Light_" to the names of all lights
for light_obj in lights do
(
light_obj.name = "Light_" + light_obj.name
)
-- Create boxes with random dimensions, wire colour and position ten times
for i = 1 to 10 do
(
box_obj = box length:(random 0 10) width:(random 0 10) height:(random 0 10)
box_obj.wirecolor = color (random 0 255) (random 0 255) (random 0 255)
box_obj.position = random [-20,-20,-20] [20,20,20]
)
随着您继续使用MAXScript,您将发现越来越多有用的命令。您可以在MAXScript文档中阅读所有这些。但坦率地说,这是相当压倒性的。一个更好的起点是这个备忘单。对于初学者来说,帮助理解脚本的潜力非常有用。
还值得一提的是MAXScript监听器宏记录器。尽管它还远远不够完美,而且通常不会输出任何内容。宏记录器是实现过程自动化或执行单个命令的一个很好的起点。要使用它,请使用f11打开MAXScript监听器,或从“脚本”菜单中选择它,然后单击宏记录器->启用。现在,在3ds Max中执行的操作将作为MAXScript渲染到MAXScript侦听器。这有助于更好地理解3ds Max操作背后的代码
实例:
现在,我们已经介绍了基本知识。让我们看看MAXScript如何通过分析我们在生产工作流程中使用的工具来帮助我们实现架构可视化。我们将详细了解以下脚本:
-设置渲染过程
-快速HDRI加载器
-批量渲染所有场景摄影机
-从纹理贴图创建PBR材质
-渲染整个材质库的预览
设置渲染过程
一个相对简单的脚本。这是我们在大多数可视化项目中使用的。它遍历并设置渲染元素,以包括所有基本过程。这看起来似乎只是节省了一小部分时间,但每次使用都会倍增。
-- Create an array filled with each render element
render_elements_list = #(CESSENTIAL_Direct, CESSENTIAL_Reflect, CMasking_ID)
-- Get the current render element manager and remove all elements
render_element_manager = maxOps.GetCurRenderElementMgr()
render_element_manager.removeAllRenderElements()
-- Add all render elements to the manager
for render_element in render_elements_list do
(
render_element_manager.addRenderElement (render_element elementname:(render_element as string))
)
-- Create an AO texture, add a Texmap render element and assign the texture
ao_texture = CoronaAO()
render_element_manager.addRenderElement (CTexmap elementname:"CTexmap_AO" Texmap:ao_texture)
正如您在不到十行代码中所看到的,我们有一个工作脚本来设置渲染过程。可以通过修改第二行中的阵列来增加更多或更少的元素。
以“--”开头的行是注释。3ds max将忽略注释,仅包含注释以帮助我们理解脚本
快速HDRI加载器
现在让我们来看看更复杂的事情。这个方便的工具允许我们在任意数量的HDRI之间快速切换。同时能够调整伽马、曝光和旋转设置。它在项目的早期阶段特别有用。将其与交互式渲染相结合,可以让我们快速测试不同的想法。
-- Get the HDRI files
HDRIs = getFiles "path_to_your_HDRI_files_goes_here\*.hdr"
-- Set up an empty array, filter the HDRI paths to get their names and add them to the array
HDRI_names = #()
for HDRI_map in HDRIs do (append HDRI_names (filenameFromPath HDRI_map))
-- Set up UI Elements and state their functionality
rollout hdri_loader_ui "Quick HDR Loader"
(
dropdownlist hdri_dropdown "HDRIs" items:HDRI_names
group "Settings" (
label HDR_settings_header "HDRI:" width:220
spinner rotation_spinner "Rotation:" range:[-360,360,0]
spinner gamma_spinner "Gamma:" range:[0,5,1] scale: 0.01
spinner exposure_spinner "Exposure:" range:[-20,20,0] scale: 0.01
)
label current_HDRI_Header "Current HDRI:" offset:[0,10] width:240
label current_HDRI "" width:240
-- Set up environment slot and assigns the given HDRI
function create_hdri HDRI_map =
(
if environmentMap == undefined do (
setUseEnvironmentMap true
environmentMap = CoronaColorCorrect()
environmentMap.inputTexmap = CoronaBitmap()
)
environmentMap.inputTexmap.filename = HDRI_map
hdri_loader_ui.current_HDRI.text = filenameFromPath HDRI_map
)
on hdri_dropdown selected i do create_hdri HDRIs[i]
on rotation_spinner changed i do environmentMap.inputTexmap.uvwOffset = [i/360,0,0]
on gamma_spinner changed i do environmentMap.gamma = i
on exposure_spinner changed i do environmentMap.exposure = i
)
-- Create the UI
createDialog hdri_loader_ui 260 220
如您所见,该脚本引入了函数和一些基本UI(用户界面)元素,以帮助我们与之交互。如果您不熟悉编写脚本,这可能看起来有点令人生畏。但是如果你分解它,命令仍然非常简单。请随意复制此代码并在之前给出(如果您使用的是3ds Max和Corona渲染器)。您唯一需要更改的部分是第二行,这样它将链接到您的满是HDRI的文件夹。它应该读取您的“your_hdri_path\*hdr”。星号是一个通配符。在这种情况下,它会告诉3ds Max选择文件夹中扩展名为.hdr的任何内容。
以下是简单UI的截图:
要使用它,只需从下拉菜单中选择一个HDRI,它将通过环境地图加载到场景中。从这里,您可以调整HDRIs的各种设置或选择不同的设置。
下面是一些使用中的快速示例:
批量渲染所有场景摄影机
对于具有大量摄影机的场景,此脚本可以节省大量时间。它获取场景中的每个摄影机,将它们添加到批渲染队列,并为视图提供适当的名称。在项目的早期阶段,我们经常使用这个脚本,因为它允许我们快速渲染我们想要测试的许多不同相机角度和构图的预览。
-- Clear batch render queue
for i = 1 to batchrendermgr.numviews do batchrendermgr.deleteview 1
-- Get all cameras in the scene ignoring target objects
scene_cameras = for cam in cameras where classof cam != targetobject collect cam
for camera in scene_cameras do
(
batchRender = batchRenderMgr.CreateView camera
batchRender.name = camera.name
fileName = getFilenameFile maxfilename
batchRender.outputFilename = "C:\\Output\\Path" + "\\" + fileName + "_" + camera.name + ".jpg"
)
-- If batch render window is open then close and open it to refresh the queue
batchRenderWindow = windows.getchildhwnd 0 "Batch Render"
if (batchRenderWindow) != undefined do
(
uiaccessor.closedialog batchRenderWindow[1]
actionMan.executeAction -43434444 "4096"
)
记住将第11行中的“C:\\Output\\Path”更新到渲染输出位置。
从纹理贴图创建PBR材质
3D艺术家和工作室通常在资源库中存储大量纹理贴图。这些纹理贴图用于创建材质,这些材质通常组织在材质库中,以便于访问和预览。从纹理贴图手动创建材质(特别是在大体积中)可能是一项重复且耗时的任务。这就是脚本的用武之地。
运行脚本时,它将要求您选择包含材质纹理贴图的文件夹。它基于第12-14行提供的通配符字符串搜索该文件夹中的漫反射、光泽和法线贴图-“*漫反射(diffuse)*”、“*光泽(gloss)*”和“*法线(normal)*”。然后将可用纹理贴图加载到新材质中,将反射级别设置为1,并为材质指定纹理文件夹的名称。
可能需要一些设置工作才能使此脚本顺利运行,但从长远来看,这将节省时间和精力。我们认为,将纹理组织到单个材质文件夹中并使用一致的命名约定是一种良好的做法。
function createMaterial material_path =
(
-- Get folder name and assign to material_name
split_path = filterString material_path "\\ "
material_name = split_path[split_path.count]
-- Create material, name it and assign it to slot 1 in the material editor
mat = CoronaMtl ()
mat.name = material_name
meditMaterials[1] = mat
diffuse_path = material_path + "\\" + "*diffuse*"
gloss_path = material_path + "\\" + "*gloss*"
normal_path = material_path + "\\" + "*normal*"
diffuse_map = getFiles diffuse_path
gloss_map = getFiles gloss_path
normal_map = getFiles normal_path
if diffuse_map[1] != undefined do (
mat.texmapDiffuse = CoronaBitmap fileName:diffuse_map[1]
)
mat.levelReflect = 1
if gloss_map[1] != undefined do (
mat.texmapReflectGlossiness = CoronaBitmap fileName:gloss_map[1]
)
if normal_map[1] != undefined do (
mat.texmapBump = CoronaNormal ()
mat.texmapBump.normalMap = CoronaBitmap fileName:normal_map[1]
mat.texmapBump.normalMap.gamma = 1
)
)
material_path = getSavepath caption:"Select Material Directory" initialDir: "C:\\Library\\Textures\\"
if (material_path != undefined) do (
createMaterial material_path
)
请记住将值“C:\\Library\\Textures\\”更新到纹理库的位置。这将允许您更快地选择纹理文件夹。
此MAXScript设置为与Corona渲染器一起使用,但经过一些基本调整后,它将与Vray或其他3ds Max渲染器一起工作。在生产环境中可能有用的其他自定义包括:允许输入多个文件夹并保存生成的材料库,或者根据文件夹的位置使用不同的通配符字符串。
渲染整个材质库的预览
“材质编辑器”生成的缩略图足以在大多数时间预览材质。但是,在使用大型自定义材质库时,创建自己的渲染预览可能是有益的。这使您可以完全控制预览场景,并更准确地表示渲染材质的外观。
此MAXScript的工作方式是加载选定的材质库(.mat)并循环浏览材质,为每个材质渲染预览。我们主要在着色器球场景中使用此脚本,但它可以在任何场景中使用,只需将$ShaderBall更新为要切换材质的对象的名称即可。值得注意的是,脚本不会更改任何渲染设置,因此在运行脚本之前,请确保这些设置正确。您还需要设置过程或时间限制,否则3ds Max将不知道何时停止渲染并移动到下一个材质。
将其与上一个材质生成脚本相结合可以非常有效。它们一起可以创建大量的材质,并以最小的手动交互将其渲染出来。
function renderMaterials material_library =
(
-- load the selected material library and loop through each material
loadMaterialLibrary material_library
for mat in currentMaterialLibrary do
(
-- If material is a Corona material apply to shader ball and render
if classof mat == CoronaMtl or classof mat == CoronaLayeredMtl do
(
$ShaderBall.material = mat
save_file = "C:\\Output\\Path\\" + mat.name + "_Preview.jpg"
render outputfile: save_file
)
)
)
-- Creates window to select material library
material_library = getOpenFileName caption:"Select Material Library" types: ".mat"
-- If material library exists run renderMaterials function
if (material_library != undefined) do (renderMaterials material_library)
请记住分别将$ShaderBall和“C:\\Output\\Path\\”更新到选定对象和渲染输出位置。
以下是使用此脚本和着色器球场景生成的一些预览渲染。
宏脚本
我们喜欢使用Sublime文本开发MAXScript的工作流程。然而,每次您想运行脚本时打开它会很快变得令人厌烦。您可以简单地将.ms文件直接拖放到3ds Max中。但是,设置您经常使用的脚本的最佳方法是使用宏脚本。它们看起来像这样:
macroScript scriptName category:"CategoryName" (
your code goes here...
)
通过将代码包装在宏脚本中并运行,3ds Max可以通过“自定义->自定义用户界面”菜单(使用您在代码中定义的CategoryName和scriptName)访问脚本。这允许您为脚本创建工具栏按钮,将其添加到四元菜单,并将其分配给快捷方式。如果您要创建包含许多脚本的工具箱,这一点非常重要,因为它允许您有效地组织它们。
结论
这就差不多涵盖了这篇文章。我们希望这将为您提供MAXScript的总体概述,并深入了解它如何用于建筑可视化、室内设计渲染和3D动画。请随意复制上面包含的任何脚本,并将它们用于您自己的可视化工作。但请记住,MAXScript的强大之处在于能够生成适合您情况的自定义解决方案。我们鼓励您尝试不同的想法,并创建加快自己工作流程的工具,让您专注于创新。
教程译注:沐风老师
更多推荐
所有评论(0)