type
Post
status
Published
date
May 6, 2025
slug
Moi3D
summary
今天要介绍的MOI3D,她是NURBS建模软件,适合创建曲面模型,非常适合于工业产品设计,它可以说是简化的RHINO,不具有动画和渲染功能。
tags
软件
category
3D渲染
password

三维软件一般都是由建模、渲染、动画等模块构成的。但也有一些软件,只具有专一功能,比如KEYSHOT专门用于渲染,没有建模功能。再比如SketchUp适用于硬边建模,建模简单而快速,广泛使用与室内外建筑设计,但她的曲面建模能力一般,必须依靠第三方插件来完成。再比如,今天要介绍的MOI3D,她是NURBS建模软件,适合创建曲面模型,非常适合于工业产品设计,它可以说是简化的RHINO,不具有动画和渲染功能。
MoI is also a fantastic complementary tool for a polygon-based artist since its CAD toolset and advanced boolean functions enable extremely rapid creation of mechanical or man-made type “hard surface” models. The icing on the cake is MoI’s unique polygon mesh export that generates exceptionally clean and crisp N-Gon polygon meshes from CAD NURBS models.
安装步骤:
- 安装moi_v4_beta.exe,拷贝moi_lib.dll到C:\Program Files\MoI 4.0 beta Jan-22-2020
提取密码:ed3q
直接下载
A
Alt+A =
ArrayDirCtrl+A =
script:moi.geometryDatabase.selectAll();Shift+A =
script:moi.view.resetAll();Shift+Alt+A =
ArrayCurveCtrl+Shift+A =
ArrayCircularB
B =
FilletAlt+B =
sBridgeC
C =
RebuildCtrl+C =
CopyClipboardCtrl+Alt+C =
ODCopyToExternalAlt+C =
script: moi.view.setCPlaneInteractive();Ctrl+Shift+C =
CopyClipboardWithOriginShift+Alt+C =
script: /* Align CPlane with 3D view 1.0 */ var cp = moi.view.getCPlane(), tp = moi.ui.mainWindow.viewpanel.getViewport('3D').targetFrame, tl = moi.VectorMath.pointsWithinTolerance; if (tl(cp.origin,tp.origin) && tl(cp.zaxis,tp.zaxis)) { moi.view.resetCPlane() } else {moi.view.setCPlane(tp, false)}Shift+C =
script: /* Toggle visibility of all curves */ var objs = moi.geometryDatabase.getObjects().getCurves(); var ishidden = objs.length > 0 ? objs.item(0).hidden : false; objs.setProperty( 'hidden', !ishidden );D
D =
DelCornersAlt+D =
DistributeCtrl+D =
script: /* Duplicate selected objects */ var gd = moi.geometryDatabase; var objs = gd.getSelectedObjects(); if ( objs.length ! = 0 ) gd.copyToClipboard( objs ); moi.command.execCommand( 'paste' );E
E =
RotateCtrl+E =
ExportCtrl+Shift+E =
_sScaleF
F =
ChamferAlt+F =
FlowG
G =
script: /* Toggle Grid Snap */ moi.drawingAids.gridSnap = !moi.drawingAids.gridSnap;Shift+G =
script: /* Toggle grid and axis lines */ moi.grid.display = !moi.grid.display; moi.grid.showXYAxes = moi.grid.display;H
H =
script: /* Hide selection */ moi.geometryDatabase.hide();Alt+H =
script: /* Toggle using hidden edge display for selected objects only */ moi.view.hiddenLinesSelectedOnly = !moi.view.hiddenLinesSelectedOnly;I
I =
script: /* Isolate selection */ moi.geometryDatabase.isolate();Alt+I =
script:moi.geometryDatabase.invertSelection(); /Invert/J
J =
JoinShift+J =
script: /* Show naked edges */ var gd = moi.geometryDatabase; gd.deselectAll(); var breps = gd.getObjects().getBreps(); for ( var i = 0; i < breps.length; ++i ) breps.item(i).getNakedEdges().setProperty( 'selected', true );L
L =
PolylineShift+L =
LoftAlt+L =
script: /* Select edges v1.4 */ var gd = moi.geometryDatabase, so = gd.getSelectedObjects(); function ss(o,v){o.setProperty("selected",v)} function sl(o){ for ( var i = 0; i<o.length; ++i ) o.item(i).getEdges().invertProperty("selected");} gd.selectLoop(); sl(so.getFaces()); sl(so.getSolids()); sl(so.getOpenBReps()); sl(so.getSingleFaceBReps()); ss(so.getBReps(),0); ss(so.getFaces(),0);Ctrl+Alt+L =
script: /* Loop selection */ moi.geometryDatabase.selectLoop();Ctrl+Shift+L =
script: /*! Show-hide edges on selected objects */var breps = moi.geometryDatabase.getSelectedObjects().getBreps(); for ( var i = 0; i < breps.length; ++i ) {var brep = breps.item(i);brep.getEdges().invertProperty( 'hidden');}Shift+Alt+L =
script: /* Highlight naked edges */ var gd = moi.geometryDatabase; gd.deselectAll(); var breps = gd.getObjects().getBreps(); for ( var i = 0; i < breps.length; ++i ) breps.item(i).getNakedEdges().setProperty( 'selected', true );M
M =
MirrorCtrl+M =
MergeAlt+M =
unwrapcurveN
Ctrl+N =
NewAlt+N =
orientO
O =
OffsetCtrl+O =
OpenP
P =
PlanarSrfQ
Alt+Q =
script:moi.ui.mainWindow.viewpanel.reverseView( moi.ui.getActiveViewport().name );R
R =
ScaleAlt+R =
Scale2dCtrl+Alt+R =
Scale1dCtrl+R =
RailRevolveCtrl+Shift+R =
RevolveShift+R =
ScaleIndividualS
S =
script: /* Scale, switch between center and regular */ var didcenter = false; try { didcenter = moi.command.getOption( 'scale_center' ); } catch(e){} if ( didcenter ) { moi.command.execCommand( 'Scale' ); } else { moi.command.execCommand( 'Scale BoundingBoxCenter' ); } moi.command.setOption( 'scale_center', !didcenter );Ctrl+Shift+S =
SaveAsCtrl+S =
SaveCtrl+Alt+S =
IncrementalSaveShift+S =
SweepT
T =
TrimCtrl+Shift+T =
_sSplitAlt+T =
script: /* Toggle both sides for offset or extrude */ if ( moi.command.currentCommandName ) { if ( moi.ui.commandUI.curvebothsides ) moi.ui.commandUI.curvebothsides.click(); if ( moi.ui.commandUI.bothsides ) moi.ui.commandUI.bothsides.click(); }Ctrl+T =
script: /* Toggle cap ends for offset or extrude */ if ( moi.command.currentCommandName ) { if ( moi.ui.commandUI.curvecapends ) moi.ui.commandUI.curvecapends.click(); if ( moi.ui.commandUI.capends ) moi.ui.commandUI.capends.click(); }U
U =
script:var gd = moi.geometryDatabase; gd.deselectAll(); var objects = gd.getObjects(); for ( var i = 0; i < objects.length; ++i ) { var obj = objects.item(i); if ( obj.name = = '' ) { obj.selected = true; } }V
Ctrl+V =
PasteCtrl+Alt+V =
ODPasteFromExternalCtrl+Shift+V =
PastePartW
Alt+W =
script:/* Wireframe v1.0 */ var gd = moi.geometryDatabase, so = gd.getSelectedObjects(); if (so.length>0) { so.setProperty( 'displayMode',1); so.setProperty( 'selected', 0); } else { gd.getObjects().setProperty( 'displayMode',0); }Shift+W =
move boundingboxcenterW =
script: /* Move, switch between center and regular */ var didcenter = false; try { didcenter = moi.command.getOption( 'move_center' ); } catch(e){} if ( didcenter ) { moi.command.execCommand( 'Move' ); } else { moi.command.execCommand( 'Move BoundingBoxCenter' ); } moi.command.setOption( 'move_center', !didcenter );X
X =
ExtrudeCtrl+Shift+X =
ExplodeMoveCtrl+X =
CutY
Ctrl+Y =
script:moi.command.redo();Z
Ctrl+Z =
script:moi.command.undo();Shift+Z =
script: /* Toggle edge display */ var breps = moi.geometryDatabase.getObjects().getBReps(); var hide = true; for ( var i = 0; i < breps.length; ++i ) { var edges = breps.item(i).getEdges(); if ( i = = 0 ) hide = !edges.item(0).hidden; edges.setProperty( 'hidden', hide ); }Ctrl+Shift+Z =
script:moi.command.redo();Numbers
5 =
script:/* Wireframe v1.0 */ var gd = moi.geometryDatabase, so = gd.getSelectedObjects(); if (so.length>0) { so.setProperty( 'displayMode',1); so.setProperty( 'selected', 0); } else { gd.getObjects().setProperty( 'displayMode',0); }Numpad
Numpad- =
BooleanDifferenceNumpad* =
BooleanUnionNumpad/ =
BooleanIntersectionNumpad+ =
BooleanMergeNumpad5 =
script: /* Toggle between Parallel and Perspective view */ var vp = moi.ui.mainWindow.viewpanel.getViewport('3D'); vp.projection = (vp.projection == 'Perspective' ? 'Parallel': 'Perspective');Numpad7 =
script: /* Top view */ var vname = 'Top'; var vp = moi.ui.mainWindow.viewpanel; vp.mode = vname; if ( vp.getViewport(vname).name != vname ) vp.reverseView( vname );Alt+Numpad1 =
script: /* Top view */ var vname = 'Top'; var vp = moi.ui.mainWindow.viewpanel; vp.mode = vname; if ( vp.getViewport(vname).name ! = vname ) vp.reverseView( vname );Alt+Numpad2 =
script: /* Front view */ var vname = 'Front'; var vp = moi.ui.mainWindow.viewpanel; vp.mode = vname; if ( vp.getViewport(vname).name ! = vname ) vp.reverseView( vname );Alt+Numpad3 =
script: /* Right view */ var vname = 'Right'; var vp = moi.ui.mainWindow.viewpanel; vp.mode = vname; if ( vp.getViewport(vname).name ! = vname ) vp.reverseView( vname );Ctrl+Numpad- =
script:/* Shrink selection 1.0 */ function es(edg){ var i,f; for (i = 0; i<edg.length; i++) {f = edg.item(i).getFacesOfEdge(); f.setProperty('selected',0);}} var gd = moi.geometryDatabase; gd.invertSelection(); var so = gd.getSelectedObjects(), sf = so.getFaces(), i; gd.invertSelection(); for ( i = 0; i<sf.length;i++) es(sf.item(i).getEdges());Ctrl+Numpad+ =
script:/* Expand selection 1.0 */ function es(edg){ var i,f; for (i = 0; i<edg.length; i++) {f = edg.item(i).getFacesOfEdge(); f.setProperty('selected',1);}} var so = moi.geometryDatabase.getSelectedObjects(), sf = so.getFaces(), i; for ( i = 0; i<sf.length;i++) es(sf.item(i).getEdges()); es(so.getEdges());Function
F1 =
script:moi.launchHelp();Alt+F1 =
script: moi.ui.createDialog( 'Options.htm', 'resizeable,defaultWidth:43em,defaultHeight:32em' );F2 =
script: /* Edit object name */ var pp = moi.ui.propertiesPanel; if (pp.show && pp.numSelectedObjects > 0) { pp.editName(); }F3 =
script:/* Object Library Dialog*/ moi.ui.createDialog( 'moi://appdata/customui/ObjLibrary.menu.htm' );F10 =
script: /* Untrim the selected surface */ var gd = moi.geometryDatabase; srfs = gd.getSelectedObjects().getSingleFaceBReps(); gd.deselectAll(); for ( var i = 0; i < srfs.length; ++i ) srfs.item(i).getEdges().setProperty( 'selected', true ); moi.command.execCommand( 'delete' );F11 =
script: /* Open Add New Style dialog */ var gd = moi.geometryDatabase; gd.styleEditorOpened(); var dialog = moi.ui.createDialog( 'EditStyleDialog.htm?titleid = Add style dialog title&index = -1', '', moi.ui.mainWindow ); if ( dialog.window.doModal() ! = -1 ) { var styles = gd.getObjectStyles(); if ( styles.length> 0 ) moi.ui.propertiesPanel.editStyleIndex( styles.length - 1 ); } gd.styleEditorClosed();F12 =
var p = moi.ui.getUIPanel( 'moi://ui/BrowserPane.htm' ); if ( p ) { var w = p.document.body.style.width; if ( w = = '' || w = = '15em' ) { w = '20em'; } else if ( w = = '20em' ) { w = '30em' } else { w = '15em' } p.document.body.style.width = w; }Punctuation
- =
script:/* Calculate length of selected curves and copy to the clipboard as text */ var crvs = moi.geometryDatabase.getSelectedObjects().getCurves(); var len = 0.0; for ( var i = 0; i < crvs.length; ++i ) len + = crvs.item(i).getLength(); moi.copyTextToClipboard( len );
`=
script: /* 3D view (perspective or isometric) */ moi.ui.mainWindow.viewpanel.mode = '3D';Alt+. =
ShowPointsCtrl+. =
AddPointBackspace =
DeleteDelete =
DeleteSpace =
script:if ( moi.ui.mainWindow.viewpanel.mode ! = 'split' ) { moi.ui.mainWindow.viewpanel.mode = 'split' } else { var viewport = moi.ui.getViewportUnderMouse(); if ( viewport ) viewport.viewpanel.mode = viewport.name; }Arrows
Alt+RightArrow =
script:moi.view.setCPlane( moi.vectorMath.createRightFrame() );Alt+UpArrow =
script:moi.view.resetCPlane();Alt+DownArrow =
script:moi.view.setCPlane( moi.vectorMath.createFrontFrame() );Alt+LeftArrow =
script: /* Align CPlane with 3D view 1.0 */ var cp = moi.view.getCPlane(), tp = moi.ui.mainWindow.viewpanel.getViewport('3D').targetFrame, tl = moi.VectorMath.pointsWithinTolerance; if (tl(cp.origin,tp.origin) && tl(cp.zaxis,tp.zaxis)) { moi.view.resetCPlane() } else {moi.view.setCPlane(tp, false)}DownArrow = Nudge Down
LeftArrow = Nudge Left
RightArrow = Nudge Right
UpArrow = Nudge Up
Shift+LeftArrow = Nudge Left Small
Shift+RightArrow = Nudge Right Small
Shift+UpArrow = Nudge Up Small
Shift+DownArrow = Nudge Down Small
PageDown = Nudge ZDown
PageUp = Nudge ZUP
Shift+PageUp = Nudge ZUp Small
Shift+PageDown = Nudge ZDown Small
MacBook
Ctr+Alt+D =
BooleanDifferenceCtr+Alt+U =
BooleanUnionCtr+Alt+I =
BooleanIntersection- 作者:WangWenzhi
- 链接:https://www.wwz.im/article/Moi3D
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。





