阿赵的MaxScript学习笔记分享九《可编辑多面体的操作》

文章介绍了如何使用MaxScript将3DsMax中的对象转换为可编辑多面体,并详细讲解了如何在不同编辑层级,尤其是顶点层级进行操作,包括获取和修改顶点坐标、设置顶点颜色,以及展示了polyop的一些常用方法。此外,还提到了显示顶点色的设置和清除顶点颜色的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MaxScript学习笔记目录
大家好,我是阿赵。这是MaxScript学习笔记分享的第九篇,可编辑多面体的操作。不知不觉写了这么多篇了,应该还有几篇就写完了。自己给自己加一下油。
在3DsMax里面如果需要建模,一般使用到的塌陷方式有3种,可编辑的网格、多面体和面片。
对于我自己来说,我觉得可编辑多面体(Editable Poly)是功能比较完善的一种类型,所以这里单独拿出来讲一下它的用法。

1、把物体转换成EditablePoly

在这里插入图片描述

使用converttopoly方法可以把指定的对象转换成可编辑多面体

2、选择不同的编辑层级

在这里插入图片描述

首先确保是在编辑界面上选择了想要改变编辑层级的对象,比如上面的例子,需要改变的对象是boxt1,所以是这样写:
modPanel.setCurrentObject boxt1.baseObject
然后通过subobjectLevel = 层级编号 来指定打开的层级
0:不选择
1:顶点层级
2:线段层级
3:边缘层级
4:面层级
5:多面体层级

3、顶点层级操作

1.获取顶点的数量

在这里插入图片描述

这里有两种办法可以获得顶点的数量
使用numverts属性,或者使用polyop.getnumverts的方法
需要注意的是,polyop提供的方法,都只能用在可编辑多边形上面,不然会报错
在这里插入图片描述

2.顶点坐标的获取和修改

在这里插入图片描述

通过(polyop.getvert 对象 序号)方法,可以获得对象身上某个序号的顶点的坐标
在这里插入图片描述

改变顶点坐标,有2种方法
第一种是通过(对象.EditablePoly.SetSelection #Vertex #{序号})的方法,先选中了某个点,然后通过(move 对象.selectedVerts [坐标])来移动
第二种办法是直接通过(polyop.setVert 对象 序号 [坐标])来直接设置某个顶点的坐标

3.设置顶点颜色

在这里插入图片描述

方法(polyop.setVertColor 对象 通道 顶点数组序号 颜色)可以改变顶点色
注意,这里的通道,具体是有0、-1、-2这三种,其中
0:顶点固有色
-1:顶点自发光颜色
-2:顶点颜色的alpha通道
顶点序号是一个数组,举个例子,如果我想把boxt1d所有顶点的固有色都改成红色,可以这样写:
polyop.setVertColor boxt1 0 #(1,2,3,4,5,6,7,8) (color 255 0 0)
还需要注意的地方是,3DsMax默认是不显示顶点色的,所以需要在物体属性里面勾选显示顶点色,并指定显示的通道
在这里插入图片描述
在这里插入图片描述

这个过程当然也可以用脚本设置
显示顶点色:
对象.showVertexColors = true
显示不同的通道:
对象.vertexColorType = 通道序号
需要注意的是,设置vertexColorType的通道序号,是刚才设置顶点色的通道乘以-1
0:VertexColor
1:VertexIllumination
2:VertexAlpha

我们常用的编写着色器过程,一般使用顶点色都是rgba的,所以我们需要指定固有色和Alpha这两个通道,这样,在游戏引擎写着色器时,获取VertexColor,就能得到0和-2两个通道组成的rgba值

如果想清除已经设置的顶点颜色,可以通过(channelInfo.ClearChannel 对象 通道)来操作
比如想清除boxt1的alpha通道颜色,可以channelInfo.ClearChannel boxt1 -2

4、polyop所有方法列表

上面详细介绍了顶点的相关操作,我个人觉得是比较常用的,其他的线段、边缘、面、多面体级别,就不一一介绍了,可以看看polyop的所有方法列表,通过单词的意思应该可以看懂具体方法的作用
freeVData:; Public,
setNumMapFaces:; Public,
meshSmoothByEdge:; Public,
collapseFaces:; Public,
meshSmoothByVert:; Public,
forceSubdivision:; Public,
getEdgesUsingFace:; Public,
getEdgeFlags:; Public,
setVertSelection:; Public,
getVDataValue:; Public,
setNumMapVerts:; Public,
collapseEdges:; Public,
getFaceSmoothGroup:; Public,
breakVerts:; Public,
attach:; Public,
getFacesUsingEdge:; Public,
setVertFlags:; Public,
setVDataChannelSupport:; Public,
setMapSupport:; Public,
weldEdges:; Public,
unHideAllFaces:; Public,
createVert:; Public,
getFaceArea:; Public,
getFacesUsingVert:; Public,
getVertsByFlag:; Public,
setNumVDataChannels:; Public,
setNumMaps:; Public,
createEdge:; Public,
setDiagonal:; Public,
autosmooth:; Public,
weldVertsByThreshold:; Public,
getSafeFaceCenter:; Public,
isVertDead:; Public,
setHiddenFaces:; Public,
resetEData:; Public,
setFaceColor:; Public,
setEdgeVis:; Public,
bevelFaces:; Public,
setFaceMatID:; Public,
moveVert:; Public,
getFaceDeg:; Public,
isFaceDead:; Public,
setHiddenVerts:; Public,
setEDataValue:; Public,
applyUVWMap:; Public,
createShape:; Public,
moveFacesToPlane:; Public,
retriangulate:; Public,
chamferVerts:; Public,
getVert:; Public,
getFaceVerts:; Public,
getDeadFaces:; Public,
getNumFaces:; Public,
getEDataChannelSupport:; Public,
getMapFace:; Public,
makeEdgesPlanar:; Public,
capHolesByFace:; Public,
makeVertsPlanar:; Public,
setSlicePlane:; Public,
getEdgeVerts:; Public,
getDeadVerts:; Public,
getNumVerts:; Public,
getNumEDataChannels:; Public,
getMapVert:; Public,
cutEdge:; Public,
detachFaces:; Public,
cutVert:; Public,
resetSlicePlane:; Public,
isMeshFilledIn:; Public,
getFaceFlags:; Public,
getFaceSelection:; Public,
resetVData:; Public,
getNumMapFaces:; Public,
tessellateByEdge:; Public,
meshSmoothByFace:; Public,
tessellateByVert:; Public,
propagateFlags:; Public,
getElementsUsingFace:; Public,
setEdgeFlags:; Public,
getEdgeSelection:; Public,
checkTriangulation:; Public,
setVDataValue:; Public,
getNumMapVerts:; Public,
splitEdges:; Public,
divideFace:; Public,
collapseVerts:; Public,
deleteIsoVerts:; Public,
getVertsUsingFace:; Public,
getEdgesByFlag:; Public,
getVertSelection:; Public,
getVDataChannelSupport:; Public,
getMapSupport:; Public,
divideEdge:; Public,
slice:; Public,
setFaceSmoothGroup:; Public,
unHideAllVerts:; Public,
collapseDeadStructs:; Public,
getVertsUsingEdge:; Public,
getVertFlags:; Public,
getNumVDataChannels:; Public,
getNumMaps:; Public,
weldEdgesByThreshold:; Public,
createPolygon:; Public,
weldVerts:; Public,
getFaceNormal:; Public,
getEdgesUsingVert:; Public,
getOpenEdges:; Public,
setVertColor:; Public,
chamferEdges:; Public,
deleteEdges:; Public,
deleteFaces:; Public,
deleteVerts:; Public,
getFaceCenter:; Public,
isEdgeDead:; Public,
getHiddenFaces:; Public,
freeEData:; Public,
getVertsByColor:; Public,
getEdgeVis:; Public,
extrudeFaces:; Public,
getFaceMatID:; Public,
setVert:; Public,
getFaceEdges:; Public,
getHasDeadStructs:; Public,
getHiddenVerts:; Public,
getEDataValue:; Public,
defaultMapFaces:; Public,
moveEdgesToPlane:; Public,
makeFacesPlanar:; Public,
flipNormals:; Public,
moveVertsToPlane:; Public,
inSlicePlaneMode:; Public,
getEdgeFaces:; Public,
getDeadEdges:; Public,
getNumEdges:; Public,
setEDataChannelSupport:; Public,
setMapFace:; Public,
capHolesByEdge:; Public,
cutFace:; Public,
capHolesByVert:; Public,
getSlicePlane:; Public,
getBorderFromEdge:; Public,
setFaceFlags:; Public,
setFaceSelection:; Public,
setNumEDataChannels:; Public,
setMapVert:; Public,
detachEdges:; Public,
tessellateByFace:; Public,
detachVerts:; Public,
fillInMesh:; Public,
getVertsUsedOnlyByFaces:; Public,
getFacesByFlag:; Public,
setEdgeSelection:; Public)

### Matlab 中多面体操作方法 MATLAB 是一款功能强大的工具,广泛应用于科学计算领域[^1]。然而,在 MATLAB 的标准库中并未直接提供针对多面体建模和操作的功能模块。对于多面体(Polyhedra)的研究通常涉及几何学、线性代数以及优化理论等内容。 #### 使用 MATLAB 进行多面体操作的方法概述 为了实现多面体的相关操作,可以通过以下几种方式: 1. **定义多面体的顶点集合或不等式约束** 多面体可以用两种主要形式表示: - H-representation (半空间表示法): 描述为一组线性不等式的交集 \( Ax \leq b \),其中 \( A \) 和 \( b \) 定义了多面体的边界条件。 - V-representation (顶点表示法): 表述为一系列顶点及其凸组合的形式。 可以通过 `lsqlin` 或者其他线性规划函数来求解这些不等式组中的可行区域。 2. **利用外部工具箱扩展功能** 如果需要更高级别的支持,则推荐安装第三方开发的专用工具包,比如: - Qhull 工具箱: 提供了高效的 Delaunay 三角剖分、Voronoi 图绘制等功能; - cdd/cddplus 库接口: 能够转换并分析高维空间内的多胞形结构; 3. **编写自定义脚本完成特定任务** 下面给出一段简单的例子展示如何创建一个多边形对象并通过旋转和平移变换改变它的位置姿态: ```matlab % 创建初始正方形作为基础形状 vertices = [ ... 0, 0;... 1, 0;... 1, 1;... 0, 1]; figure; patch(vertices(:,1), vertices(:,2),'r'); hold on; % 对图形应用仿射变换矩阵T=[R|t], R为旋转变换部分,t代表平移向量. theta=pi/4;%角度设为45度即π/4弧度制单位下数值 scaleFactor=sqrt(2)/2;%缩放因子使得新矩形面积保持不变 rotationMatrix=[cos(theta)*scaleFactor,-sin(theta)*scaleFactor; sin(theta)*scaleFactor cos(theta)*scaleFactor]; translationVector=[sqrt(2)-1 ; sqrt(2)+1]; %目标中心坐标减去原点得到位移矢量表达式 transformedVertices=(rotationMatrix*vertices')'+repmat(translationVector,[size(vertices,1),1]); plot(transformedVertices(:,1), transformedVertices(:,2),'b.'); axis equal tight; legend('Original Square','Transformed Polygon'); title('Affine Transformation Example Using Custom Code In MATLAB') ``` 上述代码片段展示了基本的二维平面内简单几何实体经过一次刚体运动后的变化情况演示过程。 关于调度算法方面提到的内容虽然不是直接关联到MATLAB本身特性上,但是它所提及的技术背景知识可能对你理解某些复杂场景下的自动化流程有所帮助[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值