进入maya C++ API插件开发。我只是想创建一个插件,当插件作为hello world插件运行时,它会生成单位大小为1的多维数据集。如何在maya API中创建多边形C++
我该怎么做?似乎缺乏关于如何做简单事情的教程。我已经看过Maya API C++示例,但是没有关于这些示例所做的描述,我可以看到。
进入maya C++ API插件开发。我只是想创建一个插件,当插件作为hello world插件运行时,它会生成单位大小为1的多维数据集。如何在maya API中创建多边形C++
我该怎么做?似乎缺乏关于如何做简单事情的教程。我已经看过Maya API C++示例,但是没有关于这些示例所做的描述,我可以看到。
我已经使用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插入的顺序来定义每个面的正常方向。
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,该过程也几乎相同,除了您还需要调用方法assignUV
实际将UV应用于多边形。
警告
这个过程只创建网格,和其他任何东西。
这意味着当您执行此代码时,视口中的网格将为绿色,这意味着没有着色器被分配给网格。
与完整的例子 https://gist.github.com/andrearastelli/fb297e6cac8cb745e90c273e7ff53a1d
一个片段