进入maya C ++ API插件开发。我只想创建一个插件,当插件作为一种hello world插件运行时,生成一个单元大小为1的立方体。
我该怎么做?似乎缺乏关于如何做简单事情的教程。我查看了Maya API C ++示例,但没有描述我可以看到的示例。
答案 0 :(得分:1)
我已经使用Python API 2.0创建了这个示例,因此您可以在脚本编辑器中执行它并使用它,然后再使用C ++ API,它并没有真正提供相同的灵活性。
import maya.cmds as mc
import maya.api.OpenMaya as OpenMaya
mesh = OpenMaya.MFnMesh()
# Simple unitCube coordinates
vertices = []
vertices.append(OpenMaya.MPoint(1, 1, 1)) # 0
vertices.append(OpenMaya.MPoint(1, -1, 1)) # 1
vertices.append(OpenMaya.MPoint(1, -1, -1)) # 2
vertices.append(OpenMaya.MPoint(1, 1, -1)) # 3
vertices.append(OpenMaya.MPoint(-1, -1, 1)) # 4
vertices.append(OpenMaya.MPoint(-1, 1, 1)) # 5
vertices.append(OpenMaya.MPoint(-1, 1, -1)) # 6
vertices.append(OpenMaya.MPoint(-1, -1, -1)) # 7
# Number of vertices per polygon
polygonCounts = []
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
# How each group of N vertices per polygon is connected.
#
# Because for each vertex I have specified the list index number, I can use the
# same number to uniquely identify each face of the polygon to actually build
# the connection between each vertex.
polygonConnects = []
# First polygon
polygonConnects.append(0)
polygonConnects.append(1)
polygonConnects.append(2)
polygonConnects.append(3)
# Second polygon
polygonConnects.append(0)
polygonConnects.append(5)
polygonConnects.append(4)
polygonConnects.append(1)
# Third polygon
polygonConnects.append(5)
polygonConnects.append(6)
polygonConnects.append(7)
polygonConnects.append(4)
# Fourth polygon
polygonConnects.append(6)
polygonConnects.append(3)
polygonConnects.append(2)
polygonConnects.append(7)
# Fifth polygon
polygonConnects.append(0)
polygonConnects.append(3)
polygonConnects.append(6)
polygonConnects.append(5)
# Sixth polygon
polygonConnects.append(1)
polygonConnects.append(4)
polygonConnects.append(7)
polygonConnects.append(2)
mesh.create(vertices, polygonCounts, polygonConnects)
在这个例子中:
MFnMesh 是处理网格及其操作的API类。
您可以在此处找到更完整的文档:
基本上,要生成自己的网格,您需要做三件事:
所以,在一个立方体中我们将:
6 * 4
元素的第三个数组,因为对于每个面,我们有4个顶点。第一个数组在单位立方体情况下非常简单且不言自明:
vertices = []
vertices.append(OpenMaya.MPoint(1, 1, 1)) # 0
vertices.append(OpenMaya.MPoint(1, -1, 1)) # 1
vertices.append(OpenMaya.MPoint(1, -1, -1)) # 2
vertices.append(OpenMaya.MPoint(1, 1, -1)) # 3
vertices.append(OpenMaya.MPoint(-1, -1, 1)) # 4
vertices.append(OpenMaya.MPoint(-1, 1, 1)) # 5
vertices.append(OpenMaya.MPoint(-1, 1, -1)) # 6
vertices.append(OpenMaya.MPoint(-1, -1, -1)) # 7
如你所见,我有8个顶点,每个顶点都有一个相对于原点的特定坐标。
第二个数组也很简单。
polygonCounts = []
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
polygonCounts.append(4)
这里我已经定义了我的立方体对于每个面都有4个顶点(因此由四边形组成)。
最后一个数组。
通过这个,您将不仅描述巫婆顶点需要用于绘制每个4面的面,还可以帮助您根据顶点ID的插入顺序定义每个面的法线方向。 / p>
polygonConnects = []
# First polygon
polygonConnects.append(0)
polygonConnects.append(1)
polygonConnects.append(2)
polygonConnects.append(3)
# Second polygon
polygonConnects.append(0)
polygonConnects.append(5)
polygonConnects.append(4)
polygonConnects.append(1)
# Third polygon
polygonConnects.append(5)
polygonConnects.append(6)
polygonConnects.append(7)
polygonConnects.append(4)
# Fourth polygon
polygonConnects.append(6)
polygonConnects.append(3)
polygonConnects.append(2)
polygonConnects.append(7)
# Fifth polygon
polygonConnects.append(0)
polygonConnects.append(3)
polygonConnects.append(6)
polygonConnects.append(5)
# Sixth polygon
polygonConnects.append(1)
polygonConnects.append(4)
polygonConnects.append(7)
polygonConnects.append(2)
所以,第一个面是用顶点构建的:[0, 1, 2, 3]
由于它们的位置,在空间中,这个顺序也定义了这个面的法线指向[1, 0, 0]
。
所有其他面孔都一样。
最后一行:
mesh.create(vertices, polygonCounts, polygonConnects)
只需告诉MFnMesh
对象创建一个具有给定属性的新网格。
在此示例中,我没有为此单位多维数据集构建UV,以避免为此示例添加复杂性。
因此,如果在选择了多维数据集的情况下打开UV编辑器,则不会显示UV。
这不是什么大问题,因为您可以按照自己喜欢的方式创建UV并打开多边形,但如果您想创建甚至UV,则该过程几乎相同,除了您还需要调用方法assignUV
将UV实际应用于多边形。
警告强>
此过程仅创建网格和其他任何内容。
这意味着当您执行此代码时,视口中的网格将为绿色,这意味着没有为网格指定着色器。
一个完整示例的代码段 https://gist.github.com/andrearastelli/fb297e6cac8cb745e90c273e7ff53a1d