如何在maya API C ++中创建多边形

时间:2017-02-16 23:02:49

标签: c++ api plugins graphics maya

进入maya C ++ API插件开发。我只想创建一个插件,当插件作为一种hello world插件运行时,生成一个单元大小为1的立方体。

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

1 个答案:

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

您可以在此处找到更完整的文档:

基本上,要生成自己的网格,您需要做三件事:

  1. 点数组(特别是MPoints)
  2. 每个面的顶点数数组
  3. 每个面的顶点id数组。
  4. 所以,在一个立方体中我们将:

    1. 第一个包含8个元素的数组(因为一个多维数据集有8个顶点 - 我没有考虑最终的细分)
    2. 第二个包含6个元素的数组(因为一个立方体有6个面)
    3. 带有6 * 4元素的第三个数组,因为对于每个面,我们有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