2017-02-16 37 views
0

进入maya C++ API插件开发。我只是想创建一个插件,当插件作为hello world插件运行时,它会生成单位大小为1的多维数据集。如何在maya API中创建多边形C++

我该怎么做?似乎缺乏关于如何做简单事情的教程。我已经看过Maya API C++示例,但是没有关于这些示例所做的描述,我可以看到。

回答

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类。

您可以在这里找到一个更完整的文档:

基本上,生成自己的网格,你需要三样东西:

  1. 数组点数(具体MPoints)
  2. 每个面的顶点数的数组
  3. 每个面的顶点数的数组。

所以,在一个立方体,我们将有:

  1. 第一阵列与8个元素(因为立方体有8个顶点 - 我没有考虑到最终的细分)
  2. 第二具有6个元素的阵列(因为一个立方体有6个面)
  3. 第三个数组与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

一个片段
相关问题